You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kie.apache.org by po...@apache.org on 2023/09/21 14:29:52 UTC

[incubator-kie-tools-temporary-rnd-do-not-use] branch KOGITO-8015-feature-preview created (now 90c94c2d80)

This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a change to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git


      at 90c94c2d80 NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1668)

This branch includes the following new commits:

     new 7dc1f828cb KOGITO-8147: Refactor the app bar and menu according to UX redesign (#1335)
     new db67ee42b8 KOGITO-8323: Refactor Settings according to UX redesign (#1404)
     new 0702883c2c KOGITO-8426:  Implement a quickstart guide component in the settings section (#1431)
     new 888e11c9f6 KOGITO-8149: Refactor Home (now Overview) according to UX redesign (#1449)
     new d15d841ac9 Merge remote-tracking branch 'kiegroup/main' into KOGITO-8015-feature-preview
     new c42d829ca7 Update lock file after sync
     new e0d6379b2a KOGITO-8628: Remove old settings modal (#1457)
     new 9bc804ea70 NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1461)
     new 720bb2a323 Merge remote-tracking branch 'kiegroup/main' into KOGITO-8015-feature-preview
     new 2a295dbd83 NO-ISSUE: merge main into KOGITO-8015-feature-preview  (#1490)
     new 1ffcadda88 NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1529)
     new 1abdf8072b KOGITO-8151: Refactor file listing according to UX redesign (#1463)
     new 414c4cbca7 NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1557)
     new feac1737f8 Merge remote-tracking branch 'upstream/main' into KOGITO-8015-feature-preview-2
     new 41be9e3883 NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1590)
     new 1ec2244016 KOGITO-8890: Refactor workspace files listing according to UX redesign (#1606)
     new e54a2a18cd Merge remote-tracking branch 'upstream/main' into KOGITO-8015-feature-preview
     new 8f4d575d76 Applied "KOGITO-9057: Remove Streams for Apache Kafka tab from Serverless Logic Web Tools" updates
     new 22d37d1fb1 NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1616)
     new 15fcd99b0b KOGITO-8153: Create an extensible Samples page (now Catalog) (#1635)
     new 67ce3c7568 KOGITO-8972: Refactor UX Minor fixes  (#1648)
     new 823500e4a2 Merge remote-tracking branch 'upstream/main' into KOGITO-8015-feature-preview
     new 62a67f8097 NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1653)
     new 9335ac9385 KOGITO-8966: Ability to completely erase stored data on browser (#1656)
     new 1e1e5ebb9a KOGITO-8475: Adapt existing integration tests with new UI (#1661)
     new 20b87604b1 Merge remote-tracking branch 'upstream/main' into KOGITO-8015-feature-preview
     new 90c94c2d80 NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1668)

The 27 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 14/27: Merge remote-tracking branch 'upstream/main' into KOGITO-8015-feature-preview-2

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit feac1737f8a435230865aba5a4711a49ebaf14ea
Merge: 414c4cbca7 fe0c0339f8
Author: fantonangeli <fa...@gmail.com>
AuthorDate: Thu Apr 27 12:15:38 2023 +0200

    Merge remote-tracking branch 'upstream/main' into KOGITO-8015-feature-preview-2

 .github/actions/setup-env/action.yml               |     6 +-
 .github/workflows/ci_build.yml                     |     4 +-
 .github/workflows/ci_check_code_formatting.yml     |     1 +
 .github/workflows/daily_dev_publish.yml            |    12 +-
 .github/workflows/publish_jitexecutor_native.yml   |    16 +-
 .github/workflows/release_build.yml                |   109 +-
 .github/workflows/release_dry_run.yml              |     2 +-
 .github/workflows/release_publish.yml              |     2 +-
 .github/workflows/staging_build.yml                |    38 -
 .gitignore                                         |     2 +
 .../uniforms-patternfly/src/schemas/json-schema.ts |     3 +-
 package.json                                       |     4 +-
 packages/boxed-expression-component/README.md      |     2 +-
 .../it-tests/cypress.config.ts                     |    28 -
 .../it-tests/cypress/plugins/index.js              |    25 -
 .../data_cell_focus.snap.png                       |   Bin 43437 -> 0 bytes
 .../header_cell_focus.snap.png                     |   Bin 43443 -> 0 bytes
 .../input_header_cell_focus.snap.png               |   Bin 42798 -> 0 bytes
 .../function_parameter_focus.snap.png              |   Bin 31810 -> 0 bytes
 .../list_expression.cy.ts/data_cell_focus.snap.png |   Bin 16670 -> 0 bytes
 .../data_cell_focus.snap.png                       |   Bin 23398 -> 0 bytes
 .../literal_expression.cy.ts/no_focus.snap.png     |   Bin 23367 -> 0 bytes
 .../data_cell_focus.snap.png                       |   Bin 38625 -> 0 bytes
 .../it-tests/e2e/context_expression.cy.ts          |   274 -
 .../it-tests/e2e/decision_table_expression.cy.ts   |   447 -
 .../it-tests/e2e/invocation_expression.cy.ts       |    54 -
 .../it-tests/e2e/list_expression.cy.ts             |    42 -
 .../it-tests/e2e/literal_expression.cy.ts          |    63 -
 .../it-tests/e2e/popover.cy.ts                     |   161 -
 .../it-tests/e2e/relation_expression.cy.ts         |   158 -
 .../it-tests/plugins/index.js                      |    20 -
 .../it-tests/support/commands.d.ts                 |    28 -
 .../it-tests/support/commands.ts                   |    71 -
 .../it-tests/support/e2e.ts                        |    20 -
 .../it-tests/tsconfig.json                         |     7 -
 packages/boxed-expression-component/package.json   |     3 +-
 .../showcase/defaultExpression.ts                  |   255 +
 .../boxed-expression-component/showcase/index.css  |     7 +-
 .../boxed-expression-component/showcase/index.tsx  |   136 +-
 .../showcase/static/index.html                     |     1 -
 .../showcase/webpack.config.js                     |     2 +-
 .../src/@types/react-table.ts                      |    46 +-
 packages/boxed-expression-component/src/api/Bee.ts |    50 +
 .../src/api/BeeGwtService.ts                       |    26 +
 .../boxed-expression-component/src/api/BeeTable.ts |   116 +
 .../src/api/BoxedExpressionEditor.ts               |    85 -
 .../src/api/BoxedExpressionEditorGWTService.ts     |    44 -
 .../src/api/BuiltinAggregation.ts                  |    23 -
 .../src/api/ContextEntry.ts                        |    83 -
 .../boxed-expression-component/src/api/DataType.ts |    29 -
 .../src/api/DataTypeProps.ts                       |    24 -
 .../src/api/DecisionTableRule.ts                   |    48 -
 .../src/api/DmnBuiltInDataType.ts                  |    29 +
 .../src/api/DmnDataType.ts                         |    24 +
 .../src/api/EnumUtils.ts                           |    23 -
 .../src/api/ExpressionDefinition.ts                |   309 +
 .../src/api/ExpressionDefinitionLogicType.ts       |    26 +
 .../src/api/ExpressionProps.ts                     |   139 -
 .../src/api/FunctionKind.ts                        |    67 -
 .../src/api/HitPolicy.ts                           |    25 -
 .../src/api/LogicType.ts                           |    27 -
 .../boxed-expression-component/src/api/Table.ts    |   164 -
 .../boxed-expression-component/src/api/index.ts    |    20 +-
 .../BoxedExpressionEditor.tsx                      |    93 -
 .../BoxedExpressionProvider.css                    |    94 -
 .../BoxedExpressionProvider.tsx                    |    67 -
 .../src/components/BoxedExpressionEditor/index.ts  |    18 -
 .../ContextExpression/ContextEntryExpression.tsx   |    67 -
 .../ContextEntryExpressionCell.css                 |    19 -
 .../ContextEntryExpressionCell.tsx                 |    57 -
 .../ContextExpression/ContextEntryInfo.css         |    37 -
 .../ContextExpression/ContextEntryInfo.tsx         |    83 -
 .../ContextExpression/ContextEntryInfoCell.tsx     |    71 -
 .../ContextExpression/ContextExpression.css        |    32 -
 .../ContextExpression/ContextExpression.tsx        |   301 -
 .../src/components/ContextExpression/index.ts      |    21 -
 .../DecisionTableExpression.css                    |   102 -
 .../DecisionTableExpression.tsx                    |   431 -
 .../DecisionTableExpression/HitPolicySelector.css  |    31 -
 .../DecisionTableExpression/HitPolicySelector.tsx  |   158 -
 .../EditExpressionMenu/DataTypeSelector.tsx        |   140 -
 .../EditExpressionMenu/EditExpressionMenu.tsx      |   216 -
 .../EditExpressionMenu/EditTextInline.tsx          |   113 -
 .../src/components/EditExpressionMenu/index.ts     |    19 -
 .../ExpressionContainer/ExpressionContainer.css    |    35 -
 .../ExpressionContainer/ExpressionContainer.tsx    |   102 -
 .../src/components/ExpressionContainer/index.ts    |    17 -
 .../FunctionExpression/EditParameters.css          |    65 -
 .../FunctionExpression/EditParameters.tsx          |   116 -
 .../FunctionExpression/FunctionExpression.css      |    49 -
 .../FunctionExpression/FunctionExpression.tsx      |   520 -
 .../FunctionExpression/FunctionKindSelector.tsx    |    74 -
 .../src/components/FunctionExpression/index.ts     |    19 -
 .../InvocationExpression/InvocationExpression.css  |    61 -
 .../InvocationExpression/InvocationExpression.tsx  |   273 -
 .../components/ListExpression/ListExpression.tsx   |   182 -
 .../LiteralExpression/LiteralExpression.css        |    74 -
 .../LiteralExpression/LiteralExpression.tsx        |   151 -
 .../LiteralExpression/PMMLLiteralExpression.css    |    26 -
 .../LiteralExpression/PMMLLiteralExpression.tsx    |    94 -
 .../src/components/LiteralExpression/index.ts      |    18 -
 .../LogicTypeSelector/LogicTypeSelector.css        |    42 -
 .../LogicTypeSelector/LogicTypeSelector.tsx        |   252 -
 .../src/components/LogicTypeSelector/index.ts      |    17 -
 .../src/components/PopoverMenu/PopoverMenu.css     |    45 -
 .../src/components/PopoverMenu/PopoverMenu.tsx     |   156 -
 .../RelationExpression/RelationExpression.css      |    19 -
 .../RelationExpression/RelationExpression.tsx      |   192 -
 .../src/components/Resizer/Resizer.css             |    37 -
 .../src/components/Resizer/Resizer.tsx             |   215 -
 .../src/components/Resizer/ResizerSupervisor.css   |    19 -
 .../src/components/Resizer/ResizerSupervisor.tsx   |    42 -
 .../src/components/Resizer/common/index.ts         |    55 -
 .../src/components/Resizer/dom/Cell.ts             |   186 -
 .../src/components/Resizer/dom/DOMSession.ts       |    65 -
 .../components/Resizer/dom/ResizerSupervisorDOM.ts |    74 -
 .../src/components/Resizer/dom/index.ts            |    19 -
 .../src/components/Resizer/index.ts                |    20 -
 .../components/SelectionBox/CellSelectionBox.css   |    25 -
 .../components/SelectionBox/CellSelectionBox.tsx   |   186 -
 .../src/components/SelectionBox/SelectionBox.css   |    27 -
 .../src/components/SelectionBox/SelectionBox.tsx   |   154 -
 .../src/components/SelectionBox/index.ts           |    18 -
 .../src/components/Table/EditableCell.css          |    72 -
 .../src/components/Table/EditableCell.tsx          |   277 -
 .../src/components/Table/ResizableHeaderCell.tsx   |   159 -
 .../src/components/Table/Table.css                 |   215 -
 .../src/components/Table/Table.tsx                 |   542 -
 .../src/components/Table/TableBody.tsx             |   191 -
 .../src/components/Table/TableHandler.tsx          |   305 -
 .../src/components/Table/TableHandlerMenu.css      |    23 -
 .../src/components/Table/TableHandlerMenu.tsx      |    69 -
 .../src/components/Table/TableHeader.tsx           |   297 -
 .../src/components/Table/TdAdditiveCell.tsx        |    71 -
 .../src/components/Table/TdCell.tsx                |    97 -
 .../src/components/Table/ThCell.tsx                |    70 -
 .../components/Table/common/CopyAndPasteUtils.ts   |   162 -
 .../src/components/Table/common/FocusUtils.ts      |   343 -
 .../components/Table/common/NavigationKeysUtils.ts |    70 -
 .../src/components/Table/common/TableUtils.ts      |   236 -
 .../src/components/Table/common/index.ts           |    20 -
 .../src/components/Table/index.ts                  |    22 -
 .../src/components/common/NavigationKeysUtils.ts   |    70 -
 .../src/components/common/index.ts                 |    17 -
 .../src/components/index.ts                        |    20 -
 .../src/context/BoxedExpressionGlobalContext.tsx   |    43 -
 .../src/context/index.ts                           |    17 -
 .../src/contextMenu/Hooks.ts                       |   134 +
 .../contextMenu/MenuWithHelp/MenuItemWithHelp.tsx  |    73 +
 .../src/contextMenu/MenuWithHelp/MenuWithHelp.css  |    36 +
 .../src/contextMenu/MenuWithHelp/index.ts          |    17 +
 .../src/contextMenu/PopoverMenu/PopoverMenu.css    |    44 +
 .../src/contextMenu/PopoverMenu/PopoverMenu.tsx    |   149 +
 .../PopoverMenu/index.ts                           |     0
 .../src/{hooks => contextMenu}/index.ts            |     0
 .../BoxedExpressionEditor.tsx                      |    82 +
 .../BoxedExpressionEditorContext.css               |    93 +
 .../BoxedExpressionEditorContext.tsx               |   131 +
 .../base-no-reset-wrapped.css                      |     0
 .../src/expressions/BoxedExpressionEditor/index.ts |    17 +
 .../ContextEntryExpressionCell.css                 |    15 +
 .../ContextEntryExpressionCell.tsx                 |    69 +
 .../ContextExpression/ContextEntryInfoCell.css     |    24 +
 .../ContextExpression/ContextEntryInfoCell.tsx     |   140 +
 .../ContextExpression/ContextExpression.css        |    35 +
 .../ContextExpression/ContextExpression.tsx        |   356 +
 .../ContextResultExpressionCell.tsx                |    38 +
 .../src/expressions/ContextExpression/index.ts     |    19 +
 .../DecisionTableExpression.css                    |    67 +
 .../DecisionTableExpression.tsx                    |   678 +
 .../DecisionTableExpression/HitPolicySelector.css  |    33 +
 .../DecisionTableExpression/HitPolicySelector.tsx  |   214 +
 .../DecisionTableExpression/index.ts               |     0
 .../DataTypeSelector.tsx                           |   146 +
 .../ExpressionDefinitionHeaderMenu.css}            |     0
 .../ExpressionDefinitionHeaderMenu.tsx             |   185 +
 .../InlineEditableTextInput.tsx                    |   101 +
 .../ExpressionDefinitionHeaderMenu/index.ts        |    19 +
 .../ExpressionContainer.tsx                        |    91 +
 .../ExpressionDefinitionLogicTypeSelector.css      |    74 +
 .../ExpressionDefinitionLogicTypeSelector.tsx      |   487 +
 .../ExpressionDefinitionLogicTypeSelector/index.ts |    17 +
 .../ExpressionDefinitionRoot.css                   |    34 +
 .../ExpressionDefinitionRoot.tsx                   |    53 +
 .../expressions/ExpressionDefinitionRoot/index.ts  |    17 +
 .../FunctionExpression/FeelFunctionExpression.tsx  |   211 +
 .../FunctionExpression/FunctionExpression.css      |    45 +
 .../FunctionExpression/FunctionExpression.tsx      |   150 +
 .../FunctionExpression/FunctionKindSelector.tsx    |   102 +
 .../FunctionExpression/JavaFunctionExpression.css  |    55 +
 .../FunctionExpression/JavaFunctionExpression.tsx  |   338 +
 .../FunctionExpression/ParametersPopover.css       |    72 +
 .../FunctionExpression/ParametersPopover.tsx       |   157 +
 .../FunctionExpression/PmmlFunctionExpression.css  |    49 +
 .../FunctionExpression/PmmlFunctionExpression.tsx  |   397 +
 .../src/expressions/FunctionExpression/index.ts    |    19 +
 .../ArgumentEntryExpressionCell.tsx                |    69 +
 .../InvocationExpression/InvocationExpression.css  |    26 +
 .../InvocationExpression/InvocationExpression.tsx  |   329 +
 .../InvocationExpression/index.ts                  |     0
 .../ListExpression/ListExpression.css              |     0
 .../expressions/ListExpression/ListExpression.tsx  |   208 +
 .../expressions/ListExpression/ListItemCell.tsx    |    38 +
 .../ListExpression/index.ts                        |     0
 .../LiteralExpression/LiteralExpression.css        |    69 +
 .../LiteralExpression/LiteralExpression.tsx        |   181 +
 .../src/expressions/LiteralExpression/index.ts     |    17 +
 .../RelationExpression/RelationExpression.css      |    15 +
 .../RelationExpression/RelationExpression.tsx      |   331 +
 .../RelationExpression/index.ts                    |     0
 .../src/{components => expressions}/index.css      |     0
 .../src/expressions/index.ts                       |    20 +
 .../boxed-expression-component/src/hooks/Hooks.ts  |    77 -
 .../src/i18n/BoxedExpressionEditorI18n.ts          |    28 +-
 .../src/i18n/locales/en.ts                         |    31 +-
 .../src/keysUtils/index.ts                         |    69 +
 .../resizing/BeeTableCellWidthToFitDataContext.tsx |   102 +
 .../resizing/BeeTableResizableColumnsContext.tsx   |   207 +
 .../src/resizing/FillingColumnResizingWidth.tsx    |   245 +
 .../src/resizing/Hooks.tsx                         |   406 +
 .../resizing/NestedExpressionContainerContext.tsx  |    35 +
 .../src/resizing/Resizer/Resizer.css               |    35 +
 .../src/resizing/Resizer/Resizer.tsx               |   209 +
 .../src/resizing/Resizer/index.ts                  |    17 +
 .../src/resizing/ResizingWidthsContext.tsx         |   109 +
 .../src/resizing/WidthConstants.ts                 |    48 +
 .../src/resizing/WidthMaths.ts                     |   220 +
 .../src/resizing/WidthsToFitData.ts                |    30 +
 .../src/selection/BeeTableSelectionContext.tsx     |  1075 ++
 .../src/table/BeeTable/BeeTable.css                |   347 +
 .../src/table/BeeTable/BeeTable.tsx                |   662 +
 .../src/table/BeeTable/BeeTableBody.tsx            |   184 +
 .../table/BeeTable/BeeTableContextMenuHandler.css  |    37 +
 .../table/BeeTable/BeeTableContextMenuHandler.tsx  |   338 +
 .../src/table/BeeTable/BeeTableDefaultCell.tsx     |    72 +
 .../table/BeeTable/BeeTableEditableCellContent.css |    64 +
 .../table/BeeTable/BeeTableEditableCellContent.tsx |   219 +
 .../src/table/BeeTable/BeeTableHeader.tsx          |   361 +
 .../src/table/BeeTable/BeeTableTd.tsx              |   250 +
 .../table/BeeTable/BeeTableTdForAdditionalRow.tsx  |    92 +
 .../src/table/BeeTable/BeeTableTh.tsx              |   195 +
 .../src/table/BeeTable/BeeTableThController.tsx    |    18 +
 .../src/table/BeeTable/BeeTableThResizable.tsx     |   272 +
 .../src/table/BeeTable/StandaloneBeeTable.tsx      |    66 +
 .../src/table/BeeTable/index.ts                    |    21 +
 .../tests/__mocks__/ReactWithSupervisor.ts         |    33 -
 .../tests/api/BoxedExpressionEditor.test.ts        |    58 -
 .../tests/api/EnumUtils.test.ts                    |    46 -
 .../BoxedExpressionEditor.test.tsx                 |    36 -
 .../BoxedExpressionEditor.test.tsx.snap            |    52 -
 .../ContextEntryExpression.test.tsx                |    67 -
 .../ContextEntryExpressionCell.test.tsx            |   104 -
 .../ContextExpression/ContextEntryInfo.test.tsx    |    79 -
 .../ContextEntryInfoCell.test.tsx                  |    93 -
 .../ContextExpression/ContextExpression.test.tsx   |   121 -
 .../DecisionTableExpression.test.tsx               |   207 -
 .../HitPolicySelector.test.tsx                     |   174 -
 .../EditExpressionMenu/EditExpressionMenu.test.tsx |   262 -
 .../EditExpressionMenu/EditTextInline.test.tsx     |   110 -
 .../__snapshots__/EditExpressionMenu.test.tsx.snap |    75 -
 .../ExpressionContainer.test.tsx                   |    80 -
 .../ExpressionContainer.test.tsx.snap              |    52 -
 .../FunctionExpression/FunctionExpression.test.tsx |   453 -
 .../FunctionKindSelector.test.tsx                  |    59 -
 .../InvocationExpression.test.tsx                  |   115 -
 .../ListExpression/ListExpression.test.tsx         |    71 -
 .../LiteralExpression/LiteralExpression.test.tsx   |   153 -
 .../LogicTypeSelector/LogicTypeSelector.test.tsx   |   141 -
 .../PMMLLiteralExpression.test.tsx                 |    98 -
 .../components/PopoverMenu/PopoverMenu.test.tsx    |    77 -
 .../__snapshots__/PopoverMenu.test.tsx.snap        |    75 -
 .../RelationExpression/RelationExpression.test.tsx |   106 -
 .../tests/components/Resizer/Resizer.test.tsx      |    82 -
 .../tests/components/Resizer/dom/Cell.test.tsx     |   249 -
 .../components/Resizer/dom/DOMSession.test.tsx     |    80 -
 .../Resizer/dom/ResizerSupervisorDOM.test.ts       |    63 -
 .../SelectionBox/CellSelectionBox.test.tsx         |   157 -
 .../components/SelectionBox/SelectionBox.test.tsx  |    95 -
 .../tests/components/Table/EditableCell.test.tsx   |   136 -
 .../tests/components/Table/Table.test.tsx          |   793 --
 .../components/Table/TableHandlerMenu.test.tsx     |    78 -
 .../Table/common/CopyAndPasteUtils.test.tsx        |   244 -
 .../components/Table/common/FocusUtils.test.tsx    |   627 -
 .../Table/common/NavigationKeysUtils.test.ts       |   197 -
 .../components/Table/common/TableUtils.test.tsx    |   416 -
 .../tests/components/test-utils.tsx                |   244 -
 .../tests/keysUtils/NavigationKeysUtils.test.ts    |   165 +
 .../ContainerFile.DashBuilderAuthoring             |     5 -
 .../ContainerFile.DashBuilderRuntime               |     5 -
 packages/dashbuilder-images/env/index.js           |    60 -
 packages/dashbuilder-images/package.json           |    34 -
 packages/dashbuilder/appformer/pom.xml             |     1 -
 .../org/uberfire/annotations/Customizable.java     |    35 -
 .../annotations/FallbackImplementation.java        |    35 -
 .../org/uberfire/backend/vfs/ObservablePath.java   |    61 -
 .../main/java/org/uberfire/backend/vfs/Path.java   |    27 -
 .../java/org/uberfire/backend/vfs/PathFactory.java |   217 -
 .../backend/vfs/impl/ForceUnlockEvent.java         |    38 -
 .../org/uberfire/backend/vfs/impl/LockInfo.java    |   123 -
 .../org/uberfire/backend/vfs/impl/LockResult.java  |    75 -
 .../backend/vfs/impl/ObservablePathImpl.java       |   406 -
 .../java/org/uberfire/lifecycle/GetContent.java    |    32 -
 .../java/org/uberfire/lifecycle/GetPreview.java    |    32 -
 .../main/java/org/uberfire/lifecycle/IsDirty.java  |    33 -
 .../java/org/uberfire/lifecycle/SetContent.java    |    32 -
 .../main/java/org/uberfire/mvp/PlaceRequest.java   |     8 -
 .../mvp/impl/ExternalPathPlaceRequest.java         |    48 -
 .../org/uberfire/mvp/impl/PathPlaceRequest.java    |   142 -
 .../java/org/uberfire/paging/AbstractPageRow.java  |    28 -
 .../org/uberfire/paging/AbstractPathPageRow.java   |    45 -
 .../main/java/org/uberfire/paging/PageRequest.java |    57 -
 .../java/org/uberfire/paging/PageResponse.java     |    86 -
 .../main/java/org/uberfire/rpc/SessionInfo.java    |    23 -
 .../org/uberfire/rpc/impl/SessionInfoImpl.java     |    76 -
 .../uberfire/rpc/impl/SessionInfoMarshalller.java  |    50 -
 .../main/java/org/uberfire/security/Resource.java  |    68 -
 .../java/org/uberfire/security/ResourceAction.java |    41 -
 .../java/org/uberfire/security/ResourceRef.java    |    76 -
 .../java/org/uberfire/security/ResourceType.java   |    36 -
 .../uberfire/security/authz/ResourceActionRef.java |    72 -
 .../security/authz/RuntimeContentResource.java     |    21 -
 .../security/authz/RuntimeFeatureResource.java     |    21 -
 .../uberfire/security/authz/RuntimeResource.java   |    25 -
 .../uberfire/security/authz/VotingStrategy.java    |    46 -
 .../workbench/annotations/VisibleAsset.java        |    26 -
 .../org/uberfire/workbench/category/Category.java  |    40 -
 .../org/uberfire/workbench/category/Others.java    |    31 -
 .../org/uberfire/workbench/category/Undefined.java |    31 -
 .../java/org/uberfire/workbench/diff/DiffMode.java |    22 -
 .../workbench/events/PluginAddedEvent.java         |    28 -
 .../org/uberfire/workbench/events/PluginEvent.java |    29 -
 .../workbench/events/PluginReloadedEvent.java      |    24 -
 .../workbench/events/PluginUpdatedEvent.java       |    28 -
 .../uberfire/workbench/events/ResourceAdded.java   |    48 -
 .../workbench/events/ResourceAddedEvent.java       |    62 -
 .../events/ResourceBatchChangesEvent.java          |    79 -
 .../uberfire/workbench/events/ResourceChange.java  |    24 -
 .../workbench/events/ResourceChangeType.java       |    31 -
 .../uberfire/workbench/events/ResourceCopied.java  |    52 -
 .../workbench/events/ResourceCopiedEvent.java      |    65 -
 .../uberfire/workbench/events/ResourceDeleted.java |    41 -
 .../workbench/events/ResourceDeletedEvent.java     |    62 -
 .../uberfire/workbench/events/ResourceEvent.java   |    24 -
 .../workbench/events/ResourceOpenedEvent.java      |    55 -
 .../uberfire/workbench/events/ResourceRenamed.java |    52 -
 .../workbench/events/ResourceRenamedEvent.java     |    60 -
 .../uberfire/workbench/events/ResourceUpdated.java |    41 -
 .../workbench/events/ResourceUpdatedEvent.java     |    58 -
 .../workbench/events/UberfireJSAPIReadyEvent.java  |    24 -
 .../workbench/model/ActivityResourceType.java      |    41 +-
 .../model/AppFormerActivitiesProducer.java         |    50 -
 .../model/DefaultAppFormerActivities.java          |    49 -
 .../org/uberfire/workbench/model/Notification.java |    99 -
 .../workbench/model/SplashScreenFilter.java        |    42 -
 .../workbench/model/bridge/Notification.java       |    52 -
 .../model/bridge/NotificationSeverity.java         |    29 -
 .../workbench/model/bridge/NotificationType.java   |    26 -
 .../model/impl/SplashScreenFilterImpl.java         |    74 -
 .../model/menu/EnabledStateChangeListener.java     |    31 -
 .../model/menu/HasEnabledStateChangeListeners.java |    32 -
 .../uberfire/workbench/model/menu/MenuCustom.java  |    30 -
 .../uberfire/workbench/model/menu/MenuFactory.java |   182 -
 .../uberfire/workbench/model/menu/MenuGroup.java   |    31 -
 .../uberfire/workbench/model/menu/MenuItem.java    |    75 -
 .../workbench/model/menu/MenuItemCommand.java      |    32 -
 .../workbench/model/menu/MenuItemPerspective.java  |    29 -
 .../workbench/model/menu/MenuItemPlain.java        |    28 -
 .../workbench/model/menu/MenuPosition.java         |    28 -
 .../uberfire/workbench/model/menu/MenuVisitor.java |    93 -
 .../org/uberfire/workbench/model/menu/Menus.java   |    48 -
 .../workbench/model/menu/impl/BaseMenuCustom.java  |   126 -
 .../workbench/model/menu/impl/BaseMenuVisitor.java |    68 -
 .../model/menu/impl/DefaultMenuGroup.java          |   148 -
 .../workbench/model/menu/impl/DefaultMenus.java    |    77 -
 .../workbench/model/menu/impl/MenuBuilderImpl.java |   616 -
 .../uberfire/workbench/model/toolbar/IconType.java |   269 -
 .../uberfire/workbench/model/toolbar/ToolBar.java  |    33 -
 .../workbench/model/toolbar/ToolBarIcon.java       |    27 -
 .../workbench/model/toolbar/ToolBarItem.java       |    55 -
 .../workbench/model/toolbar/ToolBarTypeIcon.java   |    22 -
 .../workbench/model/toolbar/ToolBarUrlIcon.java    |    26 -
 .../model/toolbar/impl/DefaultToolBar.java         |    65 -
 .../model/toolbar/impl/DefaultToolBarItem.java     |   105 -
 .../workbench/type/AnyResourceTypeDefinition.java  |    72 -
 .../workbench/type/DotResourceTypeDefinition.java  |    72 -
 .../org/uberfire/workbench/type/FileNameUtil.java  |    75 -
 .../workbench/type/ResourceTypeDefinition.java     |    88 -
 .../workbench/type/TextResourceTypeDefinition.java |    78 -
 .../org/uberfire/workspace/WorkspaceContext.java   |    37 -
 .../org/uberfire/backend/vfs/PathFactoryTest.java  |    46 -
 .../uberfire/mvp/impl/PathPlaceRequestTest.java    |    44 -
 .../org/uberfire/security/ResourceRefTest.java     |    54 -
 .../uberfire/workbench/category/CategoryTest.java  |    84 -
 .../workbench/model/menu/TestMenuSyntax.java       |    79 -
 .../workbench/model/menu/impl/TestBehavior.java    |   128 -
 .../uberfire/workbench/type/FileNameUtilTest.java  |    60 -
 .../appformer/uberfire-client-all/pom.xml          |     4 -
 .../org/uberfire/UberfireClientAll.gwt.xml         |     1 -
 .../client/annotations/DefaultPosition.java        |    33 -
 .../org/uberfire/client/annotations/Intercept.java |    29 -
 .../client/annotations/SplashBodyHeight.java       |    29 -
 .../uberfire/client/annotations/SplashFilter.java  |    34 -
 .../client/annotations/WorkbenchClientEditor.java  |    67 -
 .../client/annotations/WorkbenchContextId.java     |    29 -
 .../client/annotations/WorkbenchEditor.java        |   118 -
 .../uberfire/client/annotations/WorkbenchMenu.java |    34 -
 .../client/annotations/WorkbenchToolBar.java       |    34 -
 .../org/uberfire/client/callbacks/Callback.java    |    24 -
 .../org/uberfire/client/mvp/LockRequiredEvent.java |    24 -
 .../java/org/uberfire/client/mvp/LockTarget.java   |    91 -
 .../uberfire/client/mvp/RenameInProgressEvent.java |    35 -
 .../uberfire/client/mvp/SaveInProgressEvent.java   |    35 -
 .../client/mvp/UpdatedLockStatusEvent.java         |    49 -
 .../client/resources/UberfireResources.java        |    29 -
 .../client/resources/i18n/UberfireConstants.java   |    32 -
 .../resources/images/UberfireImageResources.java   |    28 -
 .../java/org/uberfire/client/util/Clipboard.java   |    40 -
 .../main/java/org/uberfire/client/util/Cookie.java |    53 -
 .../workbench/events/ChangeTitleWidgetEvent.java   |    56 -
 .../events/NewSplashScreenActiveEvent.java         |    26 -
 .../client/workbench/type/AnyResourceType.java     |    57 -
 .../client/workbench/type/ClientResourceType.java  |    38 -
 .../client/workbench/type/ClientTypeRegistry.java  |    32 -
 .../client/workbench/type/DotResourceType.java     |    53 -
 .../type/impl/ClientTypeRegistryImpl.java          |   101 -
 .../java/org/uberfire/client/util/CookieTest.java  |    83 -
 .../uberfire/commons/config/ConfigProperties.java  |   170 -
 .../java/org/uberfire/commons/data/Cacheable.java  |    32 -
 .../main/java/org/uberfire/commons/data/Pair.java  |    22 +-
 .../java/org/uberfire/commons/data/Triple.java     |    13 +-
 .../lifecycle/PriorityDisposableRegistry.java      |     4 +-
 .../commons/message/MessageHandlerResolver.java    |    25 -
 .../uberfire/commons/message/MessageService.java   |    48 -
 .../commons/regex/util/AntPathMatcher.java         |   444 -
 .../uberfire/commons/regex/util/GlobToRegEx.java   |   109 -
 .../commons/services/cdi/ApplicationStarted.java   |    21 -
 .../uberfire/commons/services/cdi/Startable.java   |    28 -
 .../org/uberfire/commons/services/cdi/Startup.java |    42 -
 .../uberfire/commons/services/cdi/StartupType.java |    46 -
 .../org/uberfire/commons/services/cdi/Veto.java    |    29 -
 .../main/java/org/uberfire/commons/uuid/UUID.java  |    88 -
 .../commons/regex/util/GlobToRegExTest.java        |    52 -
 .../java/org/uberfire/commons/uuid/UUIDTest.java   |    82 -
 .../appformer/uberfire-extensions/pom.xml          |     2 -
 .../uberfire-commons-editor/pom.xml                |    38 -
 .../uberfire-commons-editor-api/pom.xml            |    48 -
 .../ext/editor/commons/file/DefaultMetadata.java   |    25 -
 .../commons/readonly/ReadOnlyPathPlaceRequest.java |    71 -
 .../restriction/PathOperationRestriction.java      |    32 -
 .../commons/service/restrictor/CopyRestrictor.java |    24 -
 .../service/restrictor/DeleteRestrictor.java       |    24 -
 .../restrictor/PathOperationRestrictor.java        |    33 -
 .../service/restrictor/RenameRestrictor.java       |    24 -
 .../commons/service/support/SupportsCopy.java      |    48 -
 .../commons/service/support/SupportsCreate.java    |    26 -
 .../commons/service/support/SupportsDelete.java    |    24 -
 .../commons/service/support/SupportsRead.java      |    23 -
 .../commons/service/support/SupportsRename.java    |    25 -
 .../service/support/SupportsSaveAndRename.java     |    29 -
 .../commons/service/support/SupportsUpdate.java    |    26 -
 .../editor/commons/template/TemplateRenderer.java  |    26 -
 .../mustache/MustacheTemplateRenderer.java         |    33 -
 .../ext/editor/commons/version/CurrentBranch.java  |    22 -
 .../main/resources/META-INF/ErraiApp.properties    |    33 -
 .../src/main/resources/META-INF/beans.xml          |     5 -
 .../commons/UberfireCommonsEditorAPI.gwt.xml       |    30 -
 .../uberfire-commons-editor-backend/pom.xml        |    81 -
 .../commons/backend/service/helper/CopyHelper.java |    39 -
 .../backend/service/helper/DeleteHelper.java       |    37 -
 .../backend/service/helper/RenameHelper.java       |    39 -
 .../service/restriction/LockRestrictor.java        |    35 -
 .../validation/DefaultFileNameValidator.java       |    47 -
 .../backend/validation/FileNameValidator.java      |    50 -
 .../backend/validation/ValidationUtils.java        |    71 -
 .../src/main/resources/META-INF/beans.xml          |     0
 ...alidationUtils_ParameterizedArtifactIdTest.java |    91 -
 .../ValidationUtils_ParameterizedFilenameTest.java |    87 -
 .../ValidationUtils_ParameterizedJavaIdTest.java   |   105 -
 ...g.uberfire.java.nio.file.spi.FileSystemProvider |    18 -
 .../uberfire-commons-editor-client/pom.xml         |   282 -
 .../ext/editor/commons/client/BaseEditor.java      |   576 -
 .../commons/client/BaseEditorEntryPoint.java       |    31 -
 .../ext/editor/commons/client/BaseEditorView.java  |    37 -
 .../editor/commons/client/BaseEditorViewImpl.java  |    69 -
 .../ext/editor/commons/client/EditorTitle.java     |    41 -
 .../file/CommandWithFileNameAndCommitMessage.java  |    26 -
 .../commons/client/file/CopyPopUpViewProducer.java |    47 -
 .../editor/commons/client/file/Customizable.java   |    31 -
 .../client/file/FileNameAndCommitMessage.java      |    40 -
 .../editor/commons/client/file/RestoreUtil.java    |    33 -
 .../client/file/exports/AbstractFileExport.java    |    50 -
 .../commons/client/file/exports/FileExport.java    |    40 -
 .../client/file/exports/FileExportProducer.java    |    64 -
 .../client/file/exports/FileExportResources.java   |    36 -
 .../client/file/exports/ImageDataUriContent.java   |    62 -
 .../client/file/exports/ImageFileExport.java       |    64 -
 .../commons/client/file/exports/TextContent.java   |    34 -
 .../client/file/exports/TextFileExport.java        |    39 -
 .../file/exports/jso/FileExportScriptInjector.java |    95 -
 .../client/file/exports/jso/JsFileSaver.java       |    42 -
 .../commons/client/file/exports/jso/svg/C2S.java   |   269 -
 .../client/file/exports/jso/svg/C2SContext2D.java  |   300 -
 .../client/file/exports/jso/svg/C2SSettings.java   |    51 -
 .../client/file/exports/svg/Context2DFactory.java  |    31 -
 .../client/file/exports/svg/IContext2D.java        |   157 -
 .../client/file/exports/svg/SvgExportSettings.java |    45 -
 .../client/file/exports/svg/SvgFileExport.java     |    42 -
 .../client/file/popups/CommonModalBuilder.java     |   109 -
 .../client/file/popups/CopyPopUpPresenter.java     |   158 -
 .../commons/client/file/popups/CopyPopUpView.html  |    28 -
 .../commons/client/file/popups/CopyPopUpView.java  |   158 -
 .../client/file/popups/DeletePopUpPresenter.java   |   131 -
 .../client/file/popups/DeletePopUpView.html        |    27 -
 .../client/file/popups/DeletePopUpView.java        |   137 -
 .../client/file/popups/RenamePopUpPresenter.java   |   246 -
 .../client/file/popups/RenamePopUpView.html        |    37 -
 .../client/file/popups/RenamePopUpView.java        |   226 -
 .../client/file/popups/RenamePopUpView.less        |    21 -
 .../client/file/popups/RestorePopUpView.html       |    21 -
 .../client/file/popups/SavePopUpPresenter.java     |    94 -
 .../commons/client/file/popups/SavePopUpView.html  |    21 -
 .../commons/client/file/popups/SavePopUpView.java  |   110 -
 .../file/popups/elemental2/Elemental2Modal.java    |   104 -
 .../editor/commons/client/history/SaveButton.java  |   153 -
 .../commons/client/history/ViewAllLabel.java       |    57 -
 .../commons/client/history/ViewAllLabel.ui.xml     |    56 -
 .../client/htmleditor/HtmlEditorLibraryLoader.java |    47 -
 .../client/htmleditor/HtmlEditorPresenter.java     |    66 -
 .../commons/client/htmleditor/HtmlEditorView.css   |   311 -
 .../commons/client/htmleditor/HtmlEditorView.html  |   624 -
 .../commons/client/htmleditor/HtmlEditorView.java  |   410 -
 .../client/htmleditor/HtmlResourceType.java        |    85 -
 .../commons/client/menu/BasicFileMenuBuilder.java  |    99 -
 .../client/menu/BasicFileMenuBuilderImpl.java      |   447 -
 .../client/menu/DownloadMenuItemBuilder.java       |    82 -
 .../client/menu/HasLockSyncMenuStateHelper.java    |    78 -
 .../ext/editor/commons/client/menu/MenuItems.java  |    29 -
 .../client/menu/common/CurrentBranchProducer.java  |    41 -
 .../client/menu/common/DefaultCurrentBranch.java   |    35 -
 .../menu/common/SaveAndRenameCommandBuilder.java   |   252 -
 .../commons/client/resources/CommonImages.java     |    31 -
 .../client/resources/i18n/CommonConstants.java     |   127 -
 .../commons/client/resources/i18n/Constants.java   |   262 -
 .../mustache/ClientMustacheTemplateRenderer.java   |    67 -
 .../commons/client/template/mustache/Mustache.java |    32 -
 .../client/template/mustache/MustacheSource.java   |    29 -
 .../validation/DefaultFileNameValidator.java       |    33 -
 .../client/validation/ValidationErrorReason.java   |    24 -
 .../commons/client/validation/Validator.java       |    25 -
 .../client/validation/ValidatorCallback.java       |    27 -
 .../validation/ValidatorWithReasonCallback.java    |    25 -
 .../main/resources/META-INF/ErraiApp.properties    |    33 -
 .../src/main/resources/META-INF/beans.xml          |     7 -
 .../commons/UberfireCommonsEditorClient.gwt.xml    |    29 -
 .../resources/i18n/CommonConstants.properties      |   135 -
 .../resources/i18n/CommonConstants_de.properties   |   212 -
 .../resources/i18n/CommonConstants_es.properties   |   136 -
 .../resources/i18n/CommonConstants_fr.properties   |   136 -
 .../resources/i18n/CommonConstants_ja.properties   |   136 -
 .../i18n/CommonConstants_pt_BR.properties          |   113 -
 .../i18n/CommonConstants_zh_CN.properties          |   212 -
 .../client/resources/i18n/Constants.properties     |   112 -
 .../client/resources/i18n/Constants_es.properties  |   113 -
 .../client/resources/i18n/Constants_fr.properties  |   113 -
 .../client/resources/i18n/Constants_ja.properties  |   113 -
 .../commons/client/resources/images/edit.gif       |   Bin 210 -> 0 bytes
 .../ext/editor/commons/client/BaseEditorTest.java  |   465 -
 .../commons/client/BaseEditorValidationTest.java   |    85 -
 .../ext/editor/commons/client/KieEditorTest.java   |   166 -
 .../file/exports/AbstractFileExportTest.java       |    32 -
 .../file/exports/FileExportProducerTest.java       |    61 -
 .../file/exports/ImageDataUriContentTest.java      |    71 -
 .../client/file/exports/ImageFileExportTest.java   |    56 -
 .../client/file/exports/TextContentTest.java       |    32 -
 .../client/file/exports/TextFileExportTest.java    |    48 -
 .../exports/jso/FileExportScriptInjectorTest.java  |    50 -
 .../file/exports/jso/svg/C2SContext2DTest.java     |   468 -
 .../file/exports/svg/Context2DFactoryTest.java     |    46 -
 .../client/file/exports/svg/SvgFileExportTest.java |    53 -
 .../client/file/popups/CommonModalBuilderTest.java |    94 -
 .../client/file/popups/CopyPopUpPresenterTest.java |   127 -
 .../file/popups/DeletePopUpPresenterTest.java      |   126 -
 .../file/popups/RenamePopUpPresenterTest.java      |   247 -
 .../client/file/popups/SavePopUpPresenterTest.java |   120 -
 .../htmleditor/HtmlEditorLibraryLoaderTest.java    |    45 -
 .../client/htmleditor/HtmlEditorPresenterTest.java |    68 -
 .../client/htmleditor/HtmlEditorViewTest.java      |    77 -
 .../client/menu/BasicFileMenuBuilderTest.java      |   359 -
 .../client/menu/DownloadMenuItemBuilderTest.java   |   112 -
 .../menu/common/CurrentBranchProducerTest.java     |    48 -
 .../menu/common/DefaultCurrentBranchTest.java      |    41 -
 .../ClientMustacheTemplateRendererTest.java        |    72 -
 .../uberfire-layout-editor/pom.xml                 |     1 -
 .../uberfire-layout-editor-api/pom.xml             |     8 -
 .../ext/layout/editor/api/LayoutServices.java      |    28 -
 .../ext/layout/editor/api/PerspectiveServices.java |    48 -
 .../ext/layout/editor/api/css/CssColour.java       |    26 -
 .../ext/layout/editor/api/css/CssProperty.java     |    14 +-
 .../ext/layout/editor/api/css/CssRule.java         |    91 -
 .../ext/layout/editor/api/css/CssRuleList.java     |    51 -
 .../layout/editor/api/editor/LayoutInstance.java   |     4 +-
 .../layout/editor/UberfireLayoutEditorAPI.gwt.xml  |     3 +-
 .../uberfire-layout-editor-backend/pom.xml         |    75 -
 .../ext/layout/editor/impl/LayoutServicesImpl.java |    53 -
 .../editor/impl/PerspectiveServicesImpl.java       |   179 -
 .../impl/old/perspective/editor/ColumnEditor.java  |   107 -
 .../impl/old/perspective/editor/HTMLEditor.java    |    62 -
 .../old/perspective/editor/PerspectiveEditor.java  |    98 -
 .../impl/old/perspective/editor/RowEditor.java     |    76 -
 .../impl/old/perspective/editor/ScreenEditor.java  |   138 -
 .../src/main/resources/META-INF/beans.xml          |     0
 .../layout/editor/impl/LayoutServicesImplTest.java |    82 -
 .../editor/impl/PerspectiveServicesImplTest.java   |   183 -
 .../ext/layout/editor/impl/12withHTMLComponent.txt |    29 -
 .../uberfire/ext/layout/editor/impl/BigLayout.txt  |    95 -
 .../impl/DeprecatedComplexPerspectiveEditor.txt    |    61 -
 .../impl/DeprecatedEmptyPerspectiveEditor.txt      |    19 -
 .../DeprecatedMoreColumnsPerspectiveEditor.txt     |    66 -
 .../editor/impl/LayoutWithComponentWithParts.txt   |    36 -
 .../ext/layout/editor/impl/SubColumnsLayout.txt    |    95 -
 .../uberfire-layout-editor-client/pom.xml          |    17 -
 .../client/LayoutComponentPaletteScreen.java       |    53 -
 .../editor/client/LayoutEditorEntryPoint.java      |     2 +-
 .../editor/client/LayoutEditorPluginImpl.java      |   173 -
 .../editor/client/LayoutEditorPresenter.java       |   170 -
 .../client/LayoutEditorPropertiesScreen.java       |    54 -
 .../ext/layout/editor/client/LayoutEditorView.css  |   138 -
 .../ext/layout/editor/client/LayoutEditorView.html |    18 -
 .../ext/layout/editor/client/LayoutEditorView.java |   132 -
 .../editor/client/api/ComponentDropEvent.java      |    43 -
 .../editor/client/api/ComponentDropType.java       |    22 -
 .../editor/client/api/ComponentRemovedEvent.java   |    44 -
 .../ext/layout/editor/client/api/EditorWidget.java |    36 -
 .../layout/editor/client/api/HasConfiguration.java |    24 -
 .../editor/client/api/HasDragAndDropSettings.java  |    34 -
 .../editor/client/api/HasModalConfiguration.java   |    31 -
 .../editor/client/api/InternalDragComponent.java   |    39 -
 .../editor/client/api/LayoutDragComponent.java     |    66 -
 .../client/api/LayoutDragComponentGroup.java       |    64 -
 .../client/api/LayoutDragComponentPalette.java     |    43 -
 .../ext/layout/editor/client/api/LayoutEditor.java |    56 -
 .../editor/client/api/LayoutEditorElement.java     |     2 +-
 .../editor/client/api/LayoutEditorPlugin.java      |    29 -
 .../client/api/LayoutElementWithProperties.java    |     5 -
 .../client/api/ModalConfigurationContext.java      |    39 -
 .../client/api/PanelConfigurationContext.java      |    39 -
 .../editor/client/components/columns/Column.java   |    54 -
 .../components/columns/ColumnWithComponents.java   |   364 -
 .../columns/ColumnWithComponentsView.css           |    48 -
 .../columns/ColumnWithComponentsView.html          |     9 -
 .../columns/ColumnWithComponentsView.java          |   281 -
 .../client/components/columns/ComponentColumn.java |   503 -
 .../components/columns/ComponentColumnPart.java    |    90 -
 .../components/columns/ComponentColumnView.css     |   123 -
 .../components/columns/ComponentColumnView.html    |    15 -
 .../components/columns/ComponentColumnView.java    |   614 -
 .../client/components/container/Container.java     |   740 --
 .../client/components/container/ContainerView.css  |    97 -
 .../client/components/container/ContainerView.html |     5 -
 .../client/components/container/ContainerView.java |   150 -
 .../client/components/rows/EmptyDropRow.java       |    92 -
 .../client/components/rows/EmptyDropRowView.css    |     6 -
 .../client/components/rows/EmptyDropRowView.html   |     7 -
 .../client/components/rows/EmptyDropRowView.java   |   110 -
 .../layout/editor/client/components/rows/Row.java  |  1154 --
 .../editor/client/components/rows/RowDnDEvent.java |    44 -
 .../editor/client/components/rows/RowDrop.java     |    77 -
 .../editor/client/components/rows/RowView.css      |    75 -
 .../editor/client/components/rows/RowView.html     |    13 -
 .../editor/client/components/rows/RowView.java     |   323 -
 .../event/LayoutEditorElementSelectEvent.java      |    32 -
 .../event/LayoutEditorElementUnselectEvent.java    |    32 -
 .../LayoutElementClearAllPropertiesEvent.java      |    32 -
 .../event/LayoutElementPropertyChangedEvent.java   |    50 -
 .../client/generator/AbstractLayoutGenerator.java  |   115 +-
 .../generator/BootstrapLayoutGeneratorDriver.java  |    34 +-
 .../client/generator/LayoutGeneratorDriver.java    |     2 +-
 .../ext/layout/editor/client/infra/BeanHelper.java |    26 -
 .../ext/layout/editor/client/infra/ColumnDrop.java |    89 -
 .../editor/client/infra/ColumnDropContext.java     |    35 -
 .../editor/client/infra/ColumnResizeEvent.java     |    62 -
 .../editor/client/infra/ColumnSizeBuilder.java     |     4 +
 .../editor/client/infra/ContainerResizeEvent.java  |    67 -
 .../ext/layout/editor/client/infra/DnDManager.java |   103 -
 .../editor/client/infra/DndDataJSONConverter.java  |   105 -
 .../editor/client/infra/DragComponentEndEvent.java |    21 -
 .../client/infra/DragHelperComponentColumn.java    |   139 -
 .../layout/editor/client/infra/HTML5DnDHelper.java |    31 -
 .../client/infra/LayoutDragComponentHelper.java    |    34 +-
 .../editor/client/infra/LayoutEditorCssHelper.java |   263 +-
 .../client/infra/LayoutEditorFocusController.java  |    88 -
 .../editor/client/infra/LayoutTemplateAdapter.java |    93 -
 .../layout/editor/client/infra/NameValidator.java  |    63 -
 .../layout/editor/client/infra/RowResizeEvent.java |    60 -
 .../layout/editor/client/infra/RowSizeBuilder.java |    24 -
 .../editor/client/infra/UniqueIDGenerator.java     |    48 -
 .../editor/client/resources/WebAppResource.java    |     2 +-
 .../client/resources/i18n/CommonConstants.java     |    75 -
 .../resources/i18n/CssAllowedValueConstants.java   |    71 -
 .../client/resources/i18n/PropertiesConstants.java |    90 -
 .../LayoutEditorPropertyLengthValidator.java       |    58 -
 .../LayoutEditorPropertyNumberValidator.java       |    40 -
 .../layout/editor/client/widgets/KebabWidget.html  |    32 -
 .../layout/editor/client/widgets/KebabWidget.java  |    69 -
 .../LayoutComponentPaletteGroupProvider.java       |    39 -
 .../widgets/LayoutComponentPalettePresenter.java   |   132 -
 .../client/widgets/LayoutComponentPaletteView.css  |     3 -
 .../client/widgets/LayoutComponentPaletteView.html |    18 -
 .../client/widgets/LayoutComponentPaletteView.java |    54 -
 .../widgets/LayoutDragComponentGroupPresenter.java |    93 -
 .../widgets/LayoutDragComponentGroupView.css       |     3 -
 .../widgets/LayoutDragComponentGroupView.html      |    26 -
 .../widgets/LayoutDragComponentGroupView.java      |   126 -
 .../client/widgets/LayoutDragComponentWidget.html  |    21 -
 .../client/widgets/LayoutDragComponentWidget.java  |    77 -
 .../widgets/LayoutEditorPropertiesPresenter.java   |   358 -
 .../client/widgets/LayoutEditorPropertiesView.css  |    10 -
 .../client/widgets/LayoutEditorPropertiesView.html |    15 -
 .../client/widgets/LayoutEditorPropertiesView.java |   194 -
 .../widgets/LayoutElementPropertiesPresenter.java  |   144 -
 .../widgets/LayoutElementPropertiesView.java       |    79 -
 .../editor/UberfireLayoutEditorClient.gwt.xml      |     5 -
 .../resources/i18n/CommonConstants.properties      |    43 -
 .../resources/i18n/CommonConstants_de.properties   |    17 -
 .../resources/i18n/CommonConstants_es.properties   |    44 -
 .../resources/i18n/CommonConstants_fr.properties   |    44 -
 .../resources/i18n/CommonConstants_ja.properties   |    44 -
 .../i18n/CommonConstants_pt_BR.properties          |    17 -
 .../i18n/CommonConstants_zh_CN.properties          |    17 -
 .../i18n/CssAllowedValueConstants.properties       |    23 -
 .../i18n/CssAllowedValueConstants_es.properties    |    20 -
 .../i18n/CssAllowedValueConstants_fr.properties    |    20 -
 .../i18n/CssAllowedValueConstants_ja.properties    |    20 -
 .../resources/i18n/PropertiesConstants.properties  |    31 -
 .../i18n/PropertiesConstants_de.properties         |     2 -
 .../i18n/PropertiesConstants_es.properties         |    32 -
 .../i18n/PropertiesConstants_fr.properties         |    32 -
 .../i18n/PropertiesConstants_ja.properties         |    32 -
 .../i18n/PropertiesConstants_pt_BR.properties      |     2 -
 .../i18n/PropertiesConstants_zh_CN.properties      |     2 -
 .../editor/client/AbstractLayoutEditorTest.java    |   278 -
 .../LayoutComponentPalettePresenterTest.java       |   200 -
 .../editor/client/LayoutEditorPluginImplTest.java  |    66 -
 .../editor/client/LayoutEditorPresenterTest.java   |   107 -
 .../LayoutEditorPropertiesPresenterTest.java       |   360 -
 .../LayoutElementPropertiesPresenterTest.java      |   125 -
 .../editor/client/components/FullLayoutTest.java   |   166 -
 .../columns/ColumnWithComponentsTest.java          |    68 -
 .../components/columns/ComponentColumnTest.java    |   148 -
 .../columns/ComponentColumnViewTest.java           |    79 -
 .../client/components/container/ContainerTest.java |   341 -
 .../editor/client/components/rows/RowTest.java     |   421 -
 .../client/generator/LayoutGeneratorTest.java      |   124 -
 .../infra/LayoutDragComponentHelperTest.java       |    10 -
 .../client/infra/LayoutEditorCssHelperTest.java    |     8 +-
 .../infra/LayoutEditorFocusControllerTest.java     |    82 -
 .../editor/client/infra/UniqueIDGeneratorTest.java |    54 -
 .../TestLayoutComponentPaletteGroupProvider.java   |    44 -
 .../client/test/TestLayoutDragComponent.java       |    68 -
 .../Group1LayoutComponentPaletteGroupProvider.java |    41 -
 .../test/group1/Group1LayoutDragComponent1.java    |    12 -
 .../test/group1/Group1LayoutDragComponent2.java    |    28 -
 .../test/group1/Group1LayoutDragComponent3.java    |    28 -
 .../Group2LayoutComponentPaletteGroupProvider.java |    41 -
 .../test/group2/Group2LayoutDragComponent1.java    |    28 -
 .../test/group2/Group2LayoutDragComponent2.java    |    28 -
 .../Group3LayoutComponentPaletteGroupProvider.java |    41 -
 .../test/group3/Group3LayoutDragComponent1.java    |    28 -
 .../uberfire-runtime-plugins/pom.xml               |     2 -
 .../uberfire-runtime-plugins-api/pom.xml           |    65 -
 .../uberfire/ext/plugin/event/BasePluginEvent.java |    41 -
 .../ext/plugin/event/NewPluginRegistered.java      |    43 -
 .../org/uberfire/ext/plugin/event/PluginAdded.java |    32 -
 .../uberfire/ext/plugin/event/PluginDeleted.java   |    41 -
 .../uberfire/ext/plugin/event/PluginRenamed.java   |    48 -
 .../org/uberfire/ext/plugin/event/PluginSaved.java |    32 -
 .../ext/plugin/event/PluginUnregistered.java       |    43 -
 .../ext/plugin/exception/PluginAlreadyExists.java  |    26 -
 .../org/uberfire/ext/plugin/model/Activity.java    |    60 -
 .../org/uberfire/ext/plugin/model/Language.java    |    25 -
 .../ext/plugin/model/LayoutEditorModel.java        |    84 -
 .../java/org/uberfire/ext/plugin/model/Plugin.java |    72 -
 .../org/uberfire/ext/plugin/model/PluginType.java  |    28 -
 .../uberfire/ext/plugin/model/RuntimePlugin.java   |    71 -
 .../ext/plugin/service/PluginServices.java         |    29 -
 .../type/BasePluginResourceTypeDefinition.java     |    43 -
 .../type/EditorPluginResourceTypeDefinition.java   |    54 -
 ...spectiveLayoutPluginResourceTypeDefinition.java |    54 -
 .../ext/plugin/type/TagsConverterUtil.java         |    49 -
 .../ext/plugin/type/TypeConverterUtil.java         |    49 -
 .../main/resources/META-INF/ErraiApp.properties    |    33 -
 .../uberfire/ext/plugin/RuntimePluginAPI.gwt.xml   |    30 -
 .../uberfire-runtime-plugins-backend/pom.xml       |    59 -
 .../ext/plugin/backend/PluginServicesImpl.java     |    67 -
 .../src/main/resources/META-INF/beans.xml          |     0
 .../main/resources/frameworks/angular.dependency   |   307 -
 .../main/resources/frameworks/knockout.dependency  |   123 -
 .../src/main/resources/nofound.png                 |   Bin 11090 -> 0 bytes
 .../src/main/resources/placeholder.png             |   Bin 8722 -> 0 bytes
 .../ext/plugin/backend/PluginServicesImplTest.java |    79 -
 ...g.uberfire.java.nio.file.spi.FileSystemProvider |    18 -
 .../uberfire/ext/plugin/backend/angular_css.txt    |     0
 .../uberfire/ext/plugin/backend/angular_main.txt   |    36 -
 .../ext/plugin/backend/angular_template.txt        |    18 -
 .../ext/plugin/backend/angular_todo_registry.txt   |    36 -
 .../ext/plugin/backend/empty_screen_registry.txt   |     1 -
 .../screen_with_title_and_name_registry.txt        |     1 -
 .../plugin/backend/screen_with_title_registry.txt  |     1 -
 .../uberfire/ext/plugin/backend/splash_main.txt    |     1 -
 .../ext/plugin/backend/splash_screen_registry.txt  |     1 -
 .../ext/plugin/backend/splash_template.txt         |     1 -
 .../uberfire-runtime-plugins-client/pom.xml        |    37 -
 .../editor/PerspectiveEditorPresenter.java         |   338 -
 .../perspective/editor/PerspectiveEditorView.java  |    64 -
 .../editor/PerspectiveEditorView.ui.xml            |    34 -
 .../PerspectiveEditorComponentGroupProvider.java   |    54 -
 .../editor/api/PerspectiveEditorCoreComponent.java |    26 -
 .../api/PerspectiveEditorCoreGroupProvider.java    |    63 -
 .../editor/api/PerspectiveEditorNavComponent.java  |    26 -
 .../api/PerspectiveEditorNavGroupProvider.java     |    58 -
 .../editor/components/popup/AddTag.java            |   156 -
 .../editor/components/popup/AddTag.ui.xml          |    54 -
 .../editor/events/PerspectiveEditorFocusEvent.java |    31 -
 .../generator/PerspectiveEditorActivity.java       |    18 +-
 .../generator/PerspectiveEditorGenerator.java      |   206 -
 .../generator/PerspectiveEditorScreenActivity.java |    26 +-
 .../layout/editor/HTMLLayoutDragComponent.java     |    66 +-
 .../layout/editor/PerspectiveEditorSettings.java   |    39 -
 .../layout/editor/ScreenLayoutDragComponent.java   |   174 -
 .../layout/editor/TargetDivDragComponent.java      |    51 +-
 .../editor/layout/editor/TargetDivList.java        |    67 -
 .../layout/editor/popups/EditHTMLPresenter.java    |   106 -
 .../editor/layout/editor/popups/EditHTMLView.html  |    22 -
 .../editor/layout/editor/popups/EditHTMLView.java  |   121 -
 .../editor/layout/editor/popups/EditScreen.java    |   286 -
 .../editor/layout/editor/popups/EditScreen.ui.xml  |    72 -
 .../editor/layout/editor/popups/EditTargetDiv.java |   163 -
 .../layout/editor/popups/EditTargetDiv.ui.xml      |    36 -
 .../type/PerspectiveLayoutPluginResourceType.java  |    46 -
 .../plugin/client/validation/NameValidator.java    |    70 -
 .../client/validation/PluginNameValidator.java     |   100 -
 .../plugin/client/validation/RuleValidator.java    |    42 -
 .../ext/plugin/RuntimePluginClient.gwt.xml         |     4 -
 .../editor/PerspectiveEditorPresenterTest.java     |   231 -
 .../generator/PerspectiveEditorGeneratorTest.java  |    80 -
 .../editor/ScreenLayoutDragComponentTest.java      |   169 -
 .../editor/layout/editor/TargetDivListTest.java    |    61 -
 .../editor/popups/EditHTMLPresenterTest.java       |   121 -
 .../layout/editor/popups/EditScreenTest.java       |   171 -
 .../client/validation/NameValidatorTest.java       |    64 -
 .../client/validation/PluginNameValidatorTest.java |   118 -
 .../client/validation/RuleValidatorTest.java       |    95 -
 .../uberfire-simple-docks/pom.xml                  |    36 -
 .../uberfire-simple-docks-client/pom.xml           |    84 -
 .../java/org/uberfire/client/DocksEntryPoint.java  |    31 -
 .../uberfire/client/docks/UberfireDocksImpl.java   |   254 -
 .../uberfire/client/docks/view/DockResizeBar.java  |   200 -
 .../org/uberfire/client/docks/view/DocksBar.java   |   134 -
 .../org/uberfire/client/docks/view/DocksBars.java  |   430 -
 .../client/docks/view/bars/DocksCollapsedBar.java  |   183 -
 .../docks/view/bars/DocksCollapsedBar.ui.xml       |    23 -
 .../client/docks/view/bars/DocksExpandedBar.java   |   222 -
 .../client/docks/view/bars/DocksExpandedBar.ui.xml |    31 -
 .../client/docks/view/items/AbstractDockItem.java  |   162 -
 .../docks/view/items/AbstractSideDockItem.java     |    24 -
 .../client/docks/view/items/SideDockItem.java      |   130 -
 .../client/docks/view/items/SideDockItem.ui.xml    |    30 -
 .../docks/view/items/SingleSideDockItem.java       |    79 -
 .../docks/view/items/SingleSideDockItem.ui.xml     |    24 -
 .../client/docks/view/items/SouthDockItem.java     |   109 -
 .../client/docks/view/items/SouthDockItem.ui.xml   |    23 -
 .../client/docks/view/menu/MenuBuilder.java        |   124 -
 .../org/uberfire/client/resources/DocksCss.java    |    79 -
 .../uberfire/client/resources/WebAppResource.java  |    30 -
 .../client/resources/i18n/DockConstants.java       |    29 -
 .../main/resources/META-INF/ErraiApp.properties    |    33 -
 .../src/main/resources/META-INF/beans.xml          |     7 -
 .../org/uberfire/UberfireDocksClient.gwt.xml       |    27 -
 .../org/uberfire/client/resources/css/docks.css    |   121 -
 .../resources/i18n/CommonConstants.properties      |    17 -
 .../resources/i18n/CommonConstants_de.properties   |     1 -
 .../resources/i18n/CommonConstants_es.properties   |    18 -
 .../resources/i18n/CommonConstants_fr.properties   |    18 -
 .../resources/i18n/CommonConstants_ja.properties   |    18 -
 .../i18n/CommonConstants_pt_BR.properties          |     1 -
 .../i18n/CommonConstants_zh_CN.properties          |     1 -
 .../client/docks/UberfireDocksImplTest.java        |   299 -
 .../client/docks/view/DockResizeBarTest.java       |    75 -
 .../uberfire/client/docks/view/DocksBarsTest.java  |   412 -
 .../client/docks/view/DocksBars_OpenDockTest.java  |    98 -
 .../docks/view/bars/DocksCollapsedBarTest.java     |    72 -
 .../docks/view/bars/DocksExpandedBarTest.java      |   123 -
 .../docks/view/items/AbstractDockItemOuiaTest.java |    86 -
 .../client/docks/view/items/SideDockItemTest.java  |   177 -
 .../client/docks/view/items/SouthDockItemTest.java |   136 -
 .../uberfire-extensions/uberfire-widgets/pom.xml   |     2 -
 .../uberfire-widgets-commons/pom.xml               |     5 -
 .../common/client/accordion/TriggerWidget.java     |   144 -
 .../client/breadcrumbs/UberfireBreadcrumbs.java    |   307 -
 .../client/breadcrumbs/UberfireBreadcrumbsView.css |    29 -
 .../breadcrumbs/UberfireBreadcrumbsView.html       |    23 -
 .../breadcrumbs/UberfireBreadcrumbsView.java       |    69 -
 .../header/UberfireBreadcrumbsContainer.java       |    27 -
 .../header/UberfireBreadcrumbsContainerImpl.css    |     3 -
 .../header/UberfireBreadcrumbsContainerImpl.html   |     1 -
 .../header/UberfireBreadcrumbsContainerImpl.java   |    71 -
 .../breadcrumbs/widget/BreadcrumbPresenter.java    |    28 -
 .../widget/DefaultBreadcrumbsPresenter.java        |    89 -
 .../breadcrumbs/widget/DefaultBreadcrumbsView.css  |    48 -
 .../breadcrumbs/widget/DefaultBreadcrumbsView.html |    19 -
 .../breadcrumbs/widget/DefaultBreadcrumbsView.java |    71 -
 .../client/colorpicker/ColorChangedEvent.java      |    50 -
 .../client/colorpicker/ColorChangedHandler.java    |    23 -
 .../client/colorpicker/ColorPickerDialog.java      |    71 -
 .../common/client/colorpicker/ColorUtils.java      |   150 -
 .../common/client/colorpicker/HueChangedEvent.java |    50 -
 .../client/colorpicker/HueChangedHandler.java      |    23 -
 .../common/client/colorpicker/HuePicker.java       |   146 -
 .../colorpicker/SaturationLightnessPicker.java     |   204 -
 .../common/client/colorpicker/canvas/Canvas.java   |    79 -
 .../common/client/colorpicker/canvas/Gradient.java |    29 -
 .../client/colorpicker/canvas/ImageData.java       |    37 -
 .../colorpicker/canvas/RenderingContext.java       |    84 -
 .../common/client/colorpicker/dialog/Dialog.java   |   101 -
 .../colorpicker/dialog/DialogClosedEvent.java      |    50 -
 .../colorpicker/dialog/DialogClosedHandler.java    |    23 -
 .../widgets/common/client/common/AddButton.java    |    52 -
 .../common/client/common/BooleanTextBox.java       |    40 -
 .../client/common/ConcurrentChangePopup.java       |    81 -
 .../common/client/common/DirtyableContainer.java   |    22 -
 .../common/client/common/DirtyableFlexTable.java   |    47 -
 .../client/common/DirtyableHorizontalPane.java     |    37 -
 .../client/common/DirtyableVerticalPane.java       |    44 -
 .../common/client/common/FileInputButton.java      |   145 -
 .../common/client/common/FileInputGroupButton.java |    33 -
 .../widgets/common/client/common/FileUpload.java   |   141 -
 .../widgets/common/client/common/FileUpload.ui.xml |    31 -
 .../client/common/FileUploadFormEncoder.java       |    39 -
 .../common/client/common/FormStyleItem.java        |    86 -
 .../common/client/common/FormStyleLayout.java      |   102 -
 .../widgets/common/client/common/ImageButton.java  |   115 -
 .../ext/widgets/common/client/common/InfoCube.java |    64 -
 .../widgets/common/client/common/InfoCube.ui.xml   |    38 -
 .../widgets/common/client/common/InfoPopup.java    |    60 -
 .../common/client/common/LazyStackPanel.java       |   218 -
 .../client/common/LazyStackPanelHeader.ui.xml      |    52 -
 .../common/client/common/LazyStackPanelRow.java    |   133 -
 .../ext/widgets/common/client/common/Page.java     |    95 -
 .../common/client/common/PrettyFormLayout.java     |   152 -
 .../common/client/common/ResizableTextArea.java    |    33 -
 .../widgets/common/client/common/SmallLabel.java   |    53 -
 .../common/client/common/StackItemHeader.java      |    36 -
 .../common/client/common/StackItemHeaderView.java  |    27 -
 .../client/common/StackItemHeaderViewImpl.java     |    53 -
 .../client/common/StackItemHeaderViewImpl.ui.xml   |    39 -
 .../widgets/common/client/common/StyleHelper.java  |    67 -
 .../ext/widgets/common/client/common/Util.java     |    90 -
 .../common/client/common/popups/ButtonPressed.java |    23 -
 .../client/common/popups/FormStylePopup.java       |   105 -
 .../common/client/menu/MenuItemDivider.java        |    41 -
 .../common/client/menu/MenuItemDividerView.html    |     1 -
 .../common/client/menu/MenuItemDividerView.java    |    24 -
 .../common/client/menu/MenuItemFactory.java        |   232 -
 .../widgets/common/client/menu/MenuItemHeader.java |    41 -
 .../common/client/menu/MenuItemHeaderView.html     |     3 -
 .../common/client/menu/MenuItemHeaderView.java     |    35 -
 .../widgets/common/client/menu/MenuItemView.java   |    26 -
 .../common/client/menu/MenuItemWithIcon.java       |    41 -
 .../common/client/menu/MenuItemWithIconView.html   |     6 -
 .../common/client/menu/MenuItemWithIconView.java   |    85 -
 .../common/client/menu/RefreshMenuBuilder.java     |    81 -
 .../client/menu/RefreshSelectorMenuBuilder.java    |   197 -
 .../widgets/common/client/tables/ColumnPicker.java |   184 -
 .../common/client/tables/FilterPagedTable.java     |   315 -
 .../common/client/tables/FilterPagedTable.ui.xml   |    27 -
 .../widgets/common/client/tables/PagedTable.java   |    41 +-
 .../widgets/common/client/tables/SimpleTable.java  |    86 +-
 .../client/tables/popup/DataGridFilterSummary.java |    42 -
 .../common/client/tables/popup/NewFilterPopup.java |   466 -
 .../client/tables/popup/NewFilterPopup.ui.xml      |    52 -
 .../client/tables/popup/NewTabFilterPopup.java     |   300 -
 .../client/tables/popup/NewTabFilterPopup.ui.xml   |    53 -
 .../widgets/common/UberfireWidgetsCommons.gwt.xml  |     1 -
 .../breadcrumbs/UberfireBreadcrumbsTest.java       |   319 -
 .../widget/DefaultBreadcrumbsPresenterTest.java    |    59 -
 .../common/client/common/BooleanTextBoxTest.java   |    50 -
 .../common/client/common/FileUploadTest.java       |    62 -
 .../common/client/common/FormStyleItemTest.java    |    97 -
 .../common/client/common/FormStyleLayoutTest.java  |    72 -
 .../common/client/common/InfoPopupTest.java        |    70 -
 .../client/common/popups/FormStylePopupTest.java   |    77 -
 .../common/client/menu/MenuItemFactoryTest.java    |   157 -
 .../common/client/menu/RefreshMenuBuilderTest.java |    66 -
 .../menu/RefreshSelectorMenuBuilderTest.java       |    91 -
 .../common/client/tables/ColumnPickerTest.java     |    87 +-
 .../common/client/tables/FilterPagedTableTest.java |   159 -
 .../common/client/tables/PagedTableTest.java       |    68 +-
 .../common/client/tables/SimpleTableTest.java      |    74 +-
 .../uberfire-widgets/uberfire-widgets-core/pom.xml |     1 -
 .../uberfire-widgets-core-ace/pom.xml              |    58 -
 .../widgets/common/client/ace/AceAnnotation.java   |    35 -
 .../common/client/ace/AceAnnotationType.java       |    39 -
 .../ext/widgets/common/client/ace/AceCommand.java  |    42 -
 .../widgets/common/client/ace/AceCompletion.java   |    35 -
 .../common/client/ace/AceCompletionCallback.java   |    29 -
 .../client/ace/AceCompletionCallbackImpl.java      |    48 -
 .../common/client/ace/AceCompletionProvider.java   |    43 -
 .../common/client/ace/AceCompletionSnippet.java    |   127 -
 .../client/ace/AceCompletionSnippetSegment.java    |    29 -
 .../ace/AceCompletionSnippetSegmentLiteral.java    |    41 -
 .../AceCompletionSnippetSegmentTabstopItem.java    |    50 -
 .../common/client/ace/AceCompletionValue.java      |    80 -
 .../ext/widgets/common/client/ace/AceEditor.java   |   501 -
 .../common/client/ace/AceEditorCallback.java       |    35 -
 .../common/client/ace/AceEditorCursorPosition.java |    82 -
 .../widgets/common/client/ace/AceEditorMode.java   |   492 -
 .../widgets/common/client/ace/AceEditorTheme.java  |    74 -
 .../ext/widgets/common/UberfireAceEditor.gwt.xml   |    24 -
 .../ext/widgets/common/public/ace/ace-compat.js    |    83 -
 .../uberfire/ext/widgets/common/public/ace/ace.js  | 12421 -------------------
 .../ext/widgets/common/public/ace/cockpit.js       |  1134 --
 .../ext/widgets/common/public/ace/ext-beautify.js  |   148 -
 .../ext/widgets/common/public/ace/ext-chromevox.js |   347 -
 .../common/public/ace/ext-elastic_tabstops_lite.js |   192 -
 .../ext/widgets/common/public/ace/ext-emmet.js     |   938 --
 .../widgets/common/public/ace/ext-error_marker.js  |     3 -
 .../common/public/ace/ext-keybinding_menu.js       |   129 -
 .../common/public/ace/ext-language_tools.js        |  1421 ---
 .../ext/widgets/common/public/ace/ext-linking.js   |    36 -
 .../ext/widgets/common/public/ace/ext-modelist.js  |   157 -
 .../ext/widgets/common/public/ace/ext-old_ie.js    |   255 -
 .../ext/widgets/common/public/ace/ext-options.js   |   276 -
 .../ext/widgets/common/public/ace/ext-prompt.js    |    46 -
 .../ext/widgets/common/public/ace/ext-searchbox.js |   200 -
 .../widgets/common/public/ace/ext-settings_menu.js |   493 -
 .../widgets/common/public/ace/ext-spellcheck.js    |    55 -
 .../ext/widgets/common/public/ace/ext-split.js     |   205 -
 .../common/public/ace/ext-static_highlight.js      |    89 -
 .../ext/widgets/common/public/ace/ext-statusbar.js |    41 -
 .../ext/widgets/common/public/ace/ext-textarea.js  |   338 -
 .../ext/widgets/common/public/ace/ext-themelist.js |    46 -
 .../widgets/common/public/ace/ext-whitespace.js    |   128 -
 .../widgets/common/public/ace/keybinding-emacs.js  |   907 --
 .../widgets/common/public/ace/keybinding-vim.js    |  1214 --
 .../ext/widgets/common/public/ace/mode-html.js     |  1808 ---
 .../widgets/common/public/ace/mode-javascript.js   |   634 -
 .../ext/widgets/common/public/ace/snippets/html.js |     5 -
 .../common/public/ace/snippets/javascript.js       |     5 -
 .../ext/widgets/common/public/ace/theme-chrome.js  |     8 -
 .../ext/widgets/common/public/ace/worker-html.js   |  9097 --------------
 .../widgets/common/public/ace/worker-javascript.js |  6974 -----------
 .../defaulteditor/DefaultEditorFileUpload.java     |    68 -
 .../defaulteditor/DefaultEditorFileUploadBase.java |   156 -
 .../DefaultEditorFileUploadBase.ui.xml             |    37 -
 .../defaulteditor/DefaultEditorNewFileUpload.java  |    53 -
 .../defaulteditor/DefaultFileEditorPresenter.java  |    69 -
 .../defaulteditor/DefaultFileEditorView.java       |    66 -
 .../defaulteditor/DefaultFileEditorView.ui.xml     |    47 -
 .../core/client/wizards/AbstractWizard.java        |    16 +-
 .../ext/widgets/core/client/wizards/Wizard.java    |     4 +-
 .../widgets/core/client/wizards/WizardPage.java    |     5 +-
 .../core/client/wizards/WizardPageTitle.java       |    35 +-
 .../ext/widgets/core/UberfireWidgetsCore.gwt.xml   |     1 -
 .../DefaultEditorFileUploadBaseTestWrapper.java    |    56 -
 .../DefaultEditorFileUploadParametersTest.java     |    55 -
 .../defaulteditor/DefaultEditorFileUploadTest.java |    92 -
 .../editors/defaulteditor/UploadEventTest.java     |    55 -
 .../uberfire-widgets-properties-editor/pom.xml     |    37 -
 .../uberfire-widgets-properties-editor-api/pom.xml |    68 -
 .../model/CustomPropertyEditorFieldInfo.java       |    39 -
 .../editor/model/PropertyEditorCategory.java       |   107 -
 .../editor/model/PropertyEditorChangeEvent.java    |    49 -
 .../editor/model/PropertyEditorEvent.java          |   110 -
 .../editor/model/PropertyEditorFieldInfo.java      |   251 -
 .../editor/model/PropertyEditorFieldOption.java    |    22 -
 .../editor/model/PropertyEditorType.java           |   117 -
 .../ext/properties/editor/model/PropertyUtils.java |    38 -
 .../editor/model/validators/ColorValidator.java    |    65 -
 .../editor/model/validators/LongValidator.java     |    38 -
 .../model/validators/MandatoryValidator.java       |    34 -
 .../model/validators/PropertyFieldValidator.java   |    38 -
 .../editor/model/validators/TextValidator.java     |    36 -
 .../service/BeanPropertyEditorBuilderService.java  |    29 -
 .../main/resources/META-INF/ErraiApp.properties    |    33 -
 .../properties/editor/PropertiesEditorAPI.gwt.xml  |    27 -
 .../editor/model/PropertyEditorEventTest.java      |    63 -
 .../properties/editor/model/PropertyUtilsTest.java |    56 -
 .../model/validators/MandatoryValidatorTest.java   |    46 -
 .../pom.xml                                        |    51 -
 .../editor/server/BeanPropertyEditorBuilder.java   |   155 -
 .../src/main/resources/META-INF/beans.xml          |     0
 .../server/BeanPropertyEditorBuilderTest.java      |   255 -
 .../editor/server/beans/ComplexPlanBean.java       |    52 -
 .../properties/editor/server/beans/SampleEnum.java |    22 -
 .../editor/server/beans/SamplePlanBean.java        |    31 -
 .../editor/server/beans/UnknownTypesBean.java      |    25 -
 .../pom.xml                                        |    88 -
 .../editor/client/PropertyEditorHelper.java        |   300 -
 .../editor/client/PropertyEditorItemsWidget.java   |    62 -
 .../editor/client/PropertyEditorItemsWidget.ui.xml |    23 -
 .../editor/client/PropertyEditorWidget.java        |   138 -
 .../editor/client/PropertyEditorWidget.ui.xml      |    32 -
 .../editor/client/fields/AbstractField.java        |    54 -
 .../editor/client/fields/BooleanField.java         |    61 -
 .../editor/client/fields/ColorField.java           |    56 -
 .../editor/client/fields/ComboField.java           |   104 -
 .../client/fields/PropertyEditorFieldType.java     |    88 -
 .../editor/client/fields/SecretTextField.java      |    96 -
 .../properties/editor/client/fields/TextField.java |    94 -
 .../options/PropertyEditorFieldOptionUtils.java    |    37 -
 .../client/resources/i18n/CommonConstants.java     |    26 -
 .../widgets/AbstractPropertyEditorWidget.java      |    38 -
 .../client/widgets/PropertyEditorCheckBox.java     |    61 -
 .../client/widgets/PropertyEditorCheckBox.ui.xml   |    22 -
 .../client/widgets/PropertyEditorColorPicker.java  |    97 -
 .../widgets/PropertyEditorColorPicker.ui.xml       |    27 -
 .../client/widgets/PropertyEditorComboBox.java     |    93 -
 .../client/widgets/PropertyEditorComboBox.ui.xml   |    21 -
 .../client/widgets/PropertyEditorItemButtons.java  |    62 -
 .../widgets/PropertyEditorItemButtons.ui.xml       |    22 -
 .../client/widgets/PropertyEditorItemLabel.java    |    55 -
 .../client/widgets/PropertyEditorItemLabel.ui.xml  |    23 -
 .../client/widgets/PropertyEditorItemWidget.java   |    43 -
 .../client/widgets/PropertyEditorItemWidget.ui.xml |    22 -
 .../widgets/PropertyEditorPasswordTextBox.java     |    74 -
 .../widgets/PropertyEditorPasswordTextBox.ui.xml   |    21 -
 .../client/widgets/PropertyEditorTextBox.java      |    78 -
 .../client/widgets/PropertyEditorTextBox.ui.xml    |    23 -
 .../main/resources/META-INF/ErraiApp.properties    |    33 -
 .../src/main/resources/META-INF/beans.xml          |     7 -
 .../editor/PropertiesEditorClient.gwt.xml          |    27 -
 .../resources/i18n/CommonConstants.properties      |     1 -
 .../resources/i18n/CommonConstants_de.properties   |     1 -
 .../resources/i18n/CommonConstants_es.properties   |     1 -
 .../resources/i18n/CommonConstants_fr.properties   |     1 -
 .../resources/i18n/CommonConstants_ja.properties   |     1 -
 .../i18n/CommonConstants_pt_BR.properties          |     1 -
 .../i18n/CommonConstants_zh_CN.properties          |     1 -
 .../editor/client/PropertyEditorHelperTest.java    |   115 -
 .../editor/client/PropertyEditorWidgetTest.java    |    54 -
 .../PropertyEditorFieldOptionUtilsTest.java        |    38 -
 .../uberfire-widgets-service/pom.xml               |    33 -
 .../uberfire-widgets-service-api/pom.xml           |    40 -
 .../shared/preferences/GridColumnPreference.java   |   108 -
 .../shared/preferences/GridGlobalPreferences.java  |    63 -
 .../shared/preferences/GridPreferencesStore.java   |   114 -
 .../preferences/GridSortedColumnPreference.java    |    92 -
 .../preferences/MultiGridPreferencesStore.java     |   130 -
 .../shared/preferences/UserPreference.java         |    42 -
 .../shared/preferences/UserPreferencesService.java |    29 -
 .../shared/preferences/UserPreferencesType.java    |    34 -
 .../preferences/UserWorkbenchPreferences.java      |    51 -
 .../main/resources/META-INF/ErraiApp.properties    |    33 -
 .../services/UberfireWidgetsServicesAPI.gwt.xml    |    24 -
 .../uberfire-widgets-service-backend/pom.xml       |    48 -
 .../preferences/UserPreferencesServiceImpl.java    |    44 -
 .../main/resources/META-INF/ErraiApp.properties    |    31 -
 .../src/main/resources/META-INF/beans.xml          |     0
 .../dashbuilder/appformer/uberfire-server/pom.xml  |    90 -
 .../backend/server/util/gzip/GzipFilter.java       |    99 -
 .../util/gzip/GzipHttpServletResponseWrapper.java  |    94 -
 .../util/gzip/GzipResponseServletOutputStream.java |   106 -
 .../org/uberfire/server/FileDownloadServlet.java   |    73 -
 .../main/java/org/uberfire/server/MimeType.java    |  1386 ---
 .../server/cdi/UberFireGeneralFactory.java         |    45 -
 .../server/locale/GWTLocaleHeaderFilter.java       |   144 -
 .../org/uberfire/server/util/FileServletUtil.java  |    64 -
 .../src/main/resources/META-INF/beans.xml          |     0
 .../uberfire/server/FileDownloadServletTest.java   |   114 -
 .../server/locale/GWTLocaleHeaderFilterTest.java   |   148 -
 .../src/test/resources/expected-2-sample.html      |    22 -
 .../src/test/resources/expected-3-sample.html      |    22 -
 .../src/test/resources/expected-4-sample.html      |    22 -
 .../src/test/resources/expected-sample.html        |    22 -
 .../uberfire-server/src/test/resources/sample.html |    20 -
 .../java/org/uberfire/mocks/SessionInfoMock.java   |    36 -
 .../appformer/uberfire-workbench/pom.xml           |     1 -
 .../uberfire-workbench-client-backend/pom.xml      |    70 -
 .../client/WorkbenchBackendEntryPoint.java         |   119 -
 .../main/resources/META-INF/ErraiApp.properties    |    35 -
 .../src/main/resources/META-INF/beans.xml          |     6 -
 .../org/uberfire/UberfireWorkbenchBackend.gwt.xml  |    24 -
 .../client/WorkbenchBackendEntryPointTest.java     |   201 -
 .../src/test/resources/logback-test.xml            |    20 -
 .../client/views/pfly/HTML5DndSeleniumSupport.java |    95 -
 .../client/views/pfly/icon/PatternFlyIconType.java |    80 -
 .../views/pfly/listbar/ListBarWidgetImpl.java      |   150 -
 .../views/pfly/menu/DropdownMenuVisitor.java       |   160 -
 .../client/views/pfly/menu/HasMenuItems.java       |    40 -
 .../uberfire/client/views/pfly/menu/MainBrand.java |    30 -
 .../views/pfly/menu/PartContextMenusView.java      |    37 -
 .../views/pfly/menu/SplashScreenMenuView.java      |    75 -
 .../client/views/pfly/menu/UtilityMenuBarView.java |    61 -
 .../views/pfly/menu/WorkbenchMenuBarView.java      |   355 -
 .../pfly/menu/WorkbenchMenuCompactNavBarView.java  |   196 -
 .../views/pfly/menu/WorkbenchMenuNavBarView.java   |   122 -
 .../pfly/menu/WorkbenchMenuStandardNavBarView.java |   267 -
 .../pfly/menu/WorkbenchViewModeSwitcherView.java   |    68 -
 .../pfly/menu/megamenu/WorkbenchMegaMenuView.html  |    71 -
 .../pfly/menu/megamenu/WorkbenchMegaMenuView.java  |   267 -
 .../pfly/menu/megamenu/WorkbenchMegaMenuView.less  |   170 -
 .../contextmenuitem/ChildContextMenuItemView.html  |    19 -
 .../contextmenuitem/ChildContextMenuItemView.java  |    78 -
 .../contextmenuitem/GroupContextMenuItemView.html  |    20 -
 .../contextmenuitem/GroupContextMenuItemView.java  |    77 -
 .../menu/megamenu/menuitem/ChildMenuItemView.html  |    19 -
 .../menu/megamenu/menuitem/ChildMenuItemView.java  |    73 -
 .../menu/megamenu/menuitem/GroupMenuItemView.html  |    20 -
 .../menu/megamenu/menuitem/GroupMenuItemView.java  |    58 -
 .../menu/megamenu/menuitem/IconMenuItemView.html   |    21 -
 .../menu/megamenu/menuitem/IconMenuItemView.java   |    82 -
 .../views/pfly/multipage/MultiPageEditorImpl.java  |    95 -
 .../MultiPageEditorSelectedPageEvent.java          |    32 -
 .../pfly/multipage/MultiPageEditorViewImpl.java    |   183 -
 .../client/views/pfly/multipage/PageImpl.java      |    56 -
 .../client/views/pfly/multipage/PageViewImpl.java  |    54 -
 .../pfly/multiscreen/MultiScreenMenuBuilder.java   |   156 -
 .../pfly/multiscreen/MultiScreenPartWidget.java    |    49 +-
 .../views/pfly/splash/SplashModalFooter.html       |    25 -
 .../views/pfly/splash/SplashModalFooter.java       |    70 -
 .../client/views/pfly/splash/SplashViewImpl.java   |   105 -
 .../views/pfly/tab/MultiTabWorkbenchPanelView.java |    56 -
 .../views/pfly/toolbar/WorkbenchToolBarView.java   |   277 -
 .../views/pfly/toolbar/WorkbenchToolBarView.ui.xml |    60 -
 .../client/views/static/uberfire-patternfly.css    |     5 -
 .../views/pfly/listbar/ListBarWidgetImplTest.java  |   169 +-
 .../views/pfly/menu/WorkbenchMenuBarViewTest.java  |   276 -
 .../menu/WorkbenchMenuCompactNavBarViewTest.java   |   246 -
 .../menu/WorkbenchMenuStandardNavBarViewTest.java  |   331 -
 .../client/views/pfly/mock/MockPlaceManager.java   |    76 -
 .../pfly/multipage/MultiPageEditorImplTest.java    |    79 -
 .../multipage/MultiPageEditorViewImplTest.java     |   233 -
 .../multiscreen/MultiScreenMenuBuilderTest.java    |   109 -
 .../multiscreen/MultiScreenPartWidgetTest.java     |     7 -
 .../pfly/tab/MultiTabWorkbenchPanelViewTest.java   |    59 -
 .../org/uberfire/client/menu/CustomSplashHelp.java |    51 -
 .../client/menu/SplashScreenMenuPresenter.java     |   116 -
 .../menu/WorkbenchViewModeSwitcherMenuBuilder.java |    45 -
 .../menu/WorkbenchViewModeSwitcherPresenter.java   |   118 -
 .../org/uberfire/client/mvp/AbstractActivity.java  |     4 +-
 .../uberfire/client/mvp/AbstractPopupActivity.java |    10 +-
 .../client/mvp/AbstractSplashScreenActivity.java   |   147 -
 .../client/mvp/AbstractWorkbenchActivity.java      |    20 -
 .../mvp/AbstractWorkbenchClientEditorActivity.java |    29 -
 .../mvp/AbstractWorkbenchEditorActivity.java       |   107 -
 .../mvp/AbstractWorkbenchPerspectiveActivity.java  |    28 +-
 .../mvp/AbstractWorkbenchScreenActivity.java       |     7 +-
 .../java/org/uberfire/client/mvp/AcceptItem.java   |    21 -
 .../java/org/uberfire/client/mvp/Activity.java     |    18 +-
 .../uberfire/client/mvp/ActivityAndMetaInfo.java   |    74 -
 .../uberfire/client/mvp/ActivityBeansCache.java    |   136 +-
 .../org/uberfire/client/mvp/ActivityBeansInfo.java |     8 -
 .../org/uberfire/client/mvp/ActivityManager.java   |    31 +-
 .../uberfire/client/mvp/ActivityManagerImpl.java   |    96 +-
 .../org/uberfire/client/mvp/ActivityMetaInfo.java  |    88 -
 .../uberfire/client/mvp/BookmarkableUrlHelper.java |   428 -
 .../client/mvp/CategoriesManagerCache.java         |    78 -
 .../org/uberfire/client/mvp/IsSplashScreen.java    |    33 -
 .../uberfire/client/mvp/LockDemandDetector.java    |   103 -
 .../uberfire/client/mvp/PerspectiveActivity.java   |    13 -
 .../client/mvp/PerspectiveManagerImpl.java         |    77 +-
 .../uberfire/client/mvp/PlaceHistoryHandler.java   |   285 -
 .../java/org/uberfire/client/mvp/PlaceManager.java |    81 +-
 .../org/uberfire/client/mvp/PlaceManagerImpl.java  |   565 +-
 .../client/mvp/PlaceRequestHistoryMapper.java      |    28 -
 .../client/mvp/PlaceRequestHistoryMapperImpl.java  |    97 -
 .../client/mvp/PluginActivityManagerImpl.java      |   111 -
 .../client/mvp/PluginPlaceManagerImpl.java         |   292 -
 .../client/mvp/ResourceTypeManagerCache.java       |    97 -
 .../uberfire/client/mvp/SplashScreenActivity.java  |    48 -
 .../org/uberfire/client/mvp/WorkbenchActivity.java |    10 -
 .../client/mvp/WorkbenchClientEditorActivity.java  |    61 -
 .../client/mvp/WorkbenchEditorActivity.java        |    40 -
 .../client/mvp/WorkbenchScreenActivity.java        |     1 -
 .../mvp/jsbridge/JsWorkbenchLazyActivity.java      |     8 -
 .../mvp/jsbridge/JsWorkbenchLazyPerspective.java   |     8 -
 .../resources/i18n/PermissionTreeConstants.java    |    26 -
 .../resources/i18n/PermissionTreeI18NImpl.java     |    78 -
 .../client/resources/i18n/PermissionTreeI18n.java  |    42 -
 .../org/uberfire/client/util/CSSLocatorsUtils.java |     3 +-
 .../org/uberfire/client/workbench/BeanFactory.java |     8 +-
 .../client/workbench/DefaultBeanFactory.java       |    24 +-
 .../java/org/uberfire/client/workbench/Footer.java |    36 -
 .../java/org/uberfire/client/workbench/Header.java |    36 -
 .../uberfire/client/workbench/PanelManager.java    |     3 -
 .../client/workbench/PanelManagerImpl.java         |   185 +-
 .../client/workbench/PluginEntryPoint.java         |    43 -
 .../workbench/StandaloneEditorPerspective.java     |    50 -
 .../org/uberfire/client/workbench/Workbench.java   |    25 -
 .../uberfire/client/workbench/WorkbenchLayout.java |     2 -
 .../client/workbench/WorkbenchLayoutImpl.java      |   239 +-
 .../client/workbench/WorkbenchLayoutInfo.java      |    28 -
 .../client/workbench/WorkbenchLayoutInfoImpl.java  |    36 -
 .../client/workbench/WorkbenchServicesProxy.java   |     6 -
 .../WorkbenchServicesProxyClientImpl.java          |    12 -
 .../workbench/annotations/AssociatedResources.java |    37 -
 .../client/workbench/docks/UberfireDock.java       |   190 -
 .../docks/UberfireDockContainerReadyEvent.java     |    23 -
 .../workbench/docks/UberfireDockPosition.java      |    55 -
 .../workbench/docks/UberfireDockReadyEvent.java    |    32 -
 .../client/workbench/docks/UberfireDocks.java      |    80 -
 .../workbench/docks/UberfireDocksContainer.java    |   125 -
 .../docks/UberfireDocksInteractionEvent.java       |    90 -
 .../workbench/events/AbstractPlaceEvent.java       |     2 +-
 .../client/workbench/events/PerspectiveChange.java |     9 -
 .../client/workbench/panels/UFFlowPanel.java       |    58 -
 .../AbstractDockingWorkbenchPanelPresenter.java    |     2 +-
 .../impl/AbstractDockingWorkbenchPanelView.java    |    23 +-
 .../AbstractMultiPartWorkbenchPanelPresenter.java  |   124 -
 .../impl/AbstractMultiPartWorkbenchPanelView.java  |   100 -
 .../impl/AbstractSimpleWorkbenchPanelView.java     |   166 -
 .../impl/AdaptiveWorkbenchPanelPresenter.java      |    49 -
 .../panels/impl/AdaptiveWorkbenchPanelView.java    |    32 -
 .../ClosableSimpleWorkbenchPanelPresenter.java     |    86 -
 .../impl/ClosableSimpleWorkbenchPanelView.java     |    33 -
 .../impl/ImmutableWorkbenchPanelPresenter.java     |    58 -
 .../panels/impl/ImmutableWorkbenchPanelView.java   |   124 -
 .../workbench/panels/impl/LayoutPanelView.java     |     7 +-
 .../impl/MultiListWorkbenchPanelPresenter.java     |    47 -
 .../panels/impl/MultiListWorkbenchPanelView.java   |    95 -
 .../impl/MultiScreenWorkbenchPanelPresenter.java   |    45 -
 .../panels/impl/MultiScreenWorkbenchPanelView.java |    50 -
 .../impl/MultiTabWorkbenchPanelPresenter.java      |    47 -
 .../impl/SimpleDnDWorkbenchPanelPresenter.java     |    75 -
 .../panels/impl/SimpleDnDWorkbenchPanelView.java   |    27 -
 .../SimpleNoExpandWorkbenchPanelPresenter.java     |    85 -
 .../impl/SimpleNoExpandWorkbenchPanelView.java     |    35 -
 .../panels/impl/SimpleWorkbenchPanelPresenter.java |    85 -
 .../panels/impl/SimpleWorkbenchPanelView.java      |    34 -
 .../panels/impl/SinglePartPanelHelper.java         |    54 -
 .../panels/impl/SplitLayoutPanelPresenter.java     |    53 -
 .../panels/impl/SplitLayoutPanelView.java          |   181 -
 .../panels/impl/StaticWorkbenchPanelPresenter.java |    85 -
 .../panels/impl/StaticWorkbenchPanelView.java      |   171 -
 .../impl/TemplatedWorkbenchPanelPresenter.java     |    74 -
 .../panels/impl/TemplatedWorkbenchPanelView.java   |   194 -
 .../UnanchoredStaticWorkbenchPanelPresenter.java   |    90 -
 .../impl/UnanchoredStaticWorkbenchPanelView.java   |   167 -
 .../part/AbstractWorkbenchPartPresenter.java       |    15 -
 .../workbench/part/WorkbenchPartPresenter.java     |    22 +-
 .../widgets/dnd/CompassDropController.java         |     3 -
 .../widgets/dnd/WorkbenchDragContext.java          |     8 -
 .../widgets/dnd/WorkbenchPickupDragController.java |    80 +-
 .../workbench/widgets/listbar/ListBarWidget.java   |     8 +-
 .../menu/AbstractWorkbenchMenuProducer.java        |    79 -
 .../client/workbench/widgets/menu/HasMenus.java    |    24 -
 .../widgets/menu/MenuItemVisibilityHandler.java    |    38 -
 .../widgets/menu/PartContextMenusPresenter.java    |    80 -
 .../workbench/widgets/menu/UtilityMenuBar.java     |    22 -
 .../widgets/menu/UtilityMenuBarPresenter.java      |    53 -
 .../workbench/widgets/menu/WorkbenchMenuBar.java   |    39 -
 .../widgets/menu/WorkbenchMenuBarPresenter.java    |   415 -
 .../widgets/menu/WorkbenchMenuBarProducer.java     |    75 -
 .../menu/WorkbenchMenuBarStandalonePresenter.java  |    45 -
 .../menu/base/WorkbenchBaseMenuPresenter.java      |   111 -
 .../widgets/menu/base/WorkbenchBaseMenuUtils.java  |    26 -
 .../widgets/menu/base/WorkbenchBaseMenuView.java   |    22 -
 .../events/PerspectiveVisibiltiyChangeEvent.java   |    38 -
 .../menu/megamenu/WorkbenchMegaMenuPresenter.java  |   400 -
 .../menu/megamenu/WorkbenchMegaMenuProducer.java   |   103 -
 .../WorkbenchMegaMenuStandalonePresenter.java      |    68 -
 .../menu/megamenu/base/BaseMenuItemPresenter.java  |    24 -
 .../widgets/menu/megamenu/base/CanBeDisabled.java  |    24 -
 .../widgets/menu/megamenu/base/CanHide.java        |    25 -
 .../widgets/menu/megamenu/base/HasChildren.java    |    24 -
 .../widgets/menu/megamenu/base/Selectable.java     |    22 -
 .../widgets/menu/megamenu/brand/MegaMenuBrand.java |    44 -
 .../ChildContextMenuItemPresenter.java             |    92 -
 .../GroupContextMenuItemPresenter.java             |    84 -
 .../megamenu/menuitem/ChildMenuItemPresenter.java  |   100 -
 .../megamenu/menuitem/GroupMenuItemPresenter.java  |    62 -
 .../megamenu/menuitem/IconMenuItemPresenter.java   |    90 -
 .../WorkbenchMegaMenuContextMenuVisitor.java       |   112 -
 .../megamenu/visitor/WorkbenchMegaMenuVisitor.java |   123 -
 .../widgets/multipage/MultiPageEditor.java         |    43 -
 .../widgets/multipage/MultiPageEditorView.java     |    38 -
 .../workbench/widgets/multipage/Multiple.java      |    29 -
 .../client/workbench/widgets/multipage/Page.java   |    28 -
 .../workbench/widgets/multipage/PageView.java      |    23 -
 .../widgets/notifications/NotificationManager.java |    10 +-
 .../workbench/widgets/splash/SplashView.java       |    65 -
 .../widgets/toolbar/WorkbenchToolBarPresenter.java |   218 -
 .../i18n/PermissionTreeConstants.properties        |    27 -
 .../i18n/PermissionTreeConstants_es.properties     |    28 -
 .../i18n/PermissionTreeConstants_fr.properties     |    28 -
 .../i18n/PermissionTreeConstants_ja.properties     |    28 -
 .../mvp/AbstractPerspectiveActivityTest.java       |     6 +
 .../mvp/ActivityBeansCacheActivatedByTest.java     |   238 -
 .../client/mvp/ActivityBeansCacheTest.java         |   256 -
 .../mvp/ActivityBeansCacheUnitTestWrapper.java     |    41 -
 .../client/mvp/ActivityManagerActivatedByTest.java |   154 -
 .../client/mvp/ActivityManagerLifecycleTest.java   |   301 +-
 .../uberfire/client/mvp/ActivityMetaInfoTest.java  |   108 -
 .../client/mvp/BookmarkableUrlHelperTest.java      |   684 -
 .../client/mvp/CategoriesManagerCacheTest.java     |   100 -
 .../client/mvp/PerspectiveManagerTest.java         |   214 +-
 .../client/mvp/PlaceHistoryHandlerTest.java        |   519 -
 .../mvp/PlaceRequestHistoryMapperImplTest.java     |   133 -
 .../client/mvp/ResourceTypeManagerCacheTest.java   |   215 -
 .../client/mvp/WorkbenchEditorActivityTest.java    |   114 -
 .../client/workbench/DefaultBeanFactoryTest.java   |     2 -
 .../client/workbench/PanelManagerTest.java         |   150 +-
 .../client/workbench/WorkbenchLayoutImplTest.java  |   125 +-
 .../workbench/WorkbenchLayoutInfoImplTest.java     |    57 -
 .../client/workbench/docks/UberfireDockTest.java   |   259 -
 ...AbstractDockingWorkbenchPanelPresenterTest.java |    12 +-
 ...stractMultiPartWorkbenchPanelPresenterTest.java |   239 -
 .../impl/AdaptiveWorkbenchPanelViewTest.java       |    66 -
 .../ClosableSimpleWorkbenchPanelPresenterTest.java |   100 -
 .../impl/ClosableSimpleWorkbenchPanelViewTest.java |    85 -
 .../impl/MultiListWorkbenchPanelPresenterTest.java |    41 -
 .../impl/MultiListWorkbenchPanelViewTest.java      |   120 -
 .../impl/MultiTabWorkbenchPanelPresenterTest.java  |    41 -
 .../workbench/panels/impl/PlaceManagerTest.java    |  1005 +-
 .../impl/SimpleDnDWorkbenchPanelPresenterTest.java |    85 -
 .../SimpleNoExpandWorkbenchPanelPresenterTest.java |    82 -
 .../impl/SimpleWorkbenchPanelPresenterTest.java    |   100 -
 .../panels/impl/SimpleWorkbenchPanelViewTest.java  |   128 -
 .../SimpleWorkbenchPanelViewUnitTestWrapper.java   |    34 -
 .../panels/impl/SinglePartPanelHelperTest.java     |    86 -
 .../impl/StaticWorkbenchPanelPresenterTest.java    |    97 -
 .../panels/impl/StaticWorkbenchPanelViewTest.java  |   160 -
 ...nanchoredStaticWorkbenchPanelPresenterTest.java |    97 -
 .../UnanchoredStaticWorkbenchPanelViewTest.java    |    42 -
 .../widgets/dnd/CompassDropControllerTest.java     |    41 +-
 .../menu/WorkbenchMenuBarPresenterTest.java        |   309 -
 .../widgets/menu/WorkbenchMenuBarProducerTest.java |   166 -
 .../WorkbenchMenuBarStandalonePresenterTest.java   |   113 -
 .../megamenu/WorkbenchMegaMenuPresenterTest.java   |   578 -
 .../megamenu/WorkbenchMegaMenuProducerTest.java    |   190 -
 .../WorkbenchMegaMenuStandalonePresenterTest.java  |   164 -
 .../ChildContextMenuItemPresenterTest.java         |    73 -
 .../GroupContextMenuItemPresenterTest.java         |    75 -
 .../menuitem/ChildMenuItemPresenterTest.java       |    73 -
 .../menuitem/GroupMenuItemPresenterTest.java       |    61 -
 .../menuitem/IconMenuItemPresenterTest.java        |    76 -
 .../processors/PerspectiveProcessorTest.java       |   139 -
 .../WorkbenchClientEditorProcessorTest.java        |   150 -
 .../processors/WorkbenchEditorProcessorTest.java   |   555 -
 .../processors/WorkbenchScreenProcessorTest.java   |    68 -
 .../WorkbenchSplashScreenProcessorTest.java        |   210 -
 .../java/org/uberfire/client/mvp/MyTestType.java   |    85 -
 .../annotations/processors/PerspectiveTest10.java  |     7 -
 .../annotations/processors/PerspectiveTest11.java  |     6 -
 .../annotations/processors/PerspectiveTest12.java  |    43 -
 .../annotations/processors/PerspectiveTest13.java  |     4 +-
 .../annotations/processors/PerspectiveTest16.java  |    35 -
 .../annotations/processors/PerspectiveTest17.java  |    33 -
 .../annotations/processors/PerspectiveTest18.java  |    33 -
 .../annotations/processors/PerspectiveTest8.java   |     6 -
 .../annotations/processors/PerspectiveTest9.java   |     6 -
 .../processors/WorkbenchEditorTest1.java           |     5 -
 .../processors/WorkbenchEditorTest10.java          |    28 -
 .../processors/WorkbenchEditorTest11.java          |    29 -
 .../processors/WorkbenchEditorTest12.java          |    31 -
 .../processors/WorkbenchEditorTest13.java          |    31 -
 .../processors/WorkbenchEditorTest14.java          |    35 -
 .../processors/WorkbenchEditorTest15.java          |    30 -
 .../processors/WorkbenchEditorTest16.java          |    29 -
 .../processors/WorkbenchEditorTest17.java          |    24 -
 .../processors/WorkbenchEditorTest18.java          |    25 -
 .../processors/WorkbenchEditorTest19.java          |    22 -
 .../processors/WorkbenchEditorTest2.java           |     9 -
 .../processors/WorkbenchEditorTest20.java          |    27 -
 .../processors/WorkbenchEditorTest21.java          |    23 -
 .../processors/WorkbenchEditorTest22.java          |    23 -
 .../processors/WorkbenchEditorTest23.java          |    23 -
 .../processors/WorkbenchEditorTest24.java          |    23 -
 .../processors/WorkbenchEditorTest25.java          |    23 -
 .../processors/WorkbenchEditorTest26.java          |    23 -
 .../processors/WorkbenchEditorTest27.java          |    24 -
 .../processors/WorkbenchEditorTest28.java          |    29 -
 .../processors/WorkbenchEditorTest29.java          |    43 -
 .../processors/WorkbenchEditorTest3.java           |    17 -
 .../processors/WorkbenchEditorTest4.java           |    15 -
 .../processors/WorkbenchEditorTest5.java           |    23 -
 .../processors/WorkbenchEditorTest6.java           |    16 -
 .../processors/WorkbenchEditorTest7.java           |    23 -
 .../processors/WorkbenchEditorTest8.java           |    56 -
 .../processors/WorkbenchEditorTest9.java           |    31 -
 .../processors/WorkbenchScreenTest10.java          |     6 -
 .../processors/WorkbenchScreenTest14.java          |     7 -
 .../processors/WorkbenchScreenTest15.java          |     6 -
 .../processors/WorkbenchScreenTest30.java          |     6 -
 .../processors/WorkbenchScreenTest9.java           |     6 -
 .../processors/WorkbenchSplashScreenTest1.java     |     5 -
 .../processors/WorkbenchSplashScreenTest10.java    |    49 -
 .../processors/WorkbenchSplashScreenTest2.java     |     8 -
 .../processors/WorkbenchSplashScreenTest3.java     |    16 -
 .../processors/WorkbenchSplashScreenTest4.java     |    14 -
 .../processors/WorkbenchSplashScreenTest5.java     |    22 -
 .../processors/WorkbenchSplashScreenTest6.java     |    29 -
 .../processors/WorkbenchSplashScreenTest7.java     |    31 -
 .../processors/WorkbenchSplashScreenTest8.java     |    38 -
 .../processors/WorkbenchSplashScreenTest9.java     |    31 -
 .../processors/expected/PerspectiveTest12.expected |   135 -
 .../processors/expected/PerspectiveTest13.expected |     2 +-
 .../processors/expected/PerspectiveTest17.expected |   117 -
 .../processors/expected/PerspectiveTest18.expected |   119 -
 .../expected/WorkbenchClientEditorTest6.expected   |    87 -
 .../expected/WorkbenchClientEditorTest7.expected   |    87 -
 .../expected/WorkbenchClientEditorTest8.expected   |    87 -
 .../expected/WorkbenchEditorTest10.expected        |    83 -
 .../expected/WorkbenchEditorTest11.expected        |    82 -
 .../expected/WorkbenchEditorTest12.expected        |    82 -
 .../expected/WorkbenchEditorTest13.expected        |    75 -
 .../expected/WorkbenchEditorTest14.expected        |    82 -
 .../expected/WorkbenchEditorTest15.expected        |    82 -
 .../expected/WorkbenchEditorTest16.expected        |    75 -
 .../expected/WorkbenchEditorTest17.expected        |    76 -
 .../expected/WorkbenchEditorTest18.expected        |    78 -
 .../expected/WorkbenchEditorTest19.expected        |    76 -
 .../expected/WorkbenchEditorTest21.expected        |    75 -
 .../expected/WorkbenchEditorTest22.expected        |    85 -
 .../expected/WorkbenchEditorTest23.expected        |    75 -
 .../expected/WorkbenchEditorTest24.expected        |    80 -
 .../expected/WorkbenchEditorTest25.expected        |    75 -
 .../expected/WorkbenchEditorTest26.expected        |    80 -
 .../expected/WorkbenchEditorTest27.expected        |    78 -
 .../expected/WorkbenchEditorTest28.expected        |    93 -
 .../expected/WorkbenchEditorTest29.expected        |    77 -
 .../expected/WorkbenchEditorTest5.expected         |    75 -
 .../expected/WorkbenchEditorTest6.expected         |    75 -
 .../expected/WorkbenchEditorTest7.expected         |    75 -
 .../expected/WorkbenchEditorTest8.expected         |   119 -
 .../expected/WorkbenchEditorTest9.expected         |    82 -
 .../expected/WorkbenchSplashScreenTest10.expected  |    82 -
 .../expected/WorkbenchSplashScreenTest6.expected   |    80 -
 .../expected/WorkbenchSplashScreenTest7.expected   |    83 -
 .../expected/WorkbenchSplashScreenTest9.expected   |    83 -
 .../processors/ClientEditorActivityGenerator.java  |   319 -
 .../processors/EditorActivityGenerator.java        |    13 +-
 .../annotations/processors/GeneratorUtils.java     |   472 +-
 .../processors/PerspectiveActivityGenerator.java   |    12 -
 .../processors/ScreenActivityGenerator.java        |   192 +-
 .../processors/SplashScreenActivityGenerator.java  |   241 -
 .../processors/WorkbenchClientEditorProcessor.java |   121 -
 .../processors/WorkbenchEditorProcessor.java       |   121 -
 .../processors/WorkbenchSplashScreenProcessor.java |   121 -
 .../processors/facades/ClientAPIModule.java        |   104 +-
 .../services/javax.annotation.processing.Processor |     3 -
 .../processors/templates/activityClientEditor.ftl  |   243 -
 .../processors/templates/activityScreen.ftl        |    18 -
 .../processors/templates/perspective.ftl           |    21 -
 .../processors/templates/splashScreen.ftl          |   181 -
 packages/dashbuilder/dashbuilder-authoring/pom.xml |   765 --
 .../org/dashbuilder/backend/RuntimeJaxApp.java     |    25 -
 .../org/dashbuilder/client/ShowcaseEntryPoint.java |    91 -
 .../org/dashbuilder/client/navbar/AppHeader.html   |    14 -
 .../org/dashbuilder/client/navbar/AppHeader.java   |    69 -
 .../client/navbar/DashbuilderNavBrand.java         |    40 -
 .../client/navigation/NavTreeDefinitions.java      |    50 -
 .../client/perspectives/HomePerspective.java       |    41 -
 .../client/resources/i18n/AppConstants.java        |    31 -
 .../resources/images/dashbuilder_user_logo.png     |   Bin 3381 -> 0 bytes
 .../org/dashbuilder/client/screens/HomeScreen.java |    82 -
 .../client/screens/view/HomeScreenView.html        |    57 -
 .../client/screens/view/HomeScreenView.java        |    80 -
 .../client/screens/view/HomeScreenView.less        |   188 -
 .../main/resources/META-INF/ErraiApp.properties    |    70 -
 ...g.uberfire.java.nio.file.spi.FileSystemProvider |     2 -
 .../src/main/resources/app.html.template           |    25 -
 .../src/main/resources/logback.xml                 |    18 -
 .../org/dashbuilder/DashbuilderAuthoring.gwt.xml   |    44 -
 .../FastCompiledDashbuilderAuthoring.gwt.xml       |    13 -
 .../client/resources/i18n/AppConstants.properties  |    21 -
 .../resources/i18n/AppConstants_de.properties      |   417 -
 .../resources/i18n/AppConstants_es.properties      |   461 -
 .../resources/i18n/AppConstants_fr.properties      |   461 -
 .../resources/i18n/AppConstants_ja.properties      |   461 -
 .../resources/i18n/AppConstants_pt_BR.properties   |   417 -
 .../resources/i18n/AppConstants_zh_CN.properties   |   417 -
 .../dashbuilder/public/css/uberfire-loading.css    |    30 -
 .../dashbuilder/public/css/uberfire-showcase.css   |    13 -
 .../org/dashbuilder/public/images/bg-login-top.png |   Bin 4432 -> 0 bytes
 .../org/dashbuilder/public/images/bg-login.png     |   Bin 4769 -> 0 bytes
 .../dashbuilder/public/images/dashbuilder-logo.png |   Bin 5379 -> 0 bytes
 .../org/dashbuilder/public/images/loading-icon.gif |   Bin 3208 -> 0 bytes
 .../src/main/webapp/WEB-INF/beans.xml              |    41 -
 .../src/main/webapp/WEB-INF/datasets/README.md     |    13 -
 .../webapp/WEB-INF/datasets/clusterMetrics.dset    |    16 -
 .../webapp/WEB-INF/datasets/expenseReports.csv     |    51 -
 .../webapp/WEB-INF/datasets/expenseReports.dset    |    23 -
 .../WEB-INF/datasets/salesOpportunities.dset       |    14 -
 .../webapp/WEB-INF/datasets/worldPopulation.csv    |   126 -
 .../webapp/WEB-INF/datasets/worldPopulation.dset   |    20 -
 .../webapp/WEB-INF/jboss-deployment-structure.xml  |    32 -
 .../src/main/webapp/WEB-INF/jboss-web.xml          |     8 -
 .../src/main/webapp/WEB-INF/web.xml                |    65 -
 .../src/main/webapp/banner/banner.html             |    11 -
 .../src/main/webapp/banner/logo.png                |   Bin 1113 -> 0 bytes
 .../src/main/webapp/favicon.ico                    |   Bin 1150 -> 0 bytes
 .../src/main/webapp/images/bg-login-top.png        |   Bin 4432 -> 0 bytes
 .../src/main/webapp/images/bg-login.png            |   Bin 4769 -> 0 bytes
 .../src/main/webapp/images/dashbuilder-logo.png    |   Bin 5379 -> 0 bytes
 .../src/main/webapp/images/dashbuilder_brand.png   |   Bin 5626 -> 0 bytes
 .../src/main/webapp/images/dashbuilder_home_bg.jpg |   Bin 101355 -> 0 bytes
 .../src/main/webapp/images/loading-icon.gif        |   Bin 3208 -> 0 bytes
 .../src/main/webapp/index.html                     |    87 -
 .../src/test/resources/datasources/h2-test-ds.xml  |    10 -
 .../dashbuilder-dataset-cdi/pom.xml                |   190 -
 .../src/main/java/org/dashbuilder/Bootstrap.java   |    80 -
 .../main/java/org/dashbuilder/config/Config.java   |    32 -
 .../java/org/dashbuilder/config/ConfigReader.java  |   192 -
 .../dataprovider/BeanDataSetProviderCDI.java       |    99 -
 .../dataprovider/CSVDataSetProviderCDI.java        |    66 -
 .../dataprovider/DataSetProviderRegistryCDI.java   |    94 -
 .../dataprovider/ExternalDataSetProviderCDI.java   |    52 -
 .../dataprovider/KafkaDataSetProviderCDI.java      |    61 -
 .../dataprovider/PrometheusDataSetProviderCDI.java |    61 -
 .../dataprovider/SQLDataSetProviderCDI.java        |    74 -
 .../dataprovider/SQLDataSourceLocatorCDI.java      |    42 -
 .../dataprovider/StaticDataSetProviderCDI.java     |    28 -
 .../dashbuilder/dataset/DataSetDefDeployerCDI.java |    54 -
 .../dashbuilder/dataset/DataSetDefRegistryCDI.java |   329 -
 .../org/dashbuilder/dataset/DataSetManagerCDI.java |    44 -
 .../dashbuilder/exception/ExceptionManager.java    |    47 -
 .../exception/GenericPortableException.java        |    38 -
 .../org/dashbuilder/scheduler/SchedulerCDI.java    |    39 -
 .../src/main/resources/META-INF/beans.xml          |     0
 .../src/test/java/BootstrapTest.java               |   106 -
 .../dashbuilder/config/ConfigAnnotationTest.java   |    54 -
 .../dataset/DataSetDefRegistryCDITest.java         |   108 -
 .../dataset/DataSetProviderRegistryCDITest.java    |    61 -
 .../dataset/DataSetSubsystemCDITest.java           |   127 -
 .../dataset/SQLDataSourceLocatorCDITest.java       |    65 -
 .../dataset/SQLDataSourceLocatorMock.java          |    46 -
 .../src/test/java/org/dashbuilder/pojo/Bean.java   |    41 -
 .../test/java/org/dashbuilder/pojo/BeanExt.java    |    35 -
 .../java/org/dashbuilder/test/BaseCDITest.java     |    34 -
 .../org/dashbuilder/test/MavenProjectHelper.java   |    94 -
 .../org/dashbuilder/test/ShrinkWrapHelper.java     |    38 -
 .../src/test/resources/META-INF/beans.config       |    18 -
 .../src/test/resources/META-INF/beans.xml          |     0
 .../META-INF/org.dashbuilder.pojo.Bean.config      |    17 -
 .../META-INF/org.dashbuilder.pojo.BeanExt.config   |    17 -
 .../dashbuilder-external-backend/pom.xml           |    76 -
 .../external/ExternalComponentServlet.java         |   128 -
 .../external/impl/BackendComponentFunction.java    |    44 -
 .../impl/BackendComponentFunctionServiceImpl.java  |    57 -
 .../external/impl/ComponentAssetProviderImpl.java  |    87 -
 .../external/impl/ComponentLoaderImpl.java         |   129 -
 .../external/impl/ComponentServiceImpl.java        |    54 -
 .../impl/function/BackendDateFunction.java         |    44 -
 .../src/main/resources/META-INF/beans.xml          |     0
 .../impl/ComponentAssetProviderImplTest.java       |   132 -
 .../external/impl/ComponentLoaderImplTest.java     |   172 -
 .../external/impl/ComponentServiceImplTest.java    |    71 -
 .../dashbuilder-kie-server-backend/pom.xml         |    64 -
 .../KieServerConnectionInfoProviderImpl.java       |   188 -
 .../backend/KieServerDataSetListener.java          |    94 -
 .../backend/RuntimeKieServerDataSetProvider.java   |   427 -
 .../backend/function/ProcessSVGFunction.java       |    98 -
 .../kieserver/backend/rest/BasicAuthFilter.java    |    48 -
 .../backend/rest/KieServerQueryClient.java         |   179 -
 .../kieserver/backend/rest/QueryDefinition.java    |   144 -
 .../kieserver/backend/rest/QueryFilterSpec.java    |    96 -
 .../kieserver/backend/rest/QueryParam.java         |    84 -
 .../kieserver/backend/rest/TokenFilter.java        |    36 -
 .../src/main/resources/META-INF/beans.xml          |     0
 .../KieServerConnectionInfoProviderImplTest.java   |   217 -
 .../RuntimeKieServerDataSetProviderTest.java       |   423 -
 .../dashbuilder-navigation-backend/pom.xml         |   106 -
 .../navigation/service/LayoutTemplateAnalyzer.java |   296 -
 .../navigation/service/NavigationServicesImpl.java |    48 -
 .../service/PerspectivePluginServicesImpl.java     |   102 -
 .../navigation/storage/NavTreeStorage.java         |    65 -
 .../src/main/resources/META-INF/beans.xml          |     0
 .../service/LayoutTemplateAnalyzerTest.java        |   334 -
 .../dashbuilder-services/pom.xml                   |   161 -
 .../dataset/service/DataSetDefServicesImpl.java    |   106 -
 .../dataset/service/DataSetDefVfsServicesImpl.java |   137 -
 .../dataset/service/DataSetExportServicesImpl.java |   339 -
 .../dataset/service/DataSetLookupServicesImpl.java |   112 -
 .../dataset/service/SQLProviderServicesImpl.java   |    45 -
 .../service/RendererSettingsServiceImpl.java       |    29 -
 .../transfer/DataTransferServicesImpl.java         |   503 -
 .../transfer/ExportModelValidationServiceImpl.java |    96 -
 .../transfer/LayoutComponentHelper.java            |    58 -
 .../transfer/rest/DataTransferResource.java        |    88 -
 .../dashbuilder/transfer/rest/FileUploadModel.java |    50 -
 .../src/main/resources/META-INF/beans.xml          |     0
 .../dataset/service/DataSetExportServicesTest.java |   115 -
 .../service/RendererSettingsServiceTest.java       |    31 -
 .../transfer/DataTransferServicesTest.java         |   533 -
 .../ExportModelValidationServiceImplTest.java      |   162 -
 .../transfer/LayoutComponentHelperTest.java        |    95 -
 .../transfer/rest/DataTransferResourceTest.java    |    63 -
 ...g.uberfire.java.nio.file.spi.FileSystemProvider |    18 -
 .../src/test/resources/empty.zip                   |   Bin 22 -> 0 bytes
 .../src/test/resources/import.zip                  |   Bin 23387 -> 0 bytes
 packages/dashbuilder/dashbuilder-backend/pom.xml   |    37 -
 packages/dashbuilder/dashbuilder-bom/pom.xml       |   411 -
 .../dashbuilder-cms-client/pom.xml                 |   182 -
 .../client/cms/ContentManagerEntryPoint.java       |    26 -
 .../layout/editor/PerspectiveDragComponent.java    |    93 -
 .../layout/editor/PerspectiveDragConfigModal.java  |   124 -
 .../editor/PerspectiveDragConfigModalView.css      |    15 -
 .../editor/PerspectiveDragConfigModalView.html     |    21 -
 .../editor/PerspectiveDragConfigModalView.java     |   161 -
 .../cms/perspective/ContentManagerPerspective.java |   158 -
 .../cms/perspective/DataTransferPerspective.java   |    50 -
 .../resources/i18n/ContentManagerConstants.java    |   152 -
 .../cms/resources/i18n/ContentManagerI18n.java     |   140 -
 .../screen/explorer/NavigationExplorerScreen.java  |   130 -
 .../explorer/PerspectivesExplorerScreen.java       |    84 -
 .../cms/screen/home/ContentManagerHomeScreen.java  |    71 -
 .../cms/screen/home/ContentManagerHomeView.html    |    38 -
 .../cms/screen/home/ContentManagerHomeView.java    |    90 -
 .../cms/screen/transfer/DataTransferPopUp.java     |    54 -
 .../cms/screen/transfer/DataTransferPopUpView.html |    21 -
 .../cms/screen/transfer/DataTransferPopUpView.java |   104 -
 .../cms/screen/transfer/DataTransferScreen.java    |   213 -
 .../cms/screen/transfer/DataTransferView.css       |    11 -
 .../cms/screen/transfer/DataTransferView.html      |    60 -
 .../cms/screen/transfer/DataTransferView.java      |   154 -
 .../transfer/export/wizard/DataSetsWizardPage.java |    68 -
 .../export/wizard/ExportSummaryWizardPage.java     |   202 -
 .../export/wizard/ExportSummaryWizardPageView.css  |    36 -
 .../export/wizard/ExportSummaryWizardPageView.html |    45 -
 .../export/wizard/ExportSummaryWizardPageView.java |   262 -
 .../transfer/export/wizard/ExportWizard.java       |   134 -
 .../transfer/export/wizard/PagesWizardPage.java    |    69 -
 .../widget/AssetsTableAbstractPresenter.java       |    73 -
 .../export/wizard/widget/AssetsTableView.css       |    29 -
 .../export/wizard/widget/AssetsTableView.html      |    35 -
 .../export/wizard/widget/AssetsTableView.java      |   213 -
 .../export/wizard/widget/DataSetsTable.java        |    42 -
 .../transfer/export/wizard/widget/PagesTable.java  |    36 -
 .../client/cms/screen/util/DomFactory.java         |    56 -
 .../client/cms/widget/NewPerspectivePopUp.java     |   146 -
 .../client/cms/widget/NewPerspectivePopUpView.css  |    16 -
 .../client/cms/widget/NewPerspectivePopUpView.html |    51 -
 .../client/cms/widget/NewPerspectivePopUpView.java |   208 -
 .../client/cms/widget/PerspectiveWidget.java       |    90 -
 .../client/cms/widget/PerspectiveWidgetView.html   |     1 -
 .../client/cms/widget/PerspectiveWidgetView.java   |    73 -
 .../client/cms/widget/PerspectivesExplorer.java    |   100 -
 .../client/cms/widget/PerspectivesExplorerView.css |     2 -
 .../cms/widget/PerspectivesExplorerView.html       |     1 -
 .../cms/widget/PerspectivesExplorerView.java       |   100 -
 .../main/resources/META-INF/ErraiApp.properties    |    17 -
 .../src/main/resources/META-INF/beans.xml          |     6 -
 .../org/dashbuilder/ContentManagerClient.gwt.xml   |    25 -
 .../i18n/ContentManagerConstants.properties        |    89 -
 .../i18n/ContentManagerConstants_ja.properties     |    64 -
 .../perspective/ContentManagerPerspectiveTest.java |    92 -
 .../explorer/NavigationExplorerScreenTest.java     |    99 -
 .../screen/transfer/DataTransferScreenTest.java    |    94 -
 .../export/wizard/ExportSummaryWizardPageTest.java |    75 -
 .../export/wizard/widget/AssetsTableViewTest.java  |   171 -
 .../client/cms/widget/NewPerspectivePopUpTest.java |   118 -
 .../cms/widget/PerspectivesExplorerTest.java       |    96 -
 .../dashbuilder/common/client/CollectionUtils.java |    92 -
 .../common/client/JsonSourceViewer.java            |   115 -
 .../dashbuilder/common/client/SpacerWidget.java    |    28 -
 .../org/dashbuilder/common/client/StringUtils.java |     4 +
 .../common/client/backend/PathUrlFactory.java      |    51 -
 .../common/client/editor/HasConstrainedValue.java  |    19 -
 .../common/client/editor/HasEditMode.java          |    18 -
 .../common/client/editor/HasRestrictedValue.java   |    25 -
 .../common/client/editor/LeafAttributeEditor.java  |    12 -
 .../common/client/editor/ToggleSwitchEditor.java   |   110 -
 .../client/editor/ToggleSwitchEditorView.java      |    92 -
 .../client/editor/ToggleSwitchEditorView.ui.xml    |    15 -
 .../common/client/editor/ValueBoxEditor.java       |   116 -
 .../common/client/editor/ValueBoxEditorView.java   |    96 -
 .../common/client/editor/ValueBoxEditorView.ui.xml |    13 -
 .../client/editor/file/FileUploadEditor.java       |   221 -
 .../client/editor/file/FileUploadEditorView.java   |   171 -
 .../client/editor/file/FileUploadEditorView.ui.xml |    29 -
 .../common/client/editor/list/DropDownEditor.java  |   235 -
 .../client/editor/list/DropDownEditorView.java     |   108 -
 .../client/editor/list/DropDownEditorView.ui.xml   |    25 -
 .../editor/list/DropDownImageListEditor.java       |    46 -
 .../editor/list/DropDownImageListEditorView.java   |   173 -
 .../editor/list/DropDownImageListEditorView.ui.xml |    39 -
 .../client/editor/list/HorizImageListEditor.java   |    27 -
 .../editor/list/HorizImageListEditorView.java      |   152 -
 .../editor/list/HorizImageListEditorView.ui.xml    |    29 -
 .../common/client/editor/list/ImageListEditor.java |   176 -
 .../client/editor/list/ImageListEditorView.java    |    23 -
 .../common/client/editor/map/MapEditor.java        |   258 -
 .../common/client/editor/map/MapEditorView.java    |   174 -
 .../common/client/editor/map/MapEditorView.ui.xml  |    43 -
 .../common/client/event/ContextualEvent.java       |    20 -
 .../common/client/event/ValueChangeEvent.java      |    32 -
 .../resources/bundles/DashbuilderCommonImages.java |    67 -
 .../bundles/DashbuilderCommonResources.java        |    12 -
 .../bundles/images/slider/default/dragh.png        |   Bin 872 -> 0 bytes
 .../bundles/images/slider/default/dragv.png        |   Bin 166 -> 0 bytes
 .../bundles/images/slider/default/lessh.png        |   Bin 945 -> 0 bytes
 .../bundles/images/slider/default/lessv.png        |   Bin 215 -> 0 bytes
 .../bundles/images/slider/default/moreh.png        |   Bin 945 -> 0 bytes
 .../bundles/images/slider/default/morev.png        |   Bin 209 -> 0 bytes
 .../bundles/images/slider/default/scaleh.png       |   Bin 844 -> 0 bytes
 .../bundles/images/slider/default/scalev.png       |   Bin 839 -> 0 bytes
 .../bundles/images/slider/triangle/drag.png        |   Bin 592 -> 0 bytes
 .../bundles/images/slider/triangle/line.png        |   Bin 129 -> 0 bytes
 .../bundles/images/slider/triangle/more_less.png   |   Bin 125 -> 0 bytes
 .../resources/i18n/DashbuilderCommonConstants.java |    14 +-
 .../resources/i18n/DashbuilderCommonMessages.java  |    16 -
 .../common/client/widgets/AlertPanel.java          |    59 -
 .../common/client/widgets/AlertPanelView.java      |    91 -
 .../common/client/widgets/AlertPanelView.ui.xml    |    44 -
 .../common/client/widgets/CharacterBox.java        |   112 -
 .../common/client/widgets/CharacterBoxBase.java    |    64 -
 .../common/client/widgets/LoadingBox.java          |    39 -
 .../common/client/widgets/LoadingBoxView.java      |    23 -
 .../i18n/DashbuilderCommonConstants.properties     |    14 +-
 .../i18n/DashbuilderCommonMessages.properties      |     1 -
 .../common/client/editor/AbstractEditorTest.java   |    24 -
 .../client/editor/ToggleSwitchEditorTest.java      |   107 -
 .../common/client/editor/ValueBoxEditorTest.java   |   111 -
 .../client/editor/file/FileUploadEditorTest.java   |   261 -
 .../client/editor/list/DropDownEditorTest.java     |   131 -
 .../editor/list/DropDownImageListEditorTest.java   |    90 -
 .../editor/list/HorizImageListEditorTest.java      |    70 -
 .../client/editor/list/ImageListEditorTest.java    |   177 -
 .../common/client/editor/map/MapEditorTest.java    |   178 -
 .../common/client/widgets/LoadingBoxTest.java      |    38 -
 .../dashbuilder-dataset-client/pom.xml             |     5 -
 .../dataset/client/DataSetClientServices.java      |    16 -
 .../dataset/client/DataSetClientServicesImpl.java  |   260 +-
 .../dataset/client/DataSetExportReadyCallback.java |     7 -
 .../editor/BeanDataSetDefAttributesEditor.java     |    25 -
 .../client/editor/BeanDataSetDefEditor.java        |    24 -
 .../editor/CSVDataSetDefAttributesEditor.java      |    41 -
 .../dataset/client/editor/CSVDataSetDefEditor.java |    34 -
 .../dataset/client/editor/ColumnListEditor.java    |    30 -
 .../dataset/client/editor/ColumnTypeEditor.java    |    26 -
 .../dataset/client/editor/DataColumnDefEditor.java |    44 -
 .../DataSetDefBackendCacheAttributesEditor.java    |    22 -
 .../editor/DataSetDefBasicAttributesEditor.java    |    22 -
 .../DataSetDefClientCacheAttributesEditor.java     |    22 -
 .../client/editor/DataSetDefColumnsEditor.java     |    22 -
 .../editor/DataSetDefColumnsFilterEditor.java      |    28 -
 .../dataset/client/editor/DataSetDefEditor.java    |    33 -
 .../client/editor/DataSetDefFilterEditor.java      |    16 -
 .../editor/DataSetDefProviderTypeEditor.java       |    21 -
 .../editor/DataSetDefRefreshAttributesEditor.java  |    25 -
 .../editor/DataSetDefRefreshIntervalEditor.java    |    14 -
 .../editor/ExternalDataSetDefAttributesEditor.java |    37 -
 .../client/editor/ExternalDataSetDefEditor.java    |    21 -
 .../editor/KafkaDataSetDefAttributesEditor.java    |    54 -
 .../client/editor/KafkaDataSetDefEditor.java       |    43 -
 .../PrometheusDataSetDefAttributesEditor.java      |    37 -
 .../client/editor/PrometheusDataSetDefEditor.java  |    30 -
 .../editor/RemoteDataSetDefAttributesEditor.java   |    41 -
 .../client/editor/RemoteDataSetDefEditor.java      |    30 -
 .../editor/SQLDataSetDefAttributesEditor.java      |    29 -
 .../dataset/client/editor/SQLDataSetDefEditor.java |    26 -
 .../resources/bundles/DataSetClientImages.java     |   102 -
 .../resources/bundles/DataSetClientResources.java  |    14 -
 .../resources/bundles/images/cancel_icon_small.gif |   Bin 947 -> 0 bytes
 .../resources/bundles/images/csv_icon_160.png      |   Bin 4915 -> 0 bytes
 .../resources/bundles/images/csv_icon_32.png       |   Bin 1220 -> 0 bytes
 .../resources/bundles/images/date_icon_16.png      |   Bin 677 -> 0 bytes
 .../resources/bundles/images/date_icon_32.png      |   Bin 1187 -> 0 bytes
 .../client/resources/bundles/images/excel_icon.png |   Bin 3348 -> 0 bytes
 .../resources/bundles/images/external_icon_160.png |   Bin 9829 -> 0 bytes
 .../resources/bundles/images/external_icon_32.png  |   Bin 5798 -> 0 bytes
 .../resources/bundles/images/java_icon_160.png     |   Bin 2094 -> 0 bytes
 .../resources/bundles/images/java_icon_32.png      |   Bin 609 -> 0 bytes
 .../resources/bundles/images/kafka_icon_160.png    |   Bin 12153 -> 0 bytes
 .../resources/bundles/images/kafka_icon_32.png     |   Bin 6023 -> 0 bytes
 .../resources/bundles/images/label_icon_16.png     |   Bin 362 -> 0 bytes
 .../resources/bundles/images/label_icon_32.png     |   Bin 689 -> 0 bytes
 .../resources/bundles/images/loading_icon.gif      |   Bin 3199 -> 0 bytes
 .../resources/bundles/images/number_icon_32_V1.png |   Bin 1018 -> 0 bytes
 .../resources/bundles/images/number_icon_32_V2.png |   Bin 1021 -> 0 bytes
 .../resources/bundles/images/number_icon_32_V3.png |   Bin 1012 -> 0 bytes
 .../resources/bundles/images/ok_icon_small.gif     |   Bin 308 -> 0 bytes
 .../bundles/images/prometheus_icon_160.png         |   Bin 12184 -> 0 bytes
 .../bundles/images/prometheus_icon_32.png          |   Bin 8152 -> 0 bytes
 .../resources/bundles/images/sql_icon_160.png      |   Bin 4558 -> 0 bytes
 .../resources/bundles/images/sql_icon_32.png       |   Bin 1239 -> 0 bytes
 .../resources/bundles/images/text_icon_16.png      |   Bin 255 -> 0 bytes
 .../resources/bundles/images/text_icon_32.png      |   Bin 572 -> 0 bytes
 .../dataset/client/AbstractDataSetTest.java        |    14 +-
 .../client/DataSetClientServicesImplTest.java      |    51 +-
 .../dashbuilder-dataset-editor/pom.xml             |   147 -
 .../perspectives/DataSetAuthoringPerspective.java  |    58 -
 .../resources/i18n/DataSetAuthoringConstants.java  |    26 -
 .../screens/DataSetAuthoringHomePresenter.java     |    96 -
 .../client/screens/DataSetAuthoringHomeView.java   |    66 -
 .../client/screens/DataSetAuthoringHomeView.ui.xml |    67 -
 .../client/screens/DataSetDefEditorPresenter.java  |   377 -
 .../client/screens/DataSetDefExplorerScreen.java   |   144 -
 .../client/screens/DataSetDefScreenView.java       |     8 -
 .../client/screens/DataSetDefScreenViewImpl.java   |    45 -
 .../editor/client/screens/DataSetDefType.java      |    84 -
 .../client/screens/DataSetDefWizardScreen.java     |   366 -
 .../main/resources/META-INF/ErraiApp.properties    |    17 -
 .../src/main/resources/META-INF/beans.xml          |    22 -
 .../org/dashbuilder/DataSetEditor.gwt.xml          |    14 -
 .../i18n/DataSetAuthoringConstants.properties      |    17 -
 .../i18n/DataSetAuthoringConstants_de.properties   |    16 -
 .../i18n/DataSetAuthoringConstants_es.properties   |    18 -
 .../i18n/DataSetAuthoringConstants_fr.properties   |    18 -
 .../i18n/DataSetAuthoringConstants_ja.properties   |    18 -
 .../DataSetAuthoringConstants_pt_BR.properties     |    16 -
 .../DataSetAuthoringConstants_zh_CN.properties     |    16 -
 .../screens/DataSetAuthoringHomePresenterTest.java |    89 -
 .../screens/DataSetDefEditorPresenterTest.java     |   327 -
 .../screens/DataSetDefExplorerScreenTest.java      |    91 -
 .../editor/client/screens/DataSetDefTypeTest.java  |    37 -
 .../client/screens/DataSetDefWizardScreenTest.java |   334 -
 .../dashbuilder-displayer-client/pom.xml           |    15 -
 .../displayer/client/DataSetEditHandler.java       |    42 -
 .../displayer/client/DataSetHandlerImpl.java       |    29 +-
 .../displayer/client/DisplayerCoordinator.java     |     5 +-
 .../displayer/client/PerspectiveCoordinator.java   |    90 +
 .../displayer/client/RendererManager.java          |    72 +-
 .../component/ExternalComponentDispatcher.java     |    53 -
 .../component/function/BackendFunctionLoader.java  |    75 -
 .../function/ComponentFunctionLocator.java         |    67 -
 .../client/component/function/GWTVersion.java      |    23 -
 .../client/component/function/ListFunctions.java   |    41 -
 .../client/events/ColumnDetailsChangedEvent.java   |    38 -
 .../client/events/ColumnFilterChangedEvent.java    |    34 -
 .../client/events/ColumnFilterDeletedEvent.java    |    34 -
 .../client/events/DataSetFilterChangedEvent.java   |    38 -
 .../client/events/DataSetGroupDateChanged.java     |    38 -
 .../client/events/DataSetLookupChangedEvent.java   |    38 -
 .../client/events/DisplayerEditorClosedEvent.java  |    38 -
 .../client/events/DisplayerEditorSavedEvent.java   |    38 -
 .../events/DisplayerSettingsChangedEvent.java      |    38 -
 .../events/DisplayerSubtypeSelectedEvent.java      |    38 -
 .../client/events/DisplayerTypeSelectedEvent.java  |    38 -
 .../client/events/GroupFunctionChangedEvent.java   |    38 -
 .../client/events/GroupFunctionDeletedEvent.java   |    38 -
 .../client/prototypes/DataSetPrototypes.java       |   286 -
 .../client/prototypes/DisplayerPrototypes.java     |   359 -
 .../resources/i18n/DisplayerHtmlConstants.java     |    30 -
 .../resources/i18n/DisplayerTypeConstants.java     |   141 -
 .../resources/i18n/MapColorSchemeConstants.java    |    33 -
 .../client/resources/i18n/PositionConstants.java   |    37 -
 .../resources/i18n/SourceCodeEditorConstants.java  |    26 -
 .../i18n/SourceCodeValidatorConstants.java         |    28 -
 .../resources/images/DisplayerImagesResources.java |   163 -
 .../client/widgets/DataSetLookupEditor.java        |   662 -
 .../client/widgets/DataSetLookupEditorView.java    |   285 -
 .../client/widgets/DataSetLookupEditorView.ui.xml  |    72 -
 .../displayer/client/widgets/DisplayerEditor.java  |   552 -
 .../client/widgets/DisplayerEditorPopup.java       |   167 -
 .../client/widgets/DisplayerEditorPopup.ui.xml     |    30 -
 .../client/widgets/DisplayerEditorStatus.java      |    50 -
 .../client/widgets/DisplayerEditorView.java        |   245 -
 .../client/widgets/DisplayerEditorView.ui.xml      |    74 -
 .../client/widgets/DisplayerErrorWidget.html       |    16 +-
 .../client/widgets/DisplayerErrorWidget.java       |    30 +-
 .../client/widgets/DisplayerHtmlEditor.java        |   157 -
 .../client/widgets/DisplayerHtmlEditorView.html    |     8 -
 .../client/widgets/DisplayerHtmlEditorView.java    |   136 -
 .../client/widgets/DisplayerSettingsEditor.java    |   670 -
 .../widgets/DisplayerSettingsEditorView.java       |   350 -
 .../widgets/DisplayerSettingsEditorView.ui.xml     |    28 -
 .../widgets/DisplayerSettingsJSONSourceViewer.java |    53 -
 .../DisplayerSettingsJSONSourceViewer.ui.xml       |    37 -
 .../client/widgets/DisplayerSubtypeSelector.java   |   102 -
 .../widgets/DisplayerSubtypeSelectorView.java      |   146 -
 .../client/widgets/DisplayerTypeSelector.java      |    96 -
 .../client/widgets/DisplayerTypeSelectorView.java  |   112 -
 .../widgets/DisplayerTypeSelectorView.ui.xml       |    30 -
 .../client/widgets/ExternalComponentEditor.java    |    87 -
 .../widgets/ExternalComponentEditorPopUp.java      |    73 -
 .../client/widgets/ExternalComponentEditorView.css |    29 -
 .../widgets/ExternalComponentEditorView.html       |    23 -
 .../widgets/ExternalComponentEditorView.java       |    52 -
 .../widgets/ExternalComponentPropertiesEditor.java |   184 -
 .../ExternalComponentPropertiesEditorView.css      |    25 -
 .../ExternalComponentPropertiesEditorView.html     |    21 -
 .../ExternalComponentPropertiesEditorView.java     |   110 -
 .../client/widgets/filter/ColumnFilterEditor.java  |   419 -
 .../widgets/filter/ColumnFilterEditorView.java     |   175 -
 .../widgets/filter/ColumnFilterEditorView.ui.xml   |    47 -
 .../client/widgets/filter/DataSetFilterEditor.java |   157 -
 .../widgets/filter/DataSetFilterEditorView.java    |   131 -
 .../widgets/filter/DataSetFilterEditorView.ui.xml  |    40 -
 .../widgets/filter/LikeToFunctionEditor.java       |    93 -
 .../widgets/filter/LikeToFunctionEditorView.java   |   105 -
 .../widgets/filter/LikeToFunctionEditorView.ui.xml |    49 -
 .../filter/MultipleNumberParameterEditor.java      |   110 -
 .../filter/MultipleNumberParameterEditorView.java  |    86 -
 .../MultipleNumberParameterEditorView.ui.xml       |    34 -
 .../filter/MultipleTextParameterEditor.java        |   110 -
 .../filter/MultipleTextParameterEditorView.java    |    85 -
 .../filter/MultipleTextParameterEditorView.ui.xml  |    34 -
 .../client/widgets/filter/TextParameterEditor.java |    84 -
 .../widgets/filter/TextParameterEditorView.java    |    85 -
 .../widgets/filter/TextParameterEditorView.ui.xml  |    34 -
 .../client/widgets/filter/TimeAmountEditor.java    |   134 -
 .../widgets/filter/TimeAmountEditorView.java       |   118 -
 .../widgets/filter/TimeAmountEditorView.ui.xml     |    33 -
 .../client/widgets/filter/TimeFrameEditor.java     |   203 -
 .../client/widgets/filter/TimeFrameEditorView.java |    98 -
 .../widgets/filter/TimeFrameEditorView.ui.xml      |    41 -
 .../client/widgets/filter/TimeInstantEditor.java   |   159 -
 .../widgets/filter/TimeInstantEditorView.java      |   118 -
 .../widgets/filter/TimeInstantEditorView.ui.xml    |    32 -
 .../client/widgets/group/ColumnDetailsEditor.java  |    77 -
 .../widgets/group/ColumnDetailsEditorView.java     |    66 -
 .../widgets/group/ColumnDetailsEditorView.ui.xml   |    30 -
 .../client/widgets/group/ColumnFunctionEditor.java |   205 -
 .../widgets/group/ColumnFunctionEditorView.java    |   182 -
 .../widgets/group/ColumnFunctionEditorView.ui.xml  |    46 -
 .../widgets/group/DataSetGroupDateEditor.java      |   274 -
 .../widgets/group/DataSetGroupDateEditorView.java  |   216 -
 .../group/DataSetGroupDateEditorView.ui.xml        |    63 -
 .../widgets/sourcecode/DefaultHtmlValidator.java   |    33 -
 .../widgets/sourcecode/DefaultJsEvaluator.java     |    31 -
 .../widgets/sourcecode/DefaultJsValidator.java     |   149 -
 .../client/widgets/sourcecode/HasHtmlTemplate.java |    25 -
 .../client/widgets/sourcecode/HasJsTemplate.java   |    25 -
 .../client/widgets/sourcecode/HtmlValidator.java   |    27 -
 .../client/widgets/sourcecode/JsEvaluator.java     |    21 -
 .../client/widgets/sourcecode/JsValidator.java     |    30 -
 .../widgets/sourcecode/SourceCodeEditor.java       |   142 -
 .../widgets/sourcecode/SourceCodeEditorView.css    |    18 -
 .../widgets/sourcecode/SourceCodeEditorView.html   |    15 -
 .../widgets/sourcecode/SourceCodeEditorView.java   |   164 -
 .../client/widgets/sourcecode/SourceCodeType.java  |    21 -
 .../org/dashbuilder/DisplayerClient.gwt.xml        |     2 -
 .../i18n/DisplayerHtmlConstants.properties         |    19 -
 .../i18n/DisplayerHtmlConstants_es.properties      |    20 -
 .../i18n/DisplayerHtmlConstants_fr.properties      |    20 -
 .../i18n/DisplayerHtmlConstants_ja.properties      |    20 -
 .../i18n/DisplayerTypeConstants.properties         |    77 -
 .../i18n/DisplayerTypeConstants_de.properties      |    40 -
 .../i18n/DisplayerTypeConstants_es.properties      |    77 -
 .../i18n/DisplayerTypeConstants_fr.properties      |    77 -
 .../i18n/DisplayerTypeConstants_ja.properties      |    77 -
 .../i18n/DisplayerTypeConstants_pt_BR.properties   |    40 -
 .../i18n/DisplayerTypeConstants_zh_CN.properties   |    40 -
 .../i18n/MapColorSchemeConstants.properties        |    20 -
 .../resources/i18n/PositionConstants.properties    |    23 -
 .../resources/i18n/PositionConstants_de.properties |     5 -
 .../resources/i18n/PositionConstants_es.properties |    24 -
 .../resources/i18n/PositionConstants_fr.properties |    24 -
 .../resources/i18n/PositionConstants_ja.properties |    24 -
 .../i18n/PositionConstants_pt_BR.properties        |     5 -
 .../i18n/PositionConstants_zh_CN.properties        |     5 -
 .../i18n/SourceCodeEditorConstants.properties      |    17 -
 .../i18n/SourceCodeEditorConstants_es.properties   |    18 -
 .../i18n/SourceCodeEditorConstants_fr.properties   |    18 -
 .../i18n/SourceCodeEditorConstants_ja.properties   |    18 -
 .../i18n/SourceCodeValidatorConstants.properties   |    18 -
 .../SourceCodeValidatorConstants_es.properties     |    19 -
 .../SourceCodeValidatorConstants_fr.properties     |    19 -
 .../SourceCodeValidatorConstants_ja.properties     |    19 -
 .../client/resources/images/area_selected.png      |   Bin 4435 -> 0 bytes
 .../resources/images/area_stacked_selected.png     |   Bin 4998 -> 0 bytes
 .../resources/images/area_stacked_unselected.png   |   Bin 3271 -> 0 bytes
 .../client/resources/images/area_unselected.png    |   Bin 2814 -> 0 bytes
 .../client/resources/images/bar_selected.png       |   Bin 408 -> 0 bytes
 .../resources/images/bar_stacked_selected.png      |   Bin 386 -> 0 bytes
 .../resources/images/bar_stacked_unselected.png    |   Bin 761 -> 0 bytes
 .../client/resources/images/bar_unselected.png     |   Bin 617 -> 0 bytes
 .../client/resources/images/bubble_default.png     |   Bin 2952 -> 0 bytes
 .../client/resources/images/column_selected.png    |   Bin 411 -> 0 bytes
 .../resources/images/column_stacked_selected.png   |   Bin 443 -> 0 bytes
 .../resources/images/column_stacked_unselected.png |   Bin 785 -> 0 bytes
 .../client/resources/images/column_unselected.png  |   Bin 757 -> 0 bytes
 .../client/resources/images/donut_selected.png     |   Bin 4412 -> 0 bytes
 .../client/resources/images/donut_unselected.png   |   Bin 3542 -> 0 bytes
 .../client/resources/images/line_selected.png      |   Bin 3495 -> 0 bytes
 .../resources/images/line_smooth_selected.png      |   Bin 3821 -> 0 bytes
 .../resources/images/line_smooth_unselected.png    |   Bin 3370 -> 0 bytes
 .../client/resources/images/line_unselected.png    |   Bin 2998 -> 0 bytes
 .../resources/images/map_markers_selected.png      |   Bin 8586 -> 0 bytes
 .../resources/images/map_markers_unselected.png    |   Bin 5096 -> 0 bytes
 .../resources/images/map_regions_selected.png      |   Bin 9621 -> 0 bytes
 .../resources/images/map_regions_unselected.png    |   Bin 5655 -> 0 bytes
 .../client/resources/images/meter_default.png      |   Bin 4100 -> 0 bytes
 .../resources/images/metric_card2_selected.png     |   Bin 4284 -> 0 bytes
 .../resources/images/metric_card2_unselected.png   |   Bin 4242 -> 0 bytes
 .../resources/images/metric_card_selected.png      |   Bin 3000 -> 0 bytes
 .../resources/images/metric_card_unselected.png    |   Bin 3714 -> 0 bytes
 .../resources/images/metric_plaintext_selected.png |   Bin 1562 -> 0 bytes
 .../images/metric_plaintext_unselected.png         |   Bin 1487 -> 0 bytes
 .../resources/images/metric_quota_selected.png     |   Bin 1946 -> 0 bytes
 .../resources/images/metric_quota_unselected.png   |   Bin 1879 -> 0 bytes
 .../client/resources/images/pie_3d_selected.png    |   Bin 5166 -> 0 bytes
 .../client/resources/images/pie_3d_unselected.png  |   Bin 2970 -> 0 bytes
 .../client/resources/images/pie_selected.png       |   Bin 4647 -> 0 bytes
 .../client/resources/images/pie_unselected.png     |   Bin 2934 -> 0 bytes
 .../images/selector_dropdown_selected.png          |   Bin 2953 -> 0 bytes
 .../images/selector_dropdown_unselected.png        |   Bin 2150 -> 0 bytes
 .../resources/images/selector_labels_selected.png  |   Bin 2634 -> 0 bytes
 .../images/selector_labels_unselected.png          |   Bin 2636 -> 0 bytes
 .../resources/images/selector_slider_selected.png  |   Bin 2502 -> 0 bytes
 .../images/selector_slider_unselected.png          |   Bin 1619 -> 0 bytes
 .../client/resources/images/table_default.png      |   Bin 2289 -> 0 bytes
 .../displayer/client/DisplayerExportTest.java      |   172 -
 .../displayer/client/RendererManagerTest.java      |    39 +-
 .../component/ExternalComponentDispatcherTest.java |   122 -
 .../function/ComponentFunctionLocatorTest.java     |    56 -
 .../client/widgets/DataSetLookupEditorTest.java    |   491 -
 .../client/widgets/DisplayerEditorTest.java        |   303 -
 .../client/widgets/DisplayerHtmlEditorTest.java    |    75 -
 .../widgets/DisplayerSettingsEditorTest.java       |   396 -
 .../widgets/DisplayerSubtypeSelectorTest.java      |   101 -
 .../client/widgets/DisplayerTypeSelectorTest.java  |    81 -
 .../ExternalComponentPropertiesEditorTest.java     |   114 -
 .../widgets/filter/ColumnFilterEditorTest.java     |   247 -
 .../widgets/filter/DataSetFilterEditorTest.java    |   168 -
 .../widgets/filter/LikeToFunctionEditorTest.java   |    65 -
 .../filter/MultipleNumberParameterEditorTest.java  |   122 -
 .../filter/MultipleTextParameterEditorTest.java    |   100 -
 .../widgets/filter/NumberParameterEditorTest.java  |    75 -
 .../widgets/filter/TextParameterEditorTest.java    |    65 -
 .../widgets/filter/TimeAmountEditorTest.java       |    89 -
 .../client/widgets/filter/TimeFrameEditorTest.java |   149 -
 .../widgets/filter/TimeInstantEditorTest.java      |   141 -
 .../widgets/group/ColumnFunctionEditorTest.java    |   196 -
 .../widgets/group/DataSetGroupDateEditorTest.java  |   164 -
 .../client/widgets/sourcecode/JsValidatorTest.java |   150 -
 .../widgets/sourcecode/SourceCodeEditorTest.java   |   106 -
 .../dashbuilder-displayer-editor/pom.xml           |     5 -
 .../client/editor/AreaChartDragComponent.java      |    55 -
 .../client/editor/BarChartDragComponent.java       |    55 -
 .../client/editor/BubbleChartDragComponent.java    |    50 -
 .../client/editor/DisplayerDragComponent.java      |    90 +-
 .../client/editor/DisplayerEditorEntryPoint.java   |    35 -
 .../client/editor/LineChartDragComponent.java      |    55 -
 .../client/editor/MapChartDragComponent.java       |    55 -
 .../client/editor/MeterChartDragComponent.java     |    55 -
 .../client/editor/MetricDragComponent.java         |    55 -
 .../PerspectiveEditorReportingGroupProvider.java   |    89 -
 .../client/editor/PieChartDragComponent.java       |    55 -
 .../client/editor/SelectorDragComponent.java       |    55 -
 .../client/editor/TableDragComponent.java          |    55 -
 .../editor/external/ComponentGroupProducer.java    |   123 -
 .../editor/external/ExternalComponentDragDef.java  |    70 -
 .../external/ExternalDisplayerDragComponent.java   |   118 -
 .../editor/external/ExternalDragComponent.java     |    95 +-
 .../client/editor/resources/i18n/Constants.java    |    54 -
 .../editor/resources/i18n/Constants.properties     |    31 -
 .../editor/resources/i18n/Constants_de.properties  |     1 -
 .../editor/resources/i18n/Constants_es.properties  |    30 -
 .../editor/resources/i18n/Constants_fr.properties  |    30 -
 .../editor/resources/i18n/Constants_ja.properties  |    30 -
 .../resources/i18n/Constants_pt_BR.properties      |     1 -
 .../resources/i18n/Constants_zh_CN.properties      |     1 -
 .../client/editor/DisplayerDragComponentTest.java  |    46 -
 ...erspectiveEditorReportingGroupProviderTest.java |    63 -
 .../ExternalComponentGroupProviderTest.java        |    73 -
 .../dashbuilder-displayer-screen/pom.xml           |    77 -
 .../displayer/client/DisplayerScreenPresenter.java |   346 -
 .../displayer/client/PerspectiveCoordinator.java   |   143 -
 .../displayer/client/resources/i18n/Constants.java |    41 -
 .../main/resources/META-INF/ErraiApp.properties    |    17 -
 .../src/main/resources/META-INF/beans.xml          |     6 -
 .../org/dashbuilder/DisplayerScreen.gwt.xml        |    12 -
 .../client/resources/i18n/Constants.properties     |    24 -
 .../client/resources/i18n/Constants_de.properties  |     7 -
 .../client/resources/i18n/Constants_es.properties  |    25 -
 .../client/resources/i18n/Constants_fr.properties  |    25 -
 .../client/resources/i18n/Constants_ja.properties  |    25 -
 .../resources/i18n/Constants_pt_BR.properties      |     7 -
 .../resources/i18n/Constants_zh_CN.properties      |     7 -
 .../client/PerspectiveCoordinatorTest.java         |    39 -
 .../dashbuilder-navigation-client/pom.xml          |    20 -
 .../client/navigation/NavBarHelper.java            |   114 -
 .../event/NavItemEditCancelledEvent.java           |    35 -
 .../navigation/event/NavItemEditStartedEvent.java  |    35 -
 .../client/navigation/event/NavItemGotoEvent.java  |    35 -
 .../navigation/event/NavTreeLoadedEvent.java       |    34 -
 .../navigation/impl/NavigationManagerImpl.java     |    50 +-
 .../layout/editor/AbstractNavDragComponent.java    |    85 +-
 .../layout/editor/NavCarouselDragComponent.java    |    17 +-
 .../navigation/layout/editor/NavDragComponent.java |     7 +-
 .../layout/editor/NavMenuBarDragComponent.java     |    17 +-
 .../layout/editor/NavTabListDragComponent.java     |    17 +-
 .../layout/editor/NavTilesDragComponent.java       |    17 +-
 .../layout/editor/NavTreeDragComponent.java        |    17 +-
 .../plugin/PerspectivePluginEntryPoint.java        |    37 -
 .../plugin/PerspectivePluginManager.java           |     9 -
 .../plugin/PerspectivePluginManagerImpl.java       |   229 -
 .../navigation/widget/NavCarouselWidget.java       |    20 +-
 .../navigation/widget/NavComponentConfigModal.java |   291 -
 .../widget/NavComponentConfigModalView.java        |   284 -
 .../client/navigation/widget/NavTilesWidget.java   |    13 -
 .../widget/ScreenLayoutDragComponent.java          |    59 +
 .../navigation/widget/TargetDivNavWidget.java      |    16 +-
 .../widget/editor/NavItemDefaultEditor.java        |    50 -
 .../widget/editor/NavItemDefaultEditorView.css     |    85 -
 .../widget/editor/NavItemDefaultEditorView.html    |    32 -
 .../widget/editor/NavItemDefaultEditorView.java    |   304 -
 .../navigation/widget/editor/NavItemEditor.java    |   926 --
 .../widget/editor/NavItemEditorSettings.java       |   253 -
 .../widget/editor/NavItemEditorView.java           |    70 -
 .../widget/editor/NavRootNodeEditor.java           |    62 -
 .../widget/editor/NavRootNodeEditorView.css        |    85 -
 .../widget/editor/NavRootNodeEditorView.html       |    32 -
 .../widget/editor/NavRootNodeEditorView.java       |   303 -
 .../navigation/widget/editor/NavTreeEditor.java    |   202 -
 .../navigation/widget/editor/NavTreeEditorView.css |    13 -
 .../widget/editor/NavTreeEditorView.html           |    11 -
 .../widget/editor/NavTreeEditorView.java           |   167 -
 .../widget/editor/TargetPerspectiveEditor.java     |   179 -
 .../widget/editor/TargetPerspectiveEditorView.css  |    15 -
 .../widget/editor/TargetPerspectiveEditorView.html |    19 -
 .../widget/editor/TargetPerspectiveEditorView.java |   127 -
 .../navigation/NavComponentConfigModalTest.java    |   145 -
 .../plugin/PerspectivePluginManagerImplTest.java   |   147 -
 .../widget/editor/NavItemEditorTest.java           |   370 -
 .../widget/editor/NavTreeEditorTest.java           |   440 -
 .../widget/editor/TargetPerspectiveEditorTest.java |   115 -
 .../renderer/client/metric/MetricDisplayer.java    |    55 +-
 .../client/selector/SelectorSliderDisplayer.java   |     2 +-
 .../renderer/client/table/TableDisplayer.java      |     6 +-
 .../renderer/client/table/TableDisplayerTest.java  |    13 +-
 .../echarts/client/EChartsAbstractDisplayer.java   |     9 +
 .../echarts/client/EChartsDisplayerView.java       |    31 +-
 .../client/EChartsResizeHandlerRegister.java       |    50 +
 .../dashbuilder-client/dashbuilder-widgets/pom.xml |   161 -
 .../common/ClientRuntimeErrorPopupPresenter.java   |    46 -
 .../client/widgets/common/DataSetEditorPlugin.java |    35 -
 .../editor/DataSetDefColumnsFilterEditor.java      |   181 -
 .../editor/DataSetDefColumnsFilterEditorView.java  |    70 -
 .../DataSetDefColumnsFilterEditorView.ui.xml       |    41 -
 .../dataset/editor/DataSetDefFilterEditor.java     |   103 -
 .../dataset/editor/DataSetDefFilterEditorView.java |    42 -
 .../editor/DataSetDefFilterEditorView.ui.xml       |     7 -
 .../dataset/editor/DataSetDefPreviewTable.java     |   170 -
 .../dataset/editor/DataSetDefPreviewTableView.java |    57 -
 .../editor/DataSetDefPreviewTableView.ui.xml       |    16 -
 .../editor/DataSetDefProviderTypeEditor.java       |   221 -
 .../editor/DataSetDefProviderTypeEditorView.java   |    41 -
 .../editor/DataSetDefProviderTypeEditorView.ui.xml |    25 -
 .../widgets/dataset/editor/DataSetEditor.java      |   413 -
 .../widgets/dataset/editor/DataSetEditorView.java  |   215 -
 .../dataset/editor/DataSetEditorView.ui.xml        |   117 -
 .../DataSetDefBackendCacheAttributesEditor.java    |   154 -
 .../DataSetDefBasicAttributesEditor.java           |    89 -
 .../DataSetDefBasicAttributesEditorView.java       |    44 -
 .../DataSetDefBasicAttributesEditorView.ui.xml     |    57 -
 .../DataSetDefCacheAttributesEditorView.java       |    29 -
 .../DataSetDefCacheAttributesEditorViewImpl.java   |    94 -
 .../DataSetDefCacheAttributesEditorViewImpl.ui.xml |    48 -
 .../DataSetDefClientCacheAttributesEditor.java     |   154 -
 .../DataSetDefRefreshAttributesEditor.java         |   136 -
 .../DataSetDefRefreshAttributesEditorView.java     |    75 -
 .../DataSetDefRefreshAttributesEditorView.ui.xml   |    49 -
 .../DataSetDefRefreshIntervalEditor.java           |   123 -
 .../DataSetDefRefreshIntervalEditorView.java       |    97 -
 .../DataSetDefRefreshIntervalEditorView.ui.xml     |    22 -
 .../bean/BeanDataSetDefAttributesEditor.java       |    88 -
 .../bean/BeanDataSetDefAttributesEditorView.java   |    45 -
 .../bean/BeanDataSetDefAttributesEditorView.ui.xml |    64 -
 .../dataset/editor/bean/BeanDataSetEditor.java     |    87 -
 .../dataset/editor/column/ColumnListEditor.java    |   370 -
 .../editor/column/ColumnListEditorView.java        |    82 -
 .../editor/column/ColumnListEditorView.ui.xml      |     9 -
 .../dataset/editor/column/ColumnTypeEditor.java    |   218 -
 .../dataset/editor/column/DataColumnDefEditor.java |   114 -
 .../editor/column/DataColumnDefEditorView.java     |    44 -
 .../editor/column/DataColumnDefEditorView.ui.xml   |    31 -
 .../editor/column/DataSetDefColumnsEditor.java     |   114 -
 .../editor/csv/CSVDataSetDefAttributesEditor.java  |   233 -
 .../csv/CSVDataSetDefAttributesEditorView.java     |    99 -
 .../csv/CSVDataSetDefAttributesEditorView.ui.xml   |   160 -
 .../dataset/editor/csv/CSVDataSetEditor.java       |   121 -
 .../driver/BeanDataSetDefAttributesDriver.java     |    13 -
 .../editor/driver/BeanDataSetDefDriver.java        |    13 -
 .../driver/CSVDataSetDefAttributesDriver.java      |    13 -
 .../dataset/editor/driver/CSVDataSetDefDriver.java |    13 -
 .../dataset/editor/driver/DataColumnDefDriver.java |    13 -
 .../driver/DataSetDefBasicAttributesDriver.java    |    13 -
 .../driver/DataSetDefProviderTypeDriver.java       |    13 -
 .../editor/driver/DataSetEditorDriverFactory.java  |   104 -
 .../driver/ExternalDataSetDefAttributesDriver.java |    12 -
 .../editor/driver/ExternalDataSetDefDriver.java    |    12 -
 .../driver/KafkaDataSetDefAttributesDriver.java    |    27 -
 .../editor/driver/KafkaDataSetDefDriver.java       |    27 -
 .../PrometheusDataSetDefAttributesDriver.java      |    27 -
 .../editor/driver/PrometheusDataSetDefDriver.java  |    27 -
 .../driver/RemoteDataSetDefAttributesDriver.java   |    28 -
 .../editor/driver/RemoteDataSetDefDriver.java      |    28 -
 .../driver/SQLDataSetDefAttributesDriver.java      |    13 -
 .../dataset/editor/driver/SQLDataSetDefDriver.java |    13 -
 .../ExternalDataSetDefAttributesEditor.java        |   103 -
 .../ExternalDataSetDefAttributesEditorView.java    |    40 -
 .../ExternalDataSetDefAttributesEditorView.ui.xml  |    48 -
 .../editor/external/ExternalDataSetEditor.java     |    81 -
 .../kafka/KafkaDataSetDefAttributesEditor.java     |   225 -
 .../kafka/KafkaDataSetDefAttributesEditorView.java |   129 -
 .../KafkaDataSetDefAttributesEditorView.ui.xml     |   206 -
 .../dataset/editor/kafka/KafkaDataSetEditor.java   |   118 -
 .../editor/kafka/MetricsTargetEditorAdapter.java   |    71 -
 .../PrometheusDataSetDefAttributesEditor.java      |   114 -
 .../PrometheusDataSetDefAttributesEditorView.java  |    59 -
 ...PrometheusDataSetDefAttributesEditorView.ui.xml |    87 -
 .../editor/prometheus/PrometheusDataSetEditor.java |    86 -
 .../RemoteDataSetDefAttributesEditorImpl.java      |   177 -
 .../RemoteDataSetDefAttributesEditorView.java      |    73 -
 .../RemoteDataSetDefAttributesEditorView.ui.xml    |    95 -
 .../dataset/editor/remote/RemoteDataSetEditor.java |   106 -
 .../remote/RemoteDataSetEditorDriverFactory.java   |    44 -
 .../editor/remote/RemoteDataSetEditorPlugin.java   |    65 -
 .../editor/sql/SQLDataSetDefAttributesEditor.java  |   188 -
 .../sql/SQLDataSetDefAttributesEditorView.java     |    97 -
 .../sql/SQLDataSetDefAttributesEditorView.ui.xml   |   101 -
 .../dataset/editor/sql/SQLDataSetEditor.java       |   112 -
 .../editor/workflow/DataSetEditorWorkflow.java     |   275 -
 .../workflow/DataSetEditorWorkflowFactory.java     |   138 -
 .../editor/workflow/DataSetEditorWorkflowView.java |    87 -
 .../workflow/DataSetEditorWorkflowView.ui.xml      |    25 -
 .../create/BeanDataSetBasicAttributesWorkflow.java |    64 -
 .../create/CSVDataSetBasicAttributesWorkflow.java  |    87 -
 .../create/DataSetBasicAttributesWorkflow.java     |   139 -
 .../create/DataSetProviderTypeWorkflow.java        |   120 -
 .../ExternalDataSetBasicAttributesWorkflow.java    |    78 -
 .../KafkaDataSetBasicAttributesWorkflow.java       |    76 -
 .../PrometheusDataSetBasicAttributesWorkflow.java  |    76 -
 .../RemoteDataSetBasicAttributesWorkflow.java      |   132 -
 .../create/SQLDataSetBasicAttributesWorkflow.java  |    88 -
 .../workflow/edit/BeanDataSetEditWorkflow.java     |    63 -
 .../workflow/edit/CSVDataSetEditWorkflow.java      |    86 -
 .../editor/workflow/edit/DataSetEditWorkflow.java  |   156 -
 .../workflow/edit/ExternalDataSetEditWorkflow.java |    75 -
 .../workflow/edit/KafkaDataSetEditWorkflow.java    |    75 -
 .../edit/PrometheusDataSetEditWorkflow.java        |    75 -
 .../workflow/edit/RemoteDataSetEditWorkflow.java   |   135 -
 .../workflow/edit/SQLDataSetEditWorkflow.java      |    92 -
 .../widgets/dataset/event/CancelRequestEvent.java  |    21 -
 .../widgets/dataset/event/ColumnsChangedEvent.java |    31 -
 .../event/DataSetDefCreationRequestEvent.java      |    44 -
 .../widgets/dataset/event/EditDataSetEvent.java    |    28 -
 .../client/widgets/dataset/event/ErrorEvent.java   |    55 -
 .../widgets/dataset/event/FilterChangedEvent.java  |    35 -
 .../widgets/dataset/event/SaveRequestEvent.java    |    21 -
 .../widgets/dataset/event/TabChangedEvent.java     |    28 -
 .../dataset/event/TestDataSetRequestEvent.java     |    21 -
 .../widgets/dataset/explorer/DataSetExplorer.java  |   194 -
 .../dataset/explorer/DataSetExplorerView.java      |    78 -
 .../dataset/explorer/DataSetExplorerView.ui.xml    |    42 -
 .../widgets/dataset/explorer/DataSetPanel.java     |   201 -
 .../widgets/dataset/explorer/DataSetPanelView.java |   149 -
 .../dataset/explorer/DataSetPanelView.ui.xml       |    51 -
 .../widgets/dataset/explorer/DataSetSummary.java   |   192 -
 .../dataset/explorer/DataSetSummaryView.java       |   134 -
 .../dataset/explorer/DataSetSummaryView.ui.xml     |    67 -
 .../resources/i18n/DataSetEditorConstants.java     |   197 -
 .../resources/i18n/DataSetExplorerConstants.java   |    58 -
 .../main/resources/META-INF/ErraiApp.properties    |    17 -
 .../src/main/resources/META-INF/beans.xml          |     6 -
 .../org/dashbuilder/CommonWidgets.gwt.xml          |    23 -
 .../i18n/DataSetEditorConstants.properties         |   165 -
 .../i18n/DataSetEditorConstants_de.properties      |   104 -
 .../i18n/DataSetEditorConstants_es.properties      |   119 -
 .../i18n/DataSetEditorConstants_fr.properties      |   119 -
 .../i18n/DataSetEditorConstants_ja.properties      |   119 -
 .../i18n/DataSetEditorConstants_pt_BR.properties   |   104 -
 .../i18n/DataSetEditorConstants_zh_CN.properties   |   104 -
 .../i18n/DataSetExplorerConstants.properties       |    28 -
 .../i18n/DataSetExplorerConstants_de.properties    |    25 -
 .../i18n/DataSetExplorerConstants_es.properties    |    25 -
 .../i18n/DataSetExplorerConstants_fr.properties    |    25 -
 .../i18n/DataSetExplorerConstants_ja.properties    |    25 -
 .../i18n/DataSetExplorerConstants_pt_BR.properties |    25 -
 .../i18n/DataSetExplorerConstants_zh_CN.properties |    25 -
 .../ClientRuntimeErrorPopupPresenterTest.java      |    45 -
 .../widgets/common/CustomDataSetProviderType.java  |    50 -
 .../editor/DataSetDefColumnsFilterEditorTest.java  |   132 -
 .../dataset/editor/DataSetDefFilterEditorTest.java |    81 -
 .../dataset/editor/DataSetDefPreviewTableTest.java |   148 -
 .../editor/DataSetDefProviderTypeEditorTest.java   |   102 -
 .../widgets/dataset/editor/DataSetEditorTest.java  |   380 -
 ...DataSetDefBackendCacheAttributesEditorTest.java |   150 -
 .../DataSetDefBasicAttributesEditorTest.java       |    49 -
 .../DataSetDefClientCacheAttributesEditorTest.java |   150 -
 .../DataSetDefRefreshAttributesEditorTest.java     |   117 -
 .../DataSetDefRefreshIntervalEditorTest.java       |   132 -
 .../bean/BeanDataSetDefAttributesEditorTest.java   |    51 -
 .../dataset/editor/bean/BeanDataSetEditorTest.java |    70 -
 .../editor/column/ColumnListEditorTest.java        |   428 -
 .../editor/column/ColumnTypeEditorTest.java        |   113 -
 .../editor/column/DataColumnDefEditorTest.java     |   101 -
 .../editor/column/DataSetDefColumnsEditorTest.java |   120 -
 .../csv/CSVDataSetDefAttributesEditorTest.java     |   166 -
 .../dataset/editor/csv/CSVDataSetEditorTest.java   |    87 -
 .../sql/SQLDataSetDefAttributesEditorTest.java     |   128 -
 .../dataset/editor/sql/SQLDataSetEditorTest.java   |    72 -
 .../workflow/AbstractDataSetWorkflowTest.java      |    59 -
 .../editor/workflow/DataSetEditorWorkflowTest.java |   302 -
 .../BeanDataSetBasicAttributesWorkflowTest.java    |    89 -
 .../CSVDataSetBasicAttributesWorkflowTest.java     |   125 -
 .../create/DataSetBasicAttributesWorkflowTest.java |   122 -
 .../create/DataSetProviderTypeWorkflowTest.java    |   115 -
 .../SQLDataSetBasicAttributesWorkflowTest.java     |   124 -
 .../workflow/edit/BeanDataSetEditWorkflowTest.java |    83 -
 .../workflow/edit/CSVDataSetEditWorkflowTest.java  |   123 -
 .../workflow/edit/DataSetEditWorkflowTest.java     |   213 -
 .../workflow/edit/SQLDataSetEditWorkflowTest.java  |   123 -
 .../dataset/explorer/DataSetExplorerTest.java      |   231 -
 .../widgets/dataset/explorer/DataSetPanelTest.java |   152 -
 .../dataset/explorer/DataSetSummaryTest.java       |   160 -
 packages/dashbuilder/dashbuilder-client/pom.xml    |     4 -
 .../dashbuilder-project-storage/pom.xml            |    28 -
 .../project/storage/ProjectStorageServices.java    |    84 -
 .../project/storage/annotations/ProjectUpdate.java |    32 -
 .../project/storage/event/ProjectUpdated.java      |    25 -
 .../storage/impl/ProjectStorageServicesImpl.java   |   330 -
 .../impl/ProjectStorageUpdateInterceptor.java      |    42 -
 .../src/main/resources/META-INF/beans.xml          |     6 -
 .../storage/ProjectStorageServicesTest.java        |    37 -
 .../impl/ProjectStorageServicesImplTest.java       |   223 -
 ...g.uberfire.java.nio.file.spi.FileSystemProvider |    18 -
 .../src/test/resources/empty.zip                   |   Bin 22 -> 0 bytes
 .../src/test/resources/import.zip                  |   Bin 23387 -> 0 bytes
 .../dashbuilder-runtime-app/README.md              |    30 -
 .../dashbuilder-runtime-app/pom.xml                |   499 -
 .../src/main/docker/Dockerfile.fast-jar            |    54 -
 .../src/main/docker/Dockerfile.jvm                 |    51 -
 .../src/main/docker/Dockerfile.native              |    27 -
 .../backend/DataSetContentListener.java            |   165 -
 .../backend/ExternalComponentsContentListener.java |    55 -
 .../dashbuilder/backend/RuntimeModelLoader.java    |   101 -
 .../backend/RuntimeModelWatcherServiceManager.java |   169 -
 .../org/dashbuilder/backend/RuntimeOptions.java    |   239 -
 .../dashbuilder/backend/ServerSideProducers.java   |    35 -
 .../backend/channel/RuntimeChannel.java            |    94 -
 .../dashbuilder/backend/health/HealthService.java  |    51 -
 .../backend/helper/PartitionHelper.java            |    40 -
 .../backend/model/RuntimeModelFileInfo.java        |    41 -
 .../navigation/RuntimeNavigationBuilder.java       |   188 -
 .../remote/services/RuntimeModelServiceImpl.java   |   128 -
 .../resources/ComponentFunctionResource.java       |    62 -
 .../backend/resources/DataSetResource.java         |    91 -
 .../backend/resources/FileUploadModel.java         |    38 -
 .../backend/resources/RuntimeJaxApp.java           |    25 -
 .../backend/resources/RuntimeModelResource.java    |    59 -
 .../backend/resources/UploadResourceImpl.java      |   156 -
 .../resources/api/DashbuilderRuntimeResource.java  |    96 -
 .../resources/marshalling/DataSetLookupReader.java |    57 -
 .../resources/marshalling/DataSetMetadaWriter.java |    60 -
 .../resources/marshalling/DataSetWriter.java       |    62 -
 .../resources/marshalling/RuntimeModelWriter.java  |    56 -
 .../marshalling/RuntimeServiceResponseWriter.java  |    56 -
 .../backend/services/RuntimeInfoService.java       |    45 -
 .../services/dataset/DataSetServicesProducer.java  |   126 -
 .../services/dataset/RuntimeCSVFileStorage.java    |    78 -
 .../provider/RuntimeBeanDataSetProvider.java       |    78 -
 .../provider/RuntimeDataSetProviderRegistry.java   |    89 -
 .../provider/RuntimeSQLDataSourceLocator.java      |    61 -
 .../services/dataset/sql/SQLDataSourceLoader.java  |    98 -
 .../services/impl/ExternalImportServiceImpl.java   |   117 -
 .../services/impl/ImportValidationServiceImpl.java |    69 -
 .../services/impl/RuntimeInfoServiceImpl.java      |    59 -
 .../services/impl/RuntimeModelParserImpl.java      |   270 -
 .../services/impl/RuntimeModelRegistryImpl.java    |   197 -
 .../src/main/resources/META-INF/web.xml            |    22 -
 .../src/main/resources/application.properties      |     3 -
 .../backend/DataSetContentListenerTest.java        |    96 -
 .../backend/RuntimeModelLoaderTest.java            |   129 -
 .../backend/helper/PartitionHelperTest.java        |    43 -
 .../navigation/RuntimeNavigationBuilderTest.java   |   182 -
 .../provider/RuntimeSQLDataSourceLocatorTest.java  |    94 -
 .../impl/ImportValidationServiceImplTest.java      |    46 -
 .../services/impl/RuntimeInfoServiceImplTest.java  |    92 -
 .../services/impl/RuntimeModelParserImplTest.java  |   222 -
 .../impl/RuntimeModelRegistryImplTest.java         |   284 -
 .../src/test/resources/ds.csv                      |   193 -
 .../src/test/resources/ds.dset                     |    29 -
 .../src/test/resources/empty.zip                   |   Bin 22 -> 0 bytes
 .../src/test/resources/not_valid.zip               |   Bin 878 -> 0 bytes
 .../src/test/resources/valid_import.zip            |   Bin 6753 -> 0 bytes
 .../dashbuilder-runtime-client/pom.xml             |    60 -
 .../dashbuilder/client/RuntimeClientLoader.java    |   178 +-
 .../org/dashbuilder/client/RuntimeEntryPoint.java  |     7 +-
 .../client/RuntimeModelBackendAppLoader.java       |   138 -
 .../client/RuntimeModelContentListener.java        |     2 +-
 .../client/channel/RuntimeChannelClient.java       |    64 -
 .../org/dashbuilder/client/external/CSVParser.java |    96 +-
 .../external/ExternalDataSetClientProvider.java    |     7 +-
 .../dashbuilder/client/external/MetricsParser.java |    10 +-
 .../client/external/SupportedMimeType.java         |     6 +-
 .../ClientDataSetMetadataJSONMarshaller.java       |    16 +-
 .../org/dashbuilder/client/navbar/AppNavBar.java   |    49 -
 .../client/navbar/GoToDashboardMenuBuilder.java    |    62 -
 .../client/navbar/MenuBuilderHelper.java           |    54 -
 .../dashbuilder/client/navbar/NavBarHelper.java    |   114 -
 .../dashbuilder/client/navbar/RuntimeNavBrand.java |    41 -
 .../perspective/ContentErrorPerspective.java       |     6 +-
 .../perspective/DashboardsListPerspective.java     |     4 +-
 .../client/perspective/EmptyPerspective.java       |     4 +-
 .../client/perspective/NotFoundPerspective.java    |     6 +-
 .../client/perspective/RouterPerspective.java      |     7 +-
 .../client/perspective/RuntimePerspective.java     |     6 +-
 .../client/perspective/SamplesPerspective.java     |     4 +-
 .../RuntimePerspectiveEditorActivity.java          |     4 +-
 .../plugins/RuntimePerspectivePluginManager.java   |    47 +-
 .../dashbuilder/client/screens/RouterScreen.java   |    13 +-
 .../dashbuilder/client/screens/RuntimeScreen.java  |     7 -
 .../RuntimeBackendComponentFunctionService.java    |   104 -
 .../services/RuntimeDataSetClientServices.java     |    11 -
 .../dummy/RuntimeRendererSettingsService.java      |    41 -
 .../client/setup/RuntimeClientMode.java            |    10 +-
 .../client/setup/RuntimeClientSetup.java           |     6 +-
 .../main/resources/META-INF/ErraiApp.properties    |     7 -
 .../org/dashbuilder/DashbuilderRuntime.gwt.xml     |     2 -
 .../src/main/webapp/setup.js                       |     5 +-
 .../client/RuntimeClientLoaderTest.java            |   176 -
 .../dashbuilder/client/external/CSVParserTest.java |   105 +-
 .../client/screens/RouterScreenTest.java           |     4 -
 .../java/org/dashbuilder/shared/event/SSEType.java |    27 -
 .../marshalling/LayoutTemplateJSONMarshaller.java  |    19 +-
 .../dashbuilder/shared/model/DashboardInfo.java    |    44 -
 .../shared/model/DashbuilderRuntimeInfo.java       |    51 -
 .../shared/model/ImportDefinitions.java            |    41 -
 .../shared/service/ExternalImportService.java      |    38 -
 .../shared/service/ImportValidationService.java    |    35 -
 .../shared/service/RuntimeModelParser.java         |    38 -
 .../shared/service/RuntimeModelRegistry.java       |   104 -
 .../shared/service/RuntimeModelService.java        |    51 -
 .../shared/service/RuntimeModelRegistryTest.java   |   117 -
 .../dashbuilder/dashbuilder-runtime-parent/pom.xml |     1 -
 .../org/dashbuilder/displayer/ColumnSettings.java  |     2 +-
 .../displayer/DisplayerAttributeDef.java           |   161 +-
 .../external/ExternalComponentMessageHelper.java   |    70 -
 .../displayer/external/FunctionCallRequest.java    |    33 -
 .../displayer/external/FunctionResponse.java       |    44 -
 .../displayer/external/FunctionResultType.java     |    37 -
 .../impl/AbstractDisplayerSettingsBuilder.java     |     9 +-
 .../json/DisplayerSettingsJSONMarshaller.java      |    11 +-
 .../org/dashbuilder/renderer/RendererSettings.java |    47 -
 .../ExternalComponentMessageHelperTest.java        |    13 -
 .../dashbuilder-shared/dashbuilder-dsl/pom.xml     |    72 -
 .../component/AbstractComponentBuilder.java        |    49 -
 .../component/AllProcessesHeatmapBuilder.java      |    35 -
 .../dsl/factory/component/ComponentFactory.java    |    75 -
 .../dsl/factory/component/DisplayerBuilder.java    |    55 -
 .../component/ExternalComponentBuilder.java        |    48 -
 .../component/ExternalDisplayerBuilder.java        |    38 -
 .../factory/component/HtmlComponentBuilder.java    |    38 -
 .../dsl/factory/component/LogoBuilder.java         |    50 -
 .../factory/component/ProcessHeatmapBuilder.java   |    41 -
 .../dsl/factory/dashboard/DashboardBuilder.java    |    67 -
 .../dsl/factory/dashboard/DashboardFactory.java    |    76 -
 .../dsl/factory/navigation/NavigationBuilder.java  |    45 -
 .../dsl/factory/navigation/NavigationFactory.java  |    47 -
 .../factory/navigation/NavigationGroupBuilder.java |    61 -
 .../factory/navigation/NavigationItemBuilder.java  |    50 -
 .../dsl/factory/page/AbstractLayoutBuilder.java    |    36 -
 .../dsl/factory/page/ColumnBuilder.java            |    74 -
 .../dashbuilder/dsl/factory/page/PageBuilder.java  |    66 -
 .../dashbuilder/dsl/factory/page/PageFactory.java  |   125 -
 .../dashbuilder/dsl/factory/page/RowBuilder.java   |    69 -
 .../dashbuilder/dsl/helper/ComponentsHelper.java   |   115 -
 .../java/org/dashbuilder/dsl/model/Column.java     |    36 -
 .../java/org/dashbuilder/dsl/model/Component.java  |    36 -
 .../java/org/dashbuilder/dsl/model/Dashboard.java  |    58 -
 .../java/org/dashbuilder/dsl/model/Navigation.java |    36 -
 .../org/dashbuilder/dsl/model/NavigationGroup.java |    37 -
 .../org/dashbuilder/dsl/model/NavigationItem.java  |    36 -
 .../main/java/org/dashbuilder/dsl/model/Page.java  |    36 -
 .../main/java/org/dashbuilder/dsl/model/Row.java   |    36 -
 .../dsl/serialization/DashboardExporter.java       |   117 -
 .../dsl/serialization/DashboardSerializer.java     |    42 -
 .../serialization/impl/DashboardZipSerializer.java |   279 -
 .../impl/InternalDataSetProviderRegistry.java      |    70 -
 .../dsl/validation/DashboardValidator.java         |    37 -
 .../dsl/validation/DashboardValidatorImpl.java     |   212 -
 .../dsl/validation/ValidationResult.java           |    60 -
 .../factory/component/ComponentFactoryTest.java    |    73 -
 .../factory/component/DisplayerBuilderTest.java    |    67 -
 .../dsl/factory/page/ComponentBuilderTest.java     |    43 -
 .../dsl/factory/page/PageBuilderTest.java          |    50 -
 .../dsl/factory/page/RowBuilderTest.java           |    45 -
 .../dsl/serialization/DashboardExporterTest.java   |    36 -
 .../impl/DashboardZipSerializerTest.java           |   150 -
 .../dsl/validation/DashboardValidatorImplTest.java |   151 -
 .../src/test/resources/components/comp1/index.html |    16 -
 .../src/test/resources/components/comp1/index.js   |    18 -
 .../test/resources/components/comp1/manifest.json  |     3 -
 .../resources/data/un_world_pop_medium_variant.csv |   152 -
 .../dashbuilder-kie-server-api/pom.xml             |    46 -
 .../kieserver/ConsoleDataSetLookup.java            |    54 -
 .../kieserver/KieServerConnectionInfo.java         |    69 -
 .../kieserver/KieServerConnectionInfoProvider.java |    35 -
 .../dashbuilder/kieserver/RemoteDataSetDef.java    |   138 -
 .../kieserver/RemoteDataSetDefValidation.java      |    20 -
 .../kieserver/RemoteDefJSONMarshaller.java         |    81 -
 .../RuntimeKieServerDataSetProviderType.java       |    62 -
 .../main/resources/META-INF/ErraiApp.properties    |    17 -
 .../dashbuilder/DashbuilderKieServerAPI.gwt.xml    |    18 -
 .../dashbuilder-navigation-api/pom.xml             |     5 -
 .../event/PerspectivePluginsChangedEvent.java      |    23 -
 .../navigation/service/NavigationServices.java     |    30 -
 .../service/PerspectivePluginServices.java         |    45 -
 .../navigation/workbench/NavWorkbenchCtx.java      |     4 +-
 .../dashbuilder-services-api/pom.xml               |     5 -
 .../dataset/service/DataSetDefVfsServices.java     |    35 -
 .../dataset/service/DataSetExportServices.java     |    55 -
 .../dataset/service/SQLProviderServices.java       |    33 -
 .../service/BackendComponentFunctionService.java   |    34 -
 .../external/service/ComponentAssetProvider.java   |    25 -
 .../external/service/ComponentLoader.java          |    44 -
 .../external/service/ComponentService.java         |    36 -
 .../dashbuilder/perspectives/PerspectiveIds.java   |    31 -
 .../renderer/service/RendererSettingsService.java  |    19 -
 .../transfer/DataTransferExportModel.java          |    86 -
 .../dashbuilder/transfer/DataTransferServices.java |    43 -
 .../java/org/dashbuilder/transfer/ExportInfo.java  |    60 -
 .../transfer/ExportModelValidationService.java     |    40 -
 .../dashbuilder-validations/README.md              |    13 -
 .../dashbuilder-validations/pom.xml                |    99 -
 .../validations/DataSetDefValidator.java           |    54 -
 .../validations/DataSetValidatorProvider.java      |    93 -
 .../dataset/AbstractDataSetDefValidator.java       |    87 -
 .../dataset/BeanDataSetDefValidator.java           |    68 -
 .../dataset/CSVDataSetDefValidator.java            |    69 -
 .../dataset/ExternalDataSetDefValidator.java       |    63 -
 .../dataset/KafkaDataSetDefValidator.java          |    63 -
 .../dataset/PrometheusDataSetDefValidator.java     |    59 -
 .../dataset/RemoteDataSetDefValidator.java         |    76 -
 .../dataset/SQLDataSetDefValidator.java            |    76 -
 .../main/resources/META-INF/ErraiApp.properties    |    19 -
 .../src/main/resources/META-INF/beans.xml          |     6 -
 .../org/dashbuilder/CommonValidations.gwt.xml      |    33 -
 .../dataset/AbstractValidationTest.java            |    47 -
 .../dataset/BeanDataSetDefValidatorTest.java       |    97 -
 .../dataset/CSVDataSetDefValidatorTest.java        |   132 -
 .../dataset/KafkaDataSetDefValidatorTest.java      |    47 -
 .../dataset/PrometheusDataSetDefValidatorTest.java |    47 -
 .../dataset/SQLDataSetDefValidatorTest.java        |   132 -
 packages/dashbuilder/dashbuilder-shared/pom.xml    |     3 -
 .../dashbuilder/dataprovider/BeanProviderType.java |    41 -
 .../dashbuilder/dataprovider/CSVProviderType.java  |    41 -
 .../dataprovider/DataSetProviderType.java          |    10 -
 .../dataprovider/KafkaProviderType.java            |    41 -
 .../dataprovider/PrometheusProviderType.java       |    41 -
 .../dashbuilder/dataprovider/SQLProviderType.java  |    41 -
 .../org/dashbuilder/dataset/DataSetFactory.java    |    44 +-
 .../dashbuilder/dataset/def/BeanDataSetDef.java    |   113 -
 .../dataset/def/BeanDataSetDefBuilder.java         |    46 -
 .../org/dashbuilder/dataset/def/CSVDataSetDef.java |   228 -
 .../dataset/def/CSVDataSetDefBuilder.java          |   120 -
 .../dashbuilder/dataset/def/DataSetDefFactory.java |    32 +-
 .../dashbuilder/dataset/def/KafkaDataSetDef.java   |   207 -
 .../dataset/def/KafkaDataSetDefBuilder.java        |    96 -
 .../dataset/def/PrometheusDataSetDef.java          |   134 -
 .../dataset/def/PrometheusDataSetDefBuilder.java   |    48 -
 .../org/dashbuilder/dataset/def/SQLDataSetDef.java |   176 -
 .../dataset/def/SQLDataSetDefBuilder.java          |    70 -
 .../dashbuilder/dataset/def/SQLDataSourceDef.java  |    50 -
 .../dataset/impl/BeanDataSetDefBuilderImpl.java    |    37 -
 .../dataset/impl/CSVDataSetDefBuilderImpl.java     |    79 -
 .../dataset/impl/KafkaDataSetDefBuilderImpl.java   |    78 -
 .../impl/PrometheusDataSetDefBuilderImpl.java      |    41 -
 .../dataset/impl/SQLDataSetDefBuilderImpl.java     |    54 -
 .../dataset/json/BeanDefJSONMarshaller.java        |    87 -
 .../dataset/json/CSVDefJSONMarshaller.java         |   108 -
 .../dataset/json/DataSetDefJSONMarshaller.java     |    61 +-
 .../dataset/json/ExternalDataSetJSONParser.java    |     7 +-
 .../dataset/json/KafkaDefJSONMarshaller.java       |    63 -
 .../dataset/json/PrometheusDefJSONMarshaller.java  |    62 -
 .../dataset/json/SQLDefJSONMarshaller.java         |    75 -
 .../groups/BeanDataSetDefValidation.java           |     7 -
 .../groups/CSVDataSetDefFilePathValidation.java    |     7 -
 .../groups/CSVDataSetDefFileURLValidation.java     |     7 -
 .../validation/groups/CSVDataSetDefValidation.java |     7 -
 .../groups/KafkaDataSetDefValidation.java          |    22 -
 .../groups/PrometheusDataSetDefValidation.java     |    22 -
 .../groups/SQLDataSetDefDbSQLValidation.java       |     7 -
 .../groups/SQLDataSetDefDbTableValidation.java     |     7 -
 .../validation/groups/SQLDataSetDefValidation.java |     7 -
 .../main/resources/META-INF/ErraiApp.properties    |    11 -
 .../org/dashbuilder/dataset/DataSetDefTest.java    |    56 -
 .../dataset/json/DataSetDefJsonTest.java           |   189 +-
 .../json/DataSetMetadataJSONMarshallerTest.java    |   115 -
 .../src/main/java/org/dashbuilder/DataSetCore.java |     5 -
 .../main/java/org/dashbuilder/DataSetCoreImpl.java |    15 -
 .../dataprovider/BeanDataSetProvider.java          |   135 -
 .../dashbuilder/dataset/DataSetDefDeployer.java    |    39 +-
 .../dataprovider/BeanDataSetGeneratorTest.java     |   128 -
 .../dataset/DataSetDefDeployerTest.java            |    70 -
 .../dataset/DataSetDefRegistryTest.java            |    27 -
 .../kie-soup-dataset/kie-soup-dataset-csv/pom.xml  |    81 -
 .../dataprovider/csv/CSVDataSetProvider.java       |   146 -
 .../dataprovider/csv/CSVFileStorage.java           |    52 -
 .../dashbuilder/dataprovider/csv/CSVParser.java    |   225 -
 .../backend/csv/CSVDataSetBasicTest.java           |   108 -
 .../backend/csv/CSVDataSetDefJSONTest.java         |    75 -
 .../dataprovider/csv/CSVParserTest.java            |    99 -
 .../src/test/resources/expenseReports.csv          |    51 -
 .../src/test/resources/expenseReports.dset         |    21 -
 .../src/test/resources/expenseReports_trimmed.dset |    20 -
 .../src/test/resources/worldPopulation.csv         |   126 -
 .../src/test/resources/worldPopulation.dset        |    13 -
 .../kie-soup-dataset-kafka/pom.xml                 |    71 -
 .../dataprovider/kafka/KafkaDataSetProvider.java   |   198 -
 .../dataprovider/kafka/KafkaMetricsProvider.java   |    99 -
 .../kafka/mbean/JMXRMIConnectorProvider.java       |    37 -
 .../dataprovider/kafka/mbean/MBeanDefinitions.java |    43 -
 .../dataprovider/kafka/mbean/MBeanNameFactory.java |    56 -
 .../kafka/mbean/MBeanServerConnectionProvider.java |    65 -
 .../kafka/mbean/ObjectNameBuilder.java             |   129 -
 .../kafka/mbean/ObjectNamePrototype.java           |    61 -
 .../kafka/metrics/KafkaMetricCollector.java        |    34 -
 .../kafka/metrics/MBeanMetricCollector.java        |   133 -
 .../kafka/metrics/group/BrokerMetricsGroup.java    |   120 -
 .../kafka/metrics/group/ConsumerMetricsGroup.java  |    71 -
 .../kafka/metrics/group/MetricsCollectorGroup.java |    42 -
 .../group/MetricsCollectorGroupFactory.java        |    51 -
 .../kafka/metrics/group/ProducerMetricsGroup.java  |    65 -
 .../dataprovider/kafka/model/KafkaMetric.java      |    69 -
 .../kafka/model/KafkaMetricsRequest.java           |   137 -
 .../kafka/KafkaDataSetProviderTest.java            |    91 -
 .../kafka/KafkaMetricsProviderTest.java            |    90 -
 .../kafka/mbean/ObjectNameBuilderTest.java         |   112 -
 .../kie-soup-dataset-prometheus/pom.xml            |    76 -
 .../prometheus/PrometheusDataSetProvider.java      |   161 -
 .../dataprovider/prometheus/client/HttpClient.java |    64 -
 .../prometheus/client/MetricHelper.java            |    42 -
 .../prometheus/client/PrometheusClient.java        |   115 -
 .../client/PrometheusCredentialProvider.java       |    45 -
 .../prometheus/client/QueryResponse.java           |    74 -
 .../prometheus/client/QueryResponseBuilder.java    |    73 -
 .../prometheus/client/QueryResponseParser.java     |   147 -
 .../dataprovider/prometheus/client/Result.java     |    58 -
 .../dataprovider/prometheus/client/ResultType.java |    29 -
 .../dataprovider/prometheus/client/Status.java     |    27 -
 .../dataprovider/prometheus/client/Value.java      |    52 -
 .../prometheus/PrometheusDataSetProviderTest.java  |   100 -
 .../prometheus/client/PrometheusClientTest.java    |    75 -
 .../prometheus/client/QueryResponseParserTest.java |   132 -
 .../kie-soup-dataset-sql-tests/README.md           |    19 -
 .../kie-soup-dataset-sql-tests/pom.xml             |   172 -
 .../test/filtered-resources/datasource.properties  |    18 -
 .../dataprovider/sql/SQLDatasetTestSettings.java   |   107 -
 .../dataprovider/sql/util/DataSourceFactory.java   |    99 -
 .../dataprovider/sql/util/DatabaseProvider.java    |    49 -
 .../sql/util/PoolingDataSourceFactory.java         |   172 -
 .../sql/util/PoolingDataSourceWrapper.java         |    25 -
 .../sql/util/PoolingDataSourceWrapperImpl.java     |   235 -
 ...shbuilder.dataprovider.sql.DatabaseTestSettings |     1 -
 .../src/test/resources/testdb-h2.properties        |     3 -
 .../kie-soup-dataset/kie-soup-dataset-sql/pom.xml  |   117 -
 .../dashbuilder/dataprovider/sql/JDBCUtils.java    |   345 -
 .../dataprovider/sql/ResultSetConsumer.java        |    31 -
 .../dataprovider/sql/ResultSetHandler.java         |    44 -
 .../dataprovider/sql/SQLDataSetProvider.java       |  1236 --
 .../dataprovider/sql/SQLDataSourceLocator.java     |    44 -
 .../dashbuilder/dataprovider/sql/SQLFactory.java   |    90 -
 .../dataprovider/sql/dialect/DB2Dialect.java       |    91 -
 .../dataprovider/sql/dialect/DefaultDialect.java   |  1013 --
 .../dataprovider/sql/dialect/Dialect.java          |   168 -
 .../dataprovider/sql/dialect/H2Dialect.java        |    20 -
 .../dataprovider/sql/dialect/MonetDBDialect.java   |    58 -
 .../dataprovider/sql/dialect/MySQLDialect.java     |    91 -
 .../dataprovider/sql/dialect/OracleDialect.java    |   115 -
 .../sql/dialect/OracleLegacyDialect.java           |    57 -
 .../dataprovider/sql/dialect/PostgresDialect.java  |    74 -
 .../dataprovider/sql/dialect/SQLServerDialect.java |   160 -
 .../dataprovider/sql/dialect/SybaseASEDialect.java |   116 -
 .../dashbuilder/dataprovider/sql/model/Column.java |   182 -
 .../dataprovider/sql/model/Condition.java          |    33 -
 .../dataprovider/sql/model/CoreCondition.java      |    43 -
 .../dataprovider/sql/model/CreateTable.java        |    71 -
 .../dashbuilder/dataprovider/sql/model/Delete.java |    69 -
 .../dataprovider/sql/model/DropTable.java          |    45 -
 .../dataprovider/sql/model/DynamicDateColumn.java  |    32 -
 .../dataprovider/sql/model/FixedDateColumn.java    |    32 -
 .../dataprovider/sql/model/FunctionColumn.java     |    45 -
 .../dashbuilder/dataprovider/sql/model/Insert.java |    67 -
 .../dataprovider/sql/model/LogicalCondition.java   |    44 -
 .../dataprovider/sql/model/SQLStatement.java       |    87 -
 .../dashbuilder/dataprovider/sql/model/Select.java |   200 -
 .../dataprovider/sql/model/SimpleColumn.java       |    42 -
 .../dataprovider/sql/model/SortColumn.java         |    38 -
 .../dashbuilder/dataprovider/sql/model/Table.java  |    47 -
 .../dataprovider/sql/DatabaseTestSettings.java     |   141 -
 .../sql/DatabaseTestSettingsProvider.java          |    36 -
 .../dataprovider/sql/JDBCUtilsTest.java            |   158 -
 .../dataprovider/sql/SQLCloseResourcesTest.java    |    97 -
 .../dataprovider/sql/SQLColumnsTypeTest.java       |   112 -
 .../dataprovider/sql/SQLDataSetCacheTest.java      |    80 -
 .../dataprovider/sql/SQLDataSetDefTest.java        |   209 -
 .../sql/SQLDataSetMetadataLimitTest.java           |   208 -
 .../dataprovider/sql/SQLDataSetMetadataTest.java   |   111 -
 .../dataprovider/sql/SQLDataSetTestBase.java       |   159 -
 .../dataprovider/sql/SQLDataSetTrimTest.java       |   136 -
 .../dataprovider/sql/SQLInjectionAttacksTest.java  |   100 -
 .../sql/SQLQueryDataSetLookupTest.java             |    24 -
 .../sql/SQLTableDataSetLookupTest.java             |   338 -
 .../dataprovider/sql/SQLTableGroupByTest.java      |    84 -
 .../dashbuilder/dataprovider/sql/SQLTestSuite.java |    49 -
 .../dataprovider/sql/SelectStatementTest.java      |    70 -
 .../src/test/resources/expenseReports.dset         |    19 -
 .../test/resources/expenseReports_allcolumns.dset  |     7 -
 .../test/resources/expenseReports_columnalias.dset |     7 -
 .../test/resources/expenseReports_columnset.dset   |    13 -
 .../test/resources/expenseReports_filtered.dset    |    17 -
 .../test/resources/expenseReports_noncached.dset   |     7 -
 .../src/test/resources/expenseReports_query.dset   |    19 -
 .../src/test/resources/expenseReports_sql.dset     |     7 -
 .../src/test/resources/expenseReports_static.dset  |     8 -
 .../src/test/resources/expense_reports_ddl.sql     |    61 -
 .../src/test/resources/testdb-h2mem.properties     |     1 -
 packages/dashbuilder/kie-soup-dataset/pom.xml      |     5 -
 packages/dashbuilder/package.json                  |     9 +-
 packages/dashbuilder/pom.xml                       |     5 +-
 .../dmn-dev-deployment-base-image-env/env/index.js |    11 +-
 .../dmn-dev-deployment-base-image/Containerfile    |     7 +-
 packages/dmn-dev-deployment-base-image/README.md   |    77 +
 .../dmn-dev-deployment-base-image/env/index.js     |    15 +-
 .../dmn-dev-deployment-base-image/package.json     |    16 +-
 .../scripts/createTestImage.js                     |   317 +
 .../dmn-dev-deployment-form-webapp/package.json    |     1 +
 .../src/DmnDevDeploymentFormWebAppDataApi.tsx      |     4 +-
 .../src/DmnDevDeploymentRuntimeApi.tsx             |     2 +-
 .../src/DmnFormPage.tsx                            |     6 +-
 .../dmn-dev-deployment-form-webapp/src/Routes.tsx  |    10 +-
 .../static/index.html                              |     2 +-
 .../webpack.config.js                              |     1 -
 packages/dmn-language-service/src/index.ts         |     4 +-
 .../src/embedded/embedded/EmbeddedEditor.tsx       |    22 +-
 .../tests/embedded/stateControl/Hooks.test.ts      |     1 +
 packages/eslint/eslint.js                          |    13 +-
 packages/extended-services-api/env/index.js        |    24 +
 packages/extended-services-api/jest.config.js      |    34 +
 packages/extended-services-api/package.json        |    42 +
 packages/extended-services-api/src/dmnResult.ts    |    49 +
 packages/extended-services-api/src/index.ts        |    19 +
 packages/extended-services-api/src/jsonSchema.ts   |    54 +
 packages/extended-services-api/src/payload.ts      |    26 +
 packages/extended-services-api/src/validate.ts     |    27 +
 packages/extended-services-api/tsconfig.json       |    12 +
 packages/extended-services/pkg/server.go           |     2 +
 .../showcase/static/index.html                     |     8 +-
 packages/feel-input-component/src/FeelConfigs.ts   |   228 +
 packages/feel-input-component/src/FeelInput.tsx    |   189 +
 .../src/FeelInput/FeelInput.tsx                    |    92 -
 .../feel-input-component/src/FeelInput/index.ts    |    17 -
 .../feel-input-component/src/Monaco/FeelConfigs.ts |   167 -
 .../src/Monaco/FeelEditorService.ts                |   187 -
 .../src/Monaco/FeelInitializer.ts                  |    64 -
 packages/feel-input-component/src/Monaco/index.ts  |    19 -
 packages/feel-input-component/src/index.tsx        |     2 +-
 .../tests/FeelInput/FeelInput.test.tsx             |    45 -
 .../__snapshots__/FeelInput.test.tsx.snap          |    23 -
 .../tests/Monaco/FeelConfigs.test.ts               |   103 -
 .../tests/Monaco/FeelEditorService.test.ts         |   103 -
 .../tests/Monaco/FeelInitializer.test.ts           |    84 -
 .../tests/__mocks__/monacoMock.js                  |    57 -
 .../tests/__mocks__/styleMock.js                   |    17 -
 packages/form-dmn/package.json                     |     1 +
 packages/form-dmn/src/DmnForm.tsx                  |    47 +-
 packages/form-dmn/src/DmnFormResult.tsx            |    69 +-
 packages/form-dmn/src/DmnValidator.ts              |    12 +-
 .../form-dmn/src/uniforms/DmnAutoFieldProvider.tsx |     4 +-
 .../src/uniforms/DmnFormJsonSchemaBridge.ts        |    20 +-
 packages/form-dmn/tests/DmnForm.test.tsx           |     5 +-
 packages/form-dmn/tests/DmnFormResult.test.tsx     |    15 +-
 packages/form-dmn/tests/DmnValidator.test.ts       |    31 +-
 .../tests/__snapshots__/DmnForm.test.tsx.snap      |    21 +
 packages/form/src/FormComponent.tsx                |     6 +-
 packages/form/src/FormHook.tsx                     |   146 +-
 packages/form/src/uniforms/FormJsonSchemaBridge.ts |    12 -
 packages/git-cors-proxy-image/Containerfile        |     2 +-
 packages/git-cors-proxy-image/package.json         |     1 +
 packages/keyboard-shortcuts/src/channel/Hooks.tsx  |    83 -
 packages/keyboard-shortcuts/src/channel/index.ts   |    17 -
 .../tests/channel/Hooks.test.tsx                   |    91 -
 .../Containerfile                                  |     2 +-
 .../package.json                                   |     1 +
 packages/kie-sandbox-image/Containerfile           |     2 +-
 packages/kie-sandbox-image/Dockerfile              |     1 -
 packages/kie-sandbox-image/README.md               |    73 +-
 packages/kie-sandbox-image/package.json            |     2 +-
 packages/kn-plugin-workflow/go.mod                 |     6 +-
 packages/kn-plugin-workflow/go.sum                 |    17 +-
 .../kn-plugin-workflow/pkg/command/build_test.go   |     8 +-
 packages/kn-plugin-workflow/pkg/command/create.go  |    40 +-
 .../kn-plugin-workflow/pkg/command/create_test.go  |   100 +
 .../pkg/command/create_workflow.go                 |     6 +-
 .../pkg/command/create_workflow_test.go            |    41 +
 packages/kn-plugin-workflow/pkg/command/deploy.go  |    33 +-
 .../kn-plugin-workflow/pkg/command/deploy_test.go  |    96 +
 packages/kn-plugin-workflow/pkg/common/afero.go    |    24 +
 packages/kn-plugin-workflow/pkg/common/checks.go   |    20 +-
 .../kn-plugin-workflow/pkg/common/test_helper.go   |    44 +
 packages/{openshift => kubernetes-bridge}/LICENSE  |     0
 .../{openshift => kubernetes-bridge}/env/index.js  |     0
 .../jest.config.js                                 |     0
 packages/kubernetes-bridge/package.json            |    46 +
 .../src/fetch/FetchConstants.ts                    |     0
 .../src/fetch/ResourceFetch.ts                     |     0
 .../kubernetes-bridge/src/fetch/ResourceFetcher.ts |    71 +
 packages/kubernetes-bridge/src/fetch/index.ts      |    19 +
 packages/kubernetes-bridge/src/resources/common.ts |    94 +
 packages/kubernetes-bridge/src/resources/index.ts  |    20 +
 .../src/resources/knative/KafkaSource.ts           |   167 +
 .../src/resources/knative/KnativeService.ts        |   172 +
 .../kubernetes-bridge/src/resources/knative/api.ts |    30 +
 .../src/resources/knative/index.ts                 |    19 +
 .../src/resources/kubernetes/Deployment.ts         |   180 +
 .../src/resources/kubernetes/Ingress.ts            |   127 +
 .../src/resources/kubernetes/Namespace.ts          |    33 +
 .../src/resources/kubernetes/Secret.ts             |    85 +
 .../kubernetes/SelfSubjectAccessReview.ts          |    69 +
 .../src/resources/kubernetes/Service.ts            |   108 +
 .../src/resources/kubernetes/api.ts                |    23 +
 .../src/resources/kubernetes/index.ts              |    21 +
 .../src/resources/openshift/Build.ts               |    40 +
 .../src/resources/openshift/BuildConfig.ts         |   156 +
 .../src/resources/openshift/ImageStream.ts         |    96 +
 .../src/resources/openshift/Project.ts             |    32 +
 .../src/resources/openshift/Route.ts               |   132 +
 .../src/resources/openshift/api.ts                 |    29 +
 .../src/resources/openshift/index.ts               |    22 +
 .../src/service/KubernetesConnection.ts            |    51 +
 .../src/service/KubernetesService.ts               |   130 +
 .../src/service/OpenShiftConstants.ts              |     0
 .../src/service/OpenShiftService.ts                |   113 +
 packages/kubernetes-bridge/src/service/index.ts    |    20 +
 .../src/service/support/KnativeSupportService.ts   |    34 +
 .../kubernetes-bridge/src/service/support/index.ts |    17 +
 .../tests/jest.setup.ts                            |     0
 .../{openshift => kubernetes-bridge}/tsconfig.json |     0
 packages/online-editor/build/defaultEnvJson.ts     |    45 +-
 packages/online-editor/env/index.js                |     9 +-
 .../online-editor/it-tests/e2e/TrySample.cy.ts     |     4 +-
 packages/online-editor/package.json                |     6 +-
 packages/online-editor/src/App.tsx                 |     6 +-
 .../online-editor/src/accounts/AccountsContext.tsx |    22 +
 .../online-editor/src/accounts/AccountsIcon.tsx    |     9 +
 .../kubernetes/ConnectToKubernetesSection.tsx      |   160 +
 .../kubernetes/ConnectToKubernetesSimple.tsx       |   345 +
 .../ConnectToLocalKubernetesClusterWizard.tsx      |   687 +
 .../kubernetes/KubernetesInstanceStatus.tsx        |    22 +
 .../accounts/openshift/ConnecToOpenShiftSimple.tsx |    24 +-
 ...tToDeveloperSandboxForRedHatOpenShiftWizard.tsx |   101 +-
 .../openshift/ConnectToOpenShiftSection.tsx        |    14 +-
 .../src/authProviders/AuthProvidersApi.ts          |    14 +-
 .../src/authProviders/AuthProvidersGallery.tsx     |    10 +
 .../src/authSessions/AuthSessionApi.ts             |    14 +-
 .../src/authSessions/AuthSessionLabel.tsx          |     2 +-
 .../src/authSessions/AuthSessionSelect.tsx         |     5 +-
 .../src/authSessions/AuthSessionsContext.tsx       |    25 +-
 .../src/authSessions/AuthSessionsList.tsx          |    27 +-
 .../src/authSessions/CompatibleAuthSessions.ts     |    26 +
 .../DevDeploymentsConfirmDeleteModal.tsx           |     8 +-
 .../DevDeploymentsConfirmDeployModal.tsx           |     2 +-
 .../src/devDeployments/DevDeploymentsContext.tsx   |    12 +-
 .../DevDeploymentsContextProvider.tsx              |    61 +-
 .../DevDeploymentsDeployDropdownItems.tsx          |    25 +-
 .../src/devDeployments/DevDeploymentsDropdown.tsx  |    51 +-
 .../devDeployments/DevDeploymentsDropdownItem.tsx  |    14 +-
 .../services/KieSandboxKubernetesService.ts        |   319 +
 .../openshift/KieSandboxOpenShiftService.ts        |   175 +
 .../src/devDeployments/services/types.ts           |    43 +
 .../src/dmnRunner/DmnRunnerContext.tsx             |    68 +
 .../src/dmnRunner/DmnRunnerContextProvider.tsx     |   789 ++
 .../src/dmnRunner/DmnRunnerDockToggle.tsx          |    68 +
 .../src/dmnRunner/DmnRunnerDrawer.tsx              |    38 +
 .../src/dmnRunner/DmnRunnerDrawerPanelContent.tsx  |   380 +
 .../src/dmnRunner/DmnRunnerLoading.tsx             |    44 +
 .../DmnRunner => dmnRunner}/DmnRunnerStatus.ts     |     0
 .../online-editor/src/dmnRunner/DmnRunnerTable.css |    27 +
 .../online-editor/src/dmnRunner/DmnRunnerTable.tsx |   354 +
 .../online-editor/src/dmnRunner/DmnRunnerTypes.ts  |    68 +
 .../DmnRunnerInputsDispatchContext.tsx             |    33 -
 .../DmnRunnerInputsDispatchContextProvider.tsx     |    94 -
 .../src/dmnRunnerInputs/DmnRunnerInputsHook.tsx    |   161 -
 .../src/dmnRunnerInputs/DmnRunnerInputsService.tsx |    45 -
 .../DmnRunnerPersistenceDispatchContext.tsx        |    40 +
 ...DmnRunnerPersistenceDispatchContextProvider.tsx |   177 +
 .../DmnRunnerPersistenceHook.tsx                   |    82 +
 .../DmnRunnerPersistenceService.tsx                |    65 +
 .../DmnRunnerPersistenceTypes.ts                   |    64 +
 .../src/editor/DmnRunner/DmnRunnerContext.tsx      |    52 -
 .../src/editor/DmnRunner/DmnRunnerDockToggle.tsx   |    59 -
 .../src/editor/DmnRunner/DmnRunnerDrawer.tsx       |    45 -
 .../DmnRunner/DmnRunnerDrawerPanelContent.tsx      |   485 -
 .../src/editor/DmnRunner/DmnRunnerLoading.tsx      |    44 -
 .../src/editor/DmnRunner/DmnRunnerProvider.tsx     |   158 -
 .../src/editor/DmnRunner/DmnRunnerTable.tsx        |   383 -
 packages/online-editor/src/editor/EditorPage.tsx   |   117 +-
 .../src/editor/EditorPageDockContextProvider.tsx   |   234 +
 .../src/editor/EditorPageDockDrawer.tsx            |   189 +-
 .../src/editor/EditorPageDockToggleItem.tsx        |     9 +-
 .../KieSandboxExtendedServicesButtons.tsx          |    68 +-
 .../KieSandboxExtendedServicesDropdownGroup.tsx    |     9 +-
 .../NotificationsPanel/NotificationsPanel.tsx      |     2 +-
 .../NotificationsPanelDockToggle.tsx               |    34 +-
 .../NotificationsPanelTabContent.tsx               |   183 +-
 .../src/editor/Toolbar/EditorToolbar.tsx           |     3 -
 packages/online-editor/src/editor/Validation.tsx   |    37 +-
 packages/online-editor/src/env/EnvJson.ts          |     3 +
 .../envelopeLocator/EditorEnvelopeLocatorApi.ts    |    28 +
 .../EditorEnvelopeLocatorFactory.ts                |    41 +-
 .../hooks/EditorEnvelopeLocatorContext.tsx         |    16 +-
 packages/online-editor/src/home/HomePage.tsx       |    33 +-
 packages/online-editor/src/i18n/OnlineI18n.ts      |    62 +-
 packages/online-editor/src/i18n/locales/en.ts      |    69 +-
 .../KieSandboxExtendedServicesClient.ts            |    42 +-
 packages/online-editor/src/navigation/Routes.ts    |     7 +-
 .../src/openshift/KieSandboxOpenShiftService.ts    |   253 -
 .../src/pageTemplate/OnlineEditorPage.tsx          |    49 +-
 ...ontextProviderWithCustomCommitMessagesModal.tsx |     1 +
 .../src/workspace/worker/sharedWorker.ts           |    18 +-
 .../kie-sandbox-dev-deployments-resources.yaml     |   133 +
 .../static/kubernetes/kind-cluster-config.yaml     |    23 +
 packages/online-editor/static/resources/style.css  |    27 +-
 packages/online-editor/webpack.config.ts           |    27 +-
 packages/openshift/package.json                    |    41 -
 packages/openshift/src/api/ApiConstants.ts         |    58 -
 packages/openshift/src/api/knative/KafkaSource.ts  |    58 -
 .../openshift/src/api/knative/KnativeService.ts    |    94 -
 packages/openshift/src/api/kubernetes/Build.ts     |    29 -
 .../openshift/src/api/kubernetes/BuildConfig.ts    |    79 -
 .../openshift/src/api/kubernetes/Deployment.ts     |   100 -
 .../openshift/src/api/kubernetes/ImageStream.ts    |    55 -
 packages/openshift/src/api/kubernetes/Project.ts   |    29 -
 packages/openshift/src/api/kubernetes/Route.ts     |    71 -
 packages/openshift/src/api/kubernetes/Secret.ts    |    56 -
 packages/openshift/src/api/kubernetes/Service.ts   |    71 -
 packages/openshift/src/api/types.ts                |   300 -
 packages/openshift/src/fetch/ResourceFetcher.ts    |    64 -
 packages/openshift/src/service/KnativeService.ts   |    35 -
 .../openshift/src/service/KubernetesService.ts     |    74 -
 .../openshift/src/service/OpenShiftConnection.ts   |    44 -
 packages/openshift/src/service/OpenShiftService.ts |    73 -
 packages/openshift/src/service/types.ts            |    30 -
 .../openshift/src/template/ResourceTemplates.ts    |   314 -
 .../openshift/src/template/TemplateConstants.ts    |    45 -
 packages/openshift/src/template/types.ts           |    52 -
 .../it-tests/e2e/CreateNewFile.cy.ts               |     8 +-
 .../it-tests/e2e/Expression.cy.ts                  |    76 +
 .../it-tests/e2e/UploadFiles.cy.ts                 |     8 +-
 .../fixtures/expression/expression.sw.json         |    35 +
 .../fixtures/expression/expression.sw.yaml         |    22 +
 .../it-tests/support/commands.ts                   |    21 +
 packages/serverless-logic-web-tools/package.json   |     2 +-
 packages/serverless-logic-web-tools/src/App.tsx    |     6 +-
 .../EditorEnvelopeLocatorFactory.ts                |     6 +-
 .../KieSandboxExtendedServicesModal.tsx            |     2 +-
 .../src/openshift/OpenShiftContextProvider.tsx     |    10 +-
 .../src/openshift/OpenShiftPipeline.ts             |     2 +-
 .../deploy/strategies/KogitoProjectDeployment.ts   |     4 +-
 .../src/openshift/deploy/types.ts                  |     6 +-
 .../dropdown/OpenShiftDeploymentDropdownItem.tsx   |    15 +-
 .../src/openshift/hooks/useOpenApi.ts              |     4 +-
 .../openshift/pipelines/KnativeBuilderPipeline.ts  |    37 +-
 .../pipelines/KnativeDeploymentLoaderPipeline.ts   |    27 +-
 .../src/settings/SettingsContext.tsx               |     8 +-
 .../featurePreview/FeaturePreviewSettings.tsx      |     2 +-
 .../src/settings/openshift/OpenShiftSettings.tsx   |     4 +-
 .../settings/openshift/OpenShiftSettingsConfig.tsx |     8 +-
 .../openshift/OpenShiftSettingsSimpleConfig.tsx    |    27 +-
 .../editor/ServerlessWorkflowCombinedEditor.tsx    |    11 +-
 .../appformer-bom/pom.xml                          |    33 +-
 .../kie-wb-common-bom/pom.xml                      |     6 -
 .../client/widgets/editor/StunnerEditor.java       |    42 +-
 .../client/widgets/editor/StunnerEditorTest.java   |    28 +-
 .../definition/service/DefinitionSetService.java   |    47 -
 .../stunner/core/api/JsDefinitionManager.java      |   117 +
 .../core/definition/DefinitionSetProxy.java        |    26 -
 .../core/definition/DefinitionSetResourceType.java |    24 -
 .../adapter/AbstractDefinitionSetRuleAdapter.java  |    25 -
 .../adapter/DefinitionAdapterWrapper.java          |    92 -
 .../core/definition/adapter/DefinitionId.java      |     5 +
 .../adapter/DefinitionSetAdapterWrapper.java       |    81 -
 .../definition/adapter/PropertyAdapterWrapper.java |    62 -
 .../adapter/binding/DefinitionAdapterBindings.java |    20 -
 .../definition/jsadapter/EmptyJsMorhAdapter.java   |    59 +
 .../definition/jsadapter/JsDefinitionAdapter.java  |   142 +
 .../definition/jsadapter/JsDefinitionProperty.java |    36 +
 .../jsadapter/JsDefinitionSetAdapter.java          |   105 +
 .../definition/jsadapter/JsPropertyAdapter.java    |    69 +
 .../core/definition/jsadapter/JsRuleAdapter.java   |    61 +
 .../definition/property/PropertyMetaTypes.java     |    20 +-
 .../factory/definition/JsDefinitionFactory.java    |    37 +
 .../core/i18n/StunnerTranslationService.java       |     2 +
 .../core/rule/context/EdgeCardinalityContext.java  |     3 +
 .../stunner/core/rule/ext/RuleExtension.java       |     9 +-
 .../adapter/DefinitionAdapterWrapperTest.java      |   198 -
 .../binding/DefinitionAdapterBindingsTest.java     |     8 -
 .../core/client/api/ClientDefinitionManager.java   |     8 -
 .../stunner/core/client/api/DomainInitializer.java |   162 +
 .../stunner/core/client/api/JsStunnerEditor.java   |    11 +
 .../stunner/core/client/api/JsStunnerSession.java  |   122 +
 .../common/stunner/core/client/api/JsWindow.java   |    15 +
 .../client/canvas/command/ResizeNodeCommand.java   |    69 -
 .../registry/impl/ClientRegistryFactoryImpl.java   |     4 +
 .../stunner/core/client/util/WindowJSType.java     |    34 -
 .../stunner/core/TestingGraphMockHandler.java      |     4 +-
 .../core/client/api/DomainInitializerTest.java     |   323 +
 .../canvas/command/ResizeNodeCommandTest.java      |    35 +-
 .../core/api/AbstractDefinitionManager.java        |     5 -
 .../AbstractDefinitionSetResourceType.java         |    37 -
 .../stunner/core/diagram/AbstractDiagram.java      |    11 +-
 .../common/stunner/core/diagram/DiagramImpl.java   |    13 +-
 .../core/factory/impl/BindableDiagramFactory.java  |    40 -
 .../stunner/core/factory/impl/NodeFactoryImpl.java |     4 +-
 .../stunner/core/graph/impl/AbstractElement.java   |     2 +
 .../common/stunner/core/graph/impl/EdgeImpl.java   |     5 +-
 .../common/stunner/core/graph/impl/GraphImpl.java  |    15 +-
 .../common/stunner/core/graph/impl/NodeImpl.java   |    28 +-
 .../core/i18n/AbstractTranslationService.java      |     1 -
 .../registry/impl/AbstractRegistryFactory.java     |     2 +-
 .../common/stunner/core/rule/EmptyRuleSet.java     |     4 +-
 .../common/stunner/core/rule/RuleSetImpl.java      |    16 +-
 .../common/stunner/core/rule/impl/CanConnect.java  |    38 +-
 .../common/stunner/core/rule/impl/CanContain.java  |    22 +-
 .../common/stunner/core/rule/impl/CanDock.java     |    22 +-
 .../stunner/core/rule/impl/EdgeOccurrences.java    |    32 +-
 .../common/stunner/core/rule/impl/Occurrences.java |    25 +-
 .../common/stunner/core/util/DefinitionUtils.java  |    35 +-
 .../stunner/core/TestingGraphMockHandler.java      |     4 +-
 .../binding/BindableDefinitionAdapterImplTest.java |     9 -
 .../core/factory/impl/NodeFactoryImplTest.java     |     4 +-
 .../stunner/core/graph/util/GraphUtilsTest.java    |     4 +-
 .../kie-wb-common-stunner-processors/pom.xml       |    82 -
 .../core/processors/AbstractAdapterGenerator.java  |   115 -
 .../AbstractBindableAdapterGenerator.java          |    53 -
 .../stunner/core/processors/GeneratorUtils.java    |   281 -
 .../stunner/core/processors/MainProcessor.java     |  1244 --
 .../stunner/core/processors/ProcessingContext.java |   117 -
 .../ProcessingDefinitionAnnotations.java           |    82 -
 .../ProcessingDefinitionSetAnnotations.java        |    61 -
 .../stunner/core/processors/ProcessingElement.java |    37 -
 .../core/processors/ProcessingElementList.java     |    39 -
 .../core/processors/ProcessingElementMap.java      |    39 -
 .../stunner/core/processors/ProcessingEntity.java  |    37 -
 .../core/processors/ProcessingMorphProperty.java   |    44 -
 .../processors/ProcessingMorphingAnnotations.java  |    41 -
 .../processors/ProcessingPropertyAnnotations.java  |    29 -
 .../stunner/core/processors/ProcessingRule.java    |    53 -
 .../BindableDefinitionAdapterGenerator.java        |    95 -
 .../processors/definition/TypeConstructor.java     |    30 -
 .../BindableDefinitionSetAdapterGenerator.java     |    76 -
 .../definitionset/DefinitionSetProxyGenerator.java |    69 -
 .../processors/factory/ModelFactoryGenerator.java  |    58 -
 .../processors/morph/MorphDefinitionGenerator.java |    66 -
 .../morph/MorphDefinitionProviderGenerator.java    |    60 -
 .../morph/MorphPropertyDefinitionGenerator.java    |    70 -
 .../property/BindablePropertyAdapterGenerator.java |    55 -
 .../BindableDefinitionSetRuleAdapterGenerator.java |    77 -
 .../processors/rule/CardinalityRuleGenerator.java  |   108 -
 .../processors/rule/ConnectionRuleGenerator.java   |   115 -
 .../processors/rule/ContainmentRuleGenerator.java  |   108 -
 .../core/processors/rule/DockingRuleGenerator.java |   108 -
 .../rule/EdgeCardinalityRuleGenerator.java         |   121 -
 .../processors/rule/ExtensionRuleGenerator.java    |   162 -
 .../services/javax.annotation.processing.Processor |     1 -
 .../templates/BindableDefinitionAdapter.ftl        |    63 -
 .../templates/BindableDefinitionSetAdapter.ftl     |    47 -
 .../definitionset/templates/DefinitionSetProxy.ftl |    38 -
 .../processors/factory/templates/ModelFactory.ftl  |    61 -
 .../processors/morph/templates/MorphDefinition.ftl |    53 -
 .../morph/templates/MorphDefinitionProvider.ftl    |    46 -
 .../morph/templates/MorphPropertyDefinition.ftl    |    84 -
 .../property/templates/BindablePropertyAdapter.ftl |    48 -
 .../templates/BindableDefinitionSetRuleAdapter.ftl |    67 -
 .../processors/rule/templates/CardinalityRule.ftl  |     1 -
 .../processors/rule/templates/ConnectionRule.ftl   |     8 -
 .../processors/rule/templates/ContainmentRule.ftl  |     7 -
 .../core/processors/rule/templates/DockingRule.ftl |     7 -
 .../rule/templates/EdgeCardinalityRule.ftl         |     2 -
 .../processors/rule/templates/RuleExtension.ftl    |     1 -
 .../kie-wb-common-stunner-core/pom.xml             |     1 -
 .../src/main/java/javax/annotation/Generated.java  |    18 +
 .../core/shape/wires/types/JsWiresShape.java       |   107 +-
 .../com/ait/lienzo/client/core/types/JsCanvas.java |   165 +-
 .../client/core/types/JsCanvasAnimations.java      |     4 +
 .../lienzo/client/core/types/JsCanvasLogger.java   |     5 +-
 .../client/core/types/JsCanvasNodeLister.java      |     6 +-
 .../core/shape/wires/types/JsWiresShapeTest.java   |   182 +-
 .../ait/lienzo/client/core/types/JsCanvasTest.java |    10 +-
 .../serverless-workflow-diagram-editor/pom.xml     |     6 +
 .../sw-editor/sw-editor-api/pom.xml                |    21 +-
 .../workbench/common/stunner/sw/Definitions.java   |   107 -
 .../common/stunner/sw/SWDefinitionSet.java         |    80 +
 .../common/stunner/sw/SWDomainInitializer.java     |   227 +
 .../common/stunner/sw/autolayout/AutoLayout.java   |  1355 +-
 .../stunner/sw/definition/ActionDataFilters.java   |     8 +-
 .../stunner/sw/definition/ActionEventRef.java      |    10 +-
 .../common/stunner/sw/definition/ActionNode.java   |    93 +-
 .../stunner/sw/definition/ActionTransition.java    |    41 +-
 .../stunner/sw/definition/ActionsContainer.java    |    31 -
 .../stunner/sw/definition/CallEventAction.java     |     2 +-
 .../stunner/sw/definition/CallFunctionAction.java  |     6 -
 .../stunner/sw/definition/CallSubflowAction.java   |     6 -
 .../stunner/sw/definition/CallbackState.java       |    35 +-
 .../sw/definition/CompensationTransition.java      |    61 +-
 .../common/stunner/sw/definition/ContinueAs.java   |    13 +-
 .../common/stunner/sw/definition/Correlation.java  |     5 +-
 .../common/stunner/sw/definition/Data.java         |     3 +-
 .../sw/definition/DataConditionTransition.java     |    83 +-
 .../sw/definition/DefaultConditionTransition.java  |    54 +-
 .../common/stunner/sw/definition/End.java          |    33 +-
 .../common/stunner/sw/definition/Error.java        |    10 +-
 .../stunner/sw/definition/ErrorTransition.java     |    59 +-
 .../common/stunner/sw/definition/Event.java        |    36 +-
 .../sw/definition/EventConditionTransition.java    |    82 +-
 .../stunner/sw/definition/EventDataFilter.java     |     8 +-
 .../common/stunner/sw/definition/EventRef.java     |    36 +-
 .../common/stunner/sw/definition/EventState.java   |    28 +-
 .../common/stunner/sw/definition/EventTimeout.java |    10 +-
 .../common/stunner/sw/definition/ForEachState.java |    23 +-
 .../common/stunner/sw/definition/Function.java     |    10 +-
 .../common/stunner/sw/definition/FunctionRef.java  |    23 +-
 .../common/stunner/sw/definition/GWTMetadata.java  |    53 +
 .../common/stunner/sw/definition/InjectState.java  |    39 +-
 .../common/stunner/sw/definition/Metadata.java     |    49 +-
 .../common/stunner/sw/definition/ModelUtils.java   |     7 +-
 .../common/stunner/sw/definition/OnEvent.java      |    37 +-
 .../stunner/sw/definition/OperationState.java      |    33 +-
 .../stunner/sw/definition/ParallelState.java       |    26 +-
 .../stunner/sw/definition/ParallelStateBranch.java |    21 +-
 .../stunner/sw/definition/ProducedEvent.java       |     5 +-
 .../common/stunner/sw/definition/Retry.java        |     8 +-
 .../common/stunner/sw/definition/Schedule.java     |    10 +-
 .../common/stunner/sw/definition/Sleep.java        |     5 +-
 .../common/stunner/sw/definition/SleepState.java   |    20 +-
 .../common/stunner/sw/definition/Start.java        |    38 +-
 .../stunner/sw/definition/StartDefinition.java     |    14 +-
 .../stunner/sw/definition/StartTransition.java     |    49 +-
 .../common/stunner/sw/definition/State.java        |   106 +-
 .../stunner/sw/definition/StateDataFilter.java     |     5 +-
 .../common/stunner/sw/definition/StateEnd.java     |    19 +-
 .../stunner/sw/definition/StateTransition.java     |     7 +-
 .../common/stunner/sw/definition/SubFlowRef.java   |    20 +-
 .../common/stunner/sw/definition/SwitchState.java  |    44 +-
 .../common/stunner/sw/definition/Timeout.java      |    29 +-
 .../common/stunner/sw/definition/Transition.java   |    44 +-
 .../common/stunner/sw/definition/Workflow.java     |   141 +-
 .../stunner/sw/definition/WorkflowExecTimeout.java |    10 +-
 .../stunner/sw/definition/WorkflowTimeouts.java    |    12 +-
 .../ArgumentsValueHolderJsonbTypeSerializer.java   |    57 -
 .../ConstantsValueHolderJsonbTypeSerializer.java   |    24 -
 .../custom/ContinueAsJsonbTypeDeserializer.java    |    43 -
 .../custom/ContinueAsJsonbTypeSerializer.java      |    40 -
 .../definition/custom/ErrorJsonDeserializer.java   |    45 -
 .../sw/definition/custom/ErrorJsonSerializer.java  |    42 -
 .../custom/EventJsonbTypeDeserializer.java         |    46 -
 .../custom/EventJsonbTypeSerializer.java           |    43 -
 .../custom/FunctionRefJsonDeserializer.java        |    43 -
 .../custom/FunctionRefJsonSerializer.java          |    40 -
 .../custom/ScheduleJsonbTypeDeserializer.java      |    42 -
 .../custom/ScheduleJsonbTypeSerializer.java        |    41 -
 .../StartDefinitionJsonbTypeDeserializer.java      |    43 -
 .../custom/StartDefinitionJsonbTypeSerializer.java |    41 -
 .../StateEndDefinitionJsonbTypeDeserializer.java   |    45 -
 .../StateEndDefinitionJsonbTypeSerializer.java     |    38 -
 .../definition/custom/StateJsonDeserializer.java   |    55 -
 .../sw/definition/custom/StateJsonSerializer.java  |    65 -
 ...eTransitionDefinitionJsonbTypeDeserializer.java |    43 -
 ...ateTransitionDefinitionJsonbTypeSerializer.java |    40 -
 .../custom/SubFlowRefJsonDeserializer.java         |    43 -
 .../custom/SubFlowRefJsonSerializer.java           |    40 -
 .../SubflowExecutionTypeJsonbTypeDeserializer.java |    23 -
 .../SubflowExecutionTypeJsonbTypeSerializer.java   |    16 -
 .../custom/ValueHolderJsonbTypeDeserializer.java   |    52 -
 .../custom/ValueHolderJsonbTypeSerializer.java     |   107 -
 .../WorkflowExecTimeoutJsonDeserializer.java       |    43 -
 .../custom/WorkflowExecTimeoutJsonSerializer.java  |    40 -
 .../custom/WorkflowFunctionsJsonDeserializer.java  |    46 -
 .../custom/WorkflowFunctionsJsonSerializer.java    |    43 -
 .../custom/WorkflowTimeoutsJsonDeserializer.java   |    43 -
 .../custom/WorkflowTimeoutsJsonSerializer.java     |    40 -
 .../custom/json/ContinueAsJsonbTypeSerializer.java |    70 +
 .../custom/json/ErrorJsonSerializer.java           |    72 +
 .../custom/json/EventJsonbTypeSerializer.java      |    73 +
 .../custom/json/FunctionRefJsonSerializer.java     |    70 +
 .../custom/json/MetadataJsonSerializer.java        |    74 +
 .../custom/json/ScheduleJsonbTypeSerializer.java   |    67 +
 .../json/StartDefinitionJsonbTypeSerializer.java   |    73 +
 .../StateEndDefinitionJsonbTypeSerializer.java     |    74 +
 .../custom/json/StateJsonSerializer.java           |   111 +
 ...ateTransitionDefinitionJsonbTypeSerializer.java |    70 +
 .../StringOrValueHolderJsonbTypeSerializer.java    |    69 +
 .../custom/json/SubFlowRefJsonSerializer.java      |    70 +
 .../SubflowExecutionTypeJsonbTypeSerializer.java   |    56 +
 .../json/ValueHolderJsonbTypeSerializer.java       |   141 +
 .../json/WorkflowExecTimeoutJsonSerializer.java    |    71 +
 .../json/WorkflowFunctionsJsonSerializer.java      |    74 +
 .../json/WorkflowTimeoutsJsonSerializer.java       |    70 +
 .../custom/yaml/ContinueAsYamlTypeSerializer.java  |    81 +
 .../custom/yaml/ErrorYamlSerializer.java           |    86 +
 .../custom/yaml/EventYamlTypeSerializer.java       |    78 +
 .../custom/yaml/FunctionRefYamlSerializer.java     |    79 +
 .../custom/yaml/MetadataYamlSerializer.java        |   118 +
 .../yaml/NumCompletedYamlTypeSerializer.java       |    81 +
 .../custom/yaml/ScheduleYamlTypeSerializer.java    |    81 +
 .../yaml/StartDefinitionYamlTypeSerializer.java    |    64 +
 .../yaml/StateEndDefinitionYamlTypeSerializer.java |    57 +
 ...tateTransitionDefinitionYamlTypeSerializer.java |    63 +
 .../custom/yaml/StateYamlSerializer.java           |   137 +
 .../StringOrValueHolderYamlTypeSerializer.java     |    77 +
 .../custom/yaml/SubFlowRefYamlSerializer.java      |    63 +
 .../SubflowExecutionTypeYamlTypeSerializer.java    |    53 +
 .../custom/yaml/ValueHolderYamlTypeSerializer.java |   178 +
 .../yaml/WorkflowExecTimeoutYamlSerializer.java    |    60 +
 .../yaml/WorkflowFunctionsYamlSerializer.java      |    72 +
 .../yaml/WorkflowTimeoutsYamlSerializer.java       |    70 +
 .../common/stunner/sw/factory/DiagramFactory.java  |    49 -
 .../common/stunner/sw/marshall/BuilderContext.java |     3 +-
 .../stunner/sw/marshall/DefinitionTypeUtils.java   |    15 +-
 .../common/stunner/sw/marshall/DocType.java        |    21 +
 .../common/stunner/sw/marshall/Marshaller.java     |    54 +-
 .../stunner/sw/marshall/MarshallerUtils.java       |    72 +-
 .../common/stunner/sw/marshall/Parser.java         |     2 +-
 .../common/stunner/sw/marshall/yaml/Yaml.java      |    67 +
 .../common/stunner/sw/marshall/yaml/bundle.js      |  4177 +++++++
 .../stunner/sw/resources/i18n/SWConstants.java     |    14 +
 .../common/stunner/sw/SWEditorApi.gwt.xml          |     8 +-
 .../sw/resources/i18n/SWConstants.properties       |   301 +-
 .../sw/marshall/StartTransitionEndObjectsTest.java |     3 +-
 .../common/stunner/sw/client/ShapeSet.java         |     4 +-
 .../sw/client/shapes/CallbackStateShape.java       |    29 +-
 .../stunner/sw/client/shapes/EventStateShape.java  |     9 +-
 .../sw/client/shapes/ForEachStateShape.java        |     7 +-
 .../sw/client/shapes/HasEventAndDataFilter.java    |    38 +
 .../sw/client/shapes/OperationStateShape.java      |     7 +-
 .../sw/client/shapes/ParallelStateShape.java       |     7 +-
 .../stunner/sw/client/shapes/SwitchStateShape.java |     7 +-
 .../stunner/sw/client/shapes/TransitionShape.java  |     6 +-
 .../stunner/sw/client/shapes/icons/IconPath.java   |     1 +
 .../sw/client/shapes/icons/IconPosition.java       |     1 +
 .../client/shapes/HasEventAndDataFilterTest.java   |   103 +
 .../sw-editor/sw-editor-kogito-app/README.md       |    22 -
 .../sw-editor/sw-editor-kogito-app/pom.xml         |    15 +-
 .../stunner/sw/client/editor/DiagramEditor.java    |   161 +-
 .../sw/client/editor/DiagramEditorActivity.java    |    10 +
 .../sw/client/services/ClientDiagramService.java   |    30 +-
 .../sw/client/services/IncrementalMarshaller.java  |     3 +-
 .../sw-editor-kogito-app/src/main/webapp/test.html |   483 +-
 .../sw/client/editor/DiagramEditorTest.java        |    39 +-
 .../sw/client/selenium/SWEditorSeleniumBase.java   |    16 +-
 .../selenium/yaml/SWEditorYamlSeleniumIT.java      |   192 +
 .../yaml/AccumulateRoomReadingsExample.sw.yaml     |    48 +
 .../yaml/ApplicantRequestDecisionExample.sw.yaml   |    33 +
 .../yaml/AsyncFunctionInvocationExample.sw.yaml    |    19 +
 .../yaml/AsyncSubFlowInvocationExample.sw.yaml     |    16 +
 .../selenium/yaml/BookLendingExample.sw.yaml       |    88 +
 .../selenium/yaml/CarVitalsCheckExample.sw.yaml    |    34 +
 .../yaml/CheckInboxPeriodicallyExample.sw.yaml     |    31 +
 .../yaml/CustomerCreditCheckExample.sw.yaml        |    52 +
 .../yaml/EventBasedGreetingExample.sw.yaml         |    30 +
 .../EventBasedServiceInvocationExample.sw.yaml     |    29 +
 .../yaml/EventBasedSwitchStateExample.sw.yaml      |    43 +
 .../selenium/yaml/FillGlassOfWaterExample.sw.yaml  |    28 +
 .../yaml/FinalizeCollegeApplicationExample.sw.yaml |    40 +
 .../yaml/HandleCarAuctionBidExample.sw.yaml        |    28 +
 .../client/selenium/yaml/HelloWorldExample.sw.yaml |    12 +
 .../selenium/yaml/JobMonitoringExample.sw.yaml     |    73 +
 .../yaml/MonitorPatientVitalSignsExample.sw.yaml   |    56 +
 .../yaml/NewPatientOnboardingExample.sw.yaml       |    46 +
 .../yaml/NotifyCustomerWorkflowExample.sw.yaml     |    40 +
 .../selenium/yaml/ParallelExecutionExample.sw.yaml |    18 +
 .../yaml/ProcessTransactionsExample.sw.yaml        |    27 +
 .../selenium/yaml/ProvisionOrdersExample.sw.yaml   |    52 +
 .../yaml/PurchaseOrderDeadlineExample.sw.yaml      |    82 +
 .../yaml/SendCloudEventOnProvisionExample.sw.yaml  |    27 +
 .../selenium/yaml/SolveMathProblemsExample.sw.yaml |    23 +
 .../third_party/jakarta-spec/jsonb/api/pom.xml     |    46 +
 .../api/src/main/java/jakarta/json/EmptyArray.java |     0
 .../src/main/java/jakarta/json/EmptyObject.java    |     0
 .../main/java/jakarta/json/GwtIncompatible.java    |    30 +
 .../api/src/main/java/jakarta/json/JsonArray.java  |     0
 .../main/java/jakarta/json/JsonArrayBuilder.java   |     0
 .../src/main/java/jakarta/json/JsonException.java  |     0
 .../api/src/main/java/jakarta/json/JsonNumber.java |     0
 .../api/src/main/java/jakarta/json/JsonObject.java |     0
 .../main/java/jakarta/json/JsonObjectBuilder.java  |     0
 .../api/src/main/java/jakarta/json/JsonReader.java |     0
 .../api/src/main/java/jakarta/json/JsonString.java |     0
 .../src/main/java/jakarta/json/JsonStructure.java  |     0
 .../api/src/main/java/jakarta/json/JsonValue.java  |     0
 .../src/main/java/jakarta/json/JsonValueImpl.java  |     0
 .../main/java/jakarta/json/bind/JsonProvider.java  |     0
 .../api/src/main/java/jakarta/json/bind/Jsonb.java |   285 +
 .../main/java/jakarta/json/bind/JsonbBuilder.java  |     0
 .../main/java/jakarta/json/bind/JsonbConfig.java   |     0
 .../java/jakarta/json/bind/JsonbException.java     |     0
 .../jakarta/json/bind/adapter/JsonbAdapter.java    |     0
 .../json/bind/annotation/JsonbAnnotation.java      |     0
 .../jakarta/json/bind/annotation/JsonbCreator.java |     0
 .../json/bind/annotation/JsonbDateFormat.java      |     0
 .../json/bind/annotation/JsonbNillable.java        |     0
 .../json/bind/annotation/JsonbNumberFormat.java    |     0
 .../json/bind/annotation/JsonbProperty.java        |     0
 .../json/bind/annotation/JsonbPropertyOrder.java   |     0
 .../jakarta/json/bind/annotation/JsonbSubtype.java |     0
 .../json/bind/annotation/JsonbTransient.java       |     0
 .../json/bind/annotation/JsonbTypeAdapter.java     |     0
 .../bind/annotation/JsonbTypeDeserializer.java     |     0
 .../json/bind/annotation/JsonbTypeInfo.java        |     0
 .../json/bind/annotation/JsonbTypeSerializer.java  |     0
 .../json/bind/annotation/JsonbVisibility.java      |     0
 .../json/bind/config/BinaryDataStrategy.java       |     0
 .../json/bind/config/PropertyNamingStrategy.java   |     0
 .../json/bind/config/PropertyOrderStrategy.java    |     0
 .../bind/config/PropertyVisibilityStrategy.java    |     0
 .../bind/serializer/DeserializationContext.java    |     0
 .../json/bind/serializer/JsonbDeserializer.java    |     0
 .../json/bind/serializer/JsonbSerializer.java      |     0
 .../json/bind/serializer/SerializationContext.java |     0
 .../java/jakarta/json/bind/spi/JsonbProvider.java  |     0
 .../java/jakarta/json/stream/JsonGenerator.java    |   482 +
 .../java/jakarta/json/stream/JsonLocation.java     |     0
 .../main/java/jakarta/json/stream/JsonParser.java  |     0
 .../api/src/main/resources/jakarta/JSONB.gwt.xml   |     7 +
 .../third_party/jakarta-spec/jsonb/impl/pom.xml    |    79 +
 .../src/main/java/jakarta/json/JsonNumberImpl.java |     0
 .../java/jakarta/json/JsonObjectDecorator.java     |   177 +
 .../src/main/java/jakarta/json/JsonStringImpl.java |     0
 .../main/java/jakarta/json/JsonValueDecorator.java |   221 +
 .../serializer/JsonDeserializationContext.java     |    56 +
 .../bind/serializer/JsonSerializationContext.java  |    62 +
 .../json/stream/ContextedJsonGenerator.java        |   164 +
 .../jakarta/json/stream/JsonArrayGenerator.java    |   124 +
 .../json/stream/JsonGeneratorDecorator.java        |   217 +
 .../json/stream/JsonNestedObjecGenerator.java      |     0
 .../java/jakarta/json/stream/JsonParserImpl.java   |   110 +
 .../json/stream/JsonbPropertyDeserializer.java     |    26 +
 .../json/stream/JsonbPropertySerializer.java       |    25 +
 .../jakarta/json/stream/gwt/GWTJsonGenerator.java  |     0
 .../json/stream/gwt/GwtArrayJsonGenerator.java     |   251 +
 .../jakarta/json/stream/gwt/JsonArrayImpl.java     |   236 +
 .../json/stream/gwt/JsonObjectBuilderImpl.java     |     0
 .../jakarta/json/stream/gwt/JsonObjectImpl.java    |   232 +
 .../jakarta/json/stream/gwt/JsonValueImpl.java     |     0
 .../jakarta/json/stream/jre/JreJsonGenerator.java  |    39 +
 .../src/main/resources/jakarta/JSONBImpl.gwt.xml   |     8 +
 .../third_party/jakarta-spec/jsonb/pom.xml         |    24 +
 .../third_party/jakarta-spec/pom.xml               |    23 +
 .../third_party/pom.xml                            |     4 +-
 .../third_party/stdlib/pom.xml                     |    69 +
 .../gwt/emul/client/java/io/BufferedReader.java    |   117 +
 .../common/gwt/emul/client/java/io/DataInput.java  |    49 +
 .../gwt/emul/client/java/io/DataInputStream.java   |   146 +
 .../common/gwt/emul/client/java/io/DataOutput.java |    47 +
 .../gwt/emul/client/java/io/DataOutputStream.java  |    98 +
 .../gwt/emul/client/java/io/EOFException.java      |    18 +
 .../common/gwt/emul/client/java/io/File.java       |   333 +
 .../emul/client/java/io/FileNotFoundException.java |    27 +
 .../common/gwt/emul/client/java/io/FileWriter.java |    45 +
 .../gwt/emul/client/java/io/FilenameFilter.java    |    21 +
 .../gwt/emul/client/java/io/InputStreamReader.java |   156 +
 .../common/gwt/emul/client/java/io/Numbers.java    |    64 +
 .../gwt/emul/client/java/io/RandomAccessFile.java  |   342 +
 .../gwt/emul/client/java/io/StringWriter.java      |    37 +
 .../client/java/io/UTFDataFormatException.java     |    27 +
 .../common/gwt/emul/client/java/io/Writer.java     |    77 +
 .../client/java/lang/ClassNotFoundException.java   |    18 +
 .../gwt/emul/client/java/net/InetAddress.java      |    68 +
 .../emul/client/java/net/InetSocketAddress.java    |    43 +
 .../emul/client/java/net/UnknownHostException.java |    26 +
 .../common/gwt/emul/client/java/util/Calendar.java |    66 +
 .../gwt/emul/client/java/util/StringTokenizer.java |    66 +
 .../common/gwt/emul/client/java/util/UUID.java     |   126 +
 .../gwt/emul/client/java/util/regex/Matcher.java   |    60 +
 .../gwt/emul/client/java/util/regex/Pattern.java   |    54 +
 .../java/util/regex/PatternSyntaxException.java    |    18 +
 .../kie/workbench/common/gwt/emul/Stdlib.gwt.xml   |     8 +
 .../third_party/tooling/eo-yaml/CODE_OF_CONDUCT.md |     4 +
 .../third_party/tooling/eo-yaml/CONTRIBUTING.md    |    14 +
 .../third_party/tooling/eo-yaml/LICENSE            |    29 +
 .../third_party/tooling/eo-yaml/LICENSE.header     |    25 +
 .../third_party/tooling/eo-yaml/README.md          |     5 +
 .../third_party/tooling/eo-yaml/checkstyle.xml     |   314 +
 .../third_party/tooling/eo-yaml/pom.xml            |    91 +
 .../java/com/amihaiemil/eoyaml/AllYamlLines.java   |   189 +
 .../main/java/com/amihaiemil/eoyaml/Backwards.java |    76 +
 .../com/amihaiemil/eoyaml/BaseFoldedScalar.java    |    50 +
 .../java/com/amihaiemil/eoyaml/BaseScalar.java     |   114 +
 .../com/amihaiemil/eoyaml/BaseYamlMapping.java     |   146 +
 .../java/com/amihaiemil/eoyaml/BaseYamlNode.java   |   110 +
 .../com/amihaiemil/eoyaml/BaseYamlSequence.java    |   132 +
 .../java/com/amihaiemil/eoyaml/BaseYamlStream.java |   132 +
 .../java/com/amihaiemil/eoyaml/BuiltComment.java   |    67 +
 .../java/com/amihaiemil/eoyaml/BuiltComments.java  |    77 +
 .../main/java/com/amihaiemil/eoyaml/Comment.java   |    51 +
 .../main/java/com/amihaiemil/eoyaml/Comments.java  |    84 +
 .../amihaiemil/eoyaml/CompatibilityWrapper.java    |    72 +
 .../java/com/amihaiemil/eoyaml/Concatenated.java   |    94 +
 .../main/java/com/amihaiemil/eoyaml/Edited.java    |    72 +
 .../com/amihaiemil/eoyaml/EmptyYamlMapping.java    |    70 +
 .../com/amihaiemil/eoyaml/EmptyYamlSequence.java   |    65 +
 .../com/amihaiemil/eoyaml/FirstCommentFound.java   |   154 +
 .../main/java/com/amihaiemil/eoyaml/Follows.java   |    83 +
 .../java/com/amihaiemil/eoyaml/GWTYamlNode.java    |    46 +
 .../com/amihaiemil/eoyaml/GreaterIndentation.java  |   102 +
 .../main/java/com/amihaiemil/eoyaml/Indented.java  |    73 +
 .../java/com/amihaiemil/eoyaml/InlineComment.java  |    66 +
 .../java/com/amihaiemil/eoyaml/JsonYamlDump.java   |    77 +
 .../com/amihaiemil/eoyaml/JsonYamlMapping.java     |    87 +
 .../com/amihaiemil/eoyaml/JsonYamlSequence.java    |    77 +
 .../eoyaml/MutableYamlMappingBuilder.java          |    98 +
 .../eoyaml/MutableYamlSequenceBuilder.java         |    80 +
 .../src/main/java/com/amihaiemil/eoyaml/Node.java  |    53 +
 .../com/amihaiemil/eoyaml/PlainStringScalar.java   |   105 +
 .../java/com/amihaiemil/eoyaml/ReadComment.java    |    84 +
 .../amihaiemil/eoyaml/ReadFoldedBlockScalar.java   |   195 +
 .../amihaiemil/eoyaml/ReadLiteralBlockScalar.java  |   159 +
 .../com/amihaiemil/eoyaml/ReadPlainScalar.java     |   216 +
 .../com/amihaiemil/eoyaml/ReadYamlMapping.java     |   324 +
 .../com/amihaiemil/eoyaml/ReadYamlSequence.java    |   202 +
 .../java/com/amihaiemil/eoyaml/ReadYamlStream.java |   116 +
 .../com/amihaiemil/eoyaml/ReflectedYamlDump.java   |    78 +
 .../amihaiemil/eoyaml/ReflectedYamlMapping.java    |   221 +
 .../com/amihaiemil/eoyaml/ReflectedYamlScalar.java |    76 +
 .../amihaiemil/eoyaml/ReflectedYamlSequence.java   |    93 +
 .../java/com/amihaiemil/eoyaml/RtYamlInput.java    |   183 +
 .../java/com/amihaiemil/eoyaml/RtYamlLine.java     |    83 +
 .../java/com/amihaiemil/eoyaml/RtYamlMapping.java  |    93 +
 .../amihaiemil/eoyaml/RtYamlMappingBuilder.java    |   103 +
 .../java/com/amihaiemil/eoyaml/RtYamlPrinter.java  |   407 +
 .../com/amihaiemil/eoyaml/RtYamlScalarBuilder.java |   212 +
 .../java/com/amihaiemil/eoyaml/RtYamlSequence.java |    86 +
 .../amihaiemil/eoyaml/RtYamlSequenceBuilder.java   |    82 +
 .../com/amihaiemil/eoyaml/RtYamlStreamBuilder.java |   103 +
 .../amihaiemil/eoyaml/SameIndentationLevel.java    |   133 +
 .../main/java/com/amihaiemil/eoyaml/Scalar.java    |    49 +
 .../java/com/amihaiemil/eoyaml/ScalarComment.java  |    51 +
 .../src/main/java/com/amihaiemil/eoyaml/Skip.java  |   215 +
 .../java/com/amihaiemil/eoyaml/StartMarkers.java   |   109 +
 .../com/amihaiemil/eoyaml/StrictYamlMapping.java   |    82 +
 .../com/amihaiemil/eoyaml/StrictYamlSequence.java  |   149 +
 .../java/com/amihaiemil/eoyaml/WellIndented.java   |   176 +
 .../src/main/java/com/amihaiemil/eoyaml/Yaml.java  |   179 +
 .../main/java/com/amihaiemil/eoyaml/YamlDump.java  |    78 +
 .../main/java/com/amihaiemil/eoyaml/YamlInput.java |   102 +
 .../main/java/com/amihaiemil/eoyaml/YamlLine.java  |   216 +
 .../main/java/com/amihaiemil/eoyaml/YamlLines.java |    86 +
 .../java/com/amihaiemil/eoyaml/YamlMapping.java    |   470 +
 .../com/amihaiemil/eoyaml/YamlMappingBuilder.java  |    94 +
 .../main/java/com/amihaiemil/eoyaml/YamlNode.java  |   113 +
 .../eoyaml/YamlNodeNotFoundException.java          |    67 +
 .../java/com/amihaiemil/eoyaml/YamlPrinter.java    |    50 +
 .../com/amihaiemil/eoyaml/YamlScalarBuilder.java   |   158 +
 .../java/com/amihaiemil/eoyaml/YamlSequence.java   |   280 +
 .../com/amihaiemil/eoyaml/YamlSequenceBuilder.java |    77 +
 .../java/com/amihaiemil/eoyaml/YamlStream.java     |   241 +
 .../com/amihaiemil/eoyaml/YamlStreamBuilder.java   |    51 +
 .../exceptions/YamlIndentationException.java       |    52 +
 .../eoyaml/exceptions/YamlPrintException.java      |    53 +
 .../eoyaml/exceptions/YamlReadingException.java    |    52 +
 .../eoyaml/extensions/MergedYamlMapping.java       |   276 +
 .../eoyaml/extensions/MergedYamlSequence.java      |   199 +
 .../amihaiemil/eoyaml/extensions/package-info.java |    39 +
 .../main/resources/com/amihaiemil/EOYaml.gwt.xml   |     9 +
 .../tooling/marshalling/json/api/pom.xml           |    47 -
 .../java/jakarta/json/bind/GwtIncompatible.java    |    30 -
 .../api/src/main/java/jakarta/json/bind/Jsonb.java |   283 -
 .../jakarta/json/bind/adapter/package-info.java    |    22 -
 .../jakarta/json/bind/annotation/package-info.java |    22 -
 .../jakarta/json/bind/config/package-info.java     |    23 -
 .../main/java/jakarta/json/bind/package-info.java  |    25 -
 .../jakarta/json/bind/serializer/package-info.java |    22 -
 .../java/jakarta/json/bind/spi/package-info.java   |    31 -
 .../java/jakarta/json/stream/JsonGenerator.java    |   483 -
 .../api/src/main/resources/jakarta/Api.gwt.xml     |     6 -
 .../tooling/marshalling/json/common/pom.xml        |     8 +-
 .../java/jakarta/json/JsonObjectDecorator.java     |   177 -
 .../main/java/jakarta/json/JsonValueDecorator.java |   227 -
 .../serializer/JsonDeserializationContext.java     |    57 -
 .../bind/serializer/JsonSerializationContext.java  |    63 -
 .../jakarta/json/stream/JsonArrayGenerator.java    |   113 -
 .../json/stream/JsonGeneratorDecorator.java        |   217 -
 .../java/jakarta/json/stream/JsonParserImpl.java   |    81 -
 .../json/stream/JsonbPropertyDeserializer.java     |    27 -
 .../json/stream/JsonbPropertySerializer.java       |    27 -
 .../json/stream/gwt/GwtArrayJsonGenerator.java     |   244 -
 .../jakarta/json/stream/gwt/JsonArrayImpl.java     |   236 -
 .../jakarta/json/stream/gwt/JsonObjectImpl.java    |   216 -
 .../jakarta/json/stream/jre/JreJsonGenerator.java  |    39 -
 .../json/mapper/annotation/GwtIncompatible.java    |    30 -
 .../stunner/client/json/mapper/internal/Pair.java  |     1 +
 .../deserializer/AbstractBeanJsonDeserializer.java |     1 +
 .../deserializer/BaseNumberJsonDeserializer.java   |     1 +
 .../DeserializerJsonbTypeSerializerWrapper.java    |    38 +
 .../internal/deserializer/JsonbDeserializer.java   |     2 +-
 .../deserializer/JsonbSubtypeDeserializer.java     |     3 +-
 .../array/AbstractArrayJsonDeserializer.java       |     4 +-
 .../array/PrimitiveByteArrayJsonDeserializer.java  |     5 +-
 .../PrimitiveDoubleArrayJsonDeserializer.java      |     5 +-
 .../array/PrimitiveFloatArrayJsonDeserializer.java |     5 +-
 .../PrimitiveIntegerArrayJsonDeserializer.java     |     5 +-
 .../array/PrimitiveLongArrayJsonDeserializer.java  |     7 +-
 .../array/PrimitiveShortArrayJsonDeserializer.java |     5 +-
 .../collection/CollectionDeserializer.java         |     1 +
 .../mapper/internal/serializer/JsonSerializer.java |     2 +-
 .../internal/serializer/JsonSerializerAdapter.java |    24 +-
 .../serializer/JsonbSubtypeSerializer.java         |    12 +-
 .../SerializerJsonbTypeSerializerWrapper.java      |    44 +
 .../serializer/array/ArrayBeanJsonSerializer.java  |    14 +-
 .../serializer/array/ArrayJsonSerializer.java      |     4 +-
 .../array/PrimitiveBooleanArrayJsonSerializer.java |     4 +-
 .../array/PrimitiveByteArrayJsonSerializer.java    |     4 +-
 .../PrimitiveCharacterArrayJsonSerializer.java     |     4 +-
 .../array/PrimitiveDoubleArrayJsonSerializer.java  |     9 +-
 .../array/PrimitiveFloatArrayJsonSerializer.java   |    11 +-
 .../array/PrimitiveIntegerArrayJsonSerializer.java |    11 +-
 .../array/PrimitiveLongArrayLongSerializer.java    |    11 +-
 .../array/PrimitiveShortArrayJsonSerializer.java   |    11 +-
 .../BoxedTypeCollectionJsonSerializer.java         |     2 +-
 .../collection/CollectionJsonSerializer.java       |    10 +-
 .../src/main/resources/jakarta/Common.gwt.xml      |     4 +-
 .../third_party/tooling/marshalling/json/pom.xml   |     3 +-
 .../tooling/marshalling/json/processor/pom.xml     |     6 +-
 .../apt/definition/ArrayBeanFieldDefinition.java   |   196 +-
 .../json/mapper/apt/definition/BeanDefinition.java |    51 +-
 .../apt/definition/CollectionsFieldDefinition.java |   134 +-
 .../apt/definition/EnumBeanFieldDefinition.java    |     1 -
 .../apt/definition/FieldDefinitionFactory.java     |    42 +-
 .../apt/definition/JsonbTypeInfoDefinition.java    |   221 +-
 .../definition/JsonbTypeSerFieldDefinition.java    |   109 +-
 .../mapper/apt/definition/PropertyDefinition.java  |    17 +-
 .../mapper/apt/generator/AbstractGenerator.java    |    10 +
 .../apt/generator/DeserializerGenerator.java       |     1 +
 .../json/mapper/apt/generator/MapperGenerator.java |    14 +-
 .../mapper/apt/generator/SerializerGenerator.java  |     1 +
 .../json/mapper/apt/processor/BeanProcessor.java   |   123 +-
 .../client/json/mapper/apt/utils/TypeRegistry.java |   300 +-
 .../client/json/mapper/apt/utils/TypeUtils.java    |   140 +-
 .../third_party/tooling/marshalling/pom.xml        |     5 +-
 .../tooling/marshalling/yaml/common/pom.xml        |    61 +
 .../yaml/mapper/api/AbstractObjectMapper.java      |   108 +
 .../api/DefaultYAMLSerializationContext.java       |   164 +
 .../client/yaml/mapper/api/YAMLContext.java        |    25 +
 .../yaml/mapper/api/YAMLContextProvider.java       |    44 +
 .../client/yaml/mapper/api/YAMLDeserializer.java   |    37 +
 .../client/yaml/mapper/api/YAMLSerializer.java     |    28 +
 .../yaml/mapper/api/annotation/YAMLMapper.java     |    26 +
 .../yaml/mapper/api/annotation/YamlProperty.java   |    49 +
 .../mapper/api/annotation/YamlPropertyOrder.java   |    30 +
 .../yaml/mapper/api/annotation/YamlSubtype.java    |    40 +
 .../yaml/mapper/api/annotation/YamlTransient.java  |    29 +
 .../api/annotation/YamlTypeDeserializer.java       |    40 +
 .../yaml/mapper/api/annotation/YamlTypeInfo.java   |    43 +
 .../mapper/api/annotation/YamlTypeSerializer.java  |    41 +
 .../exception/YAMLDeserializationException.java    |    52 +
 .../mapper/api/exception/YAMLMappingException.java |    52 +
 .../api/exception/YAMLSerializationException.java  |    52 +
 .../internal/deser/BaseDateYAMLDeserializer.java   |    94 +
 .../internal/deser/BaseNumberYAMLDeserializer.java |   204 +
 .../internal/deser/BooleanYAMLDeserializer.java    |    39 +
 .../internal/deser/CharacterYAMLDeserializer.java  |    39 +
 .../deser/DefaultYAMLDeserializationContext.java   |   131 +
 .../api/internal/deser/EnumYAMLDeserializer.java   |    94 +
 .../deser/StringArrayYAMLDeserializer.java         |    61 +
 .../api/internal/deser/StringYAMLDeserializer.java |    54 +
 .../internal/deser/YAMLDeserializationContext.java |    52 +
 .../deser/array/AbstractArrayYAMLDeserializer.java |    86 +
 .../deser/array/ArrayYAMLDeserializer.java         |    91 +
 .../PrimitiveBooleanArrayYAMLDeserializer.java     |    72 +
 .../array/PrimitiveByteArrayYAMLDeserializer.java  |    46 +
 .../PrimitiveCharacterArrayYAMLDeserializer.java   |    70 +
 .../PrimitiveDoubleArrayYAMLDeserializer.java      |    74 +
 .../array/PrimitiveFloatArrayYAMLDeserializer.java |    72 +
 .../PrimitiveIntegerArrayYAMLDeserializer.java     |    74 +
 .../array/PrimitiveLongArrayYAMLDeserializer.java  |    72 +
 .../array/PrimitiveShortArrayYAMLDeserializer.java |    72 +
 .../deser/bean/AbstractBeanYAMLDeserializer.java   |   135 +
 .../deser/bean/BeanPropertyDeserializer.java       |    44 +
 .../api/internal/deser/bean/HasDeserializer.java   |    49 +
 .../deser/bean/HasDeserializerAndParameters.java   |    43 +
 .../mapper/api/internal/deser/bean/Instance.java   |    46 +
 .../api/internal/deser/bean/InstanceBuilder.java   |    45 +
 .../deser/bean/YamlSubtypeDeserializer.java        |    77 +
 .../AbstractCollectionYAMLDeserializer.java        |    61 +
 .../collection/AbstractListYAMLDeserializer.java   |    59 +
 .../collection/AbstractQueueYAMLDeserializer.java  |    60 +
 .../AbstractSequentialListYAMLDeserializer.java    |    61 +
 .../collection/AbstractSetYAMLDeserializer.java    |    60 +
 .../collection/ArrayListYAMLDeserializer.java      |    57 +
 .../collection/BaseCollectionYAMLDeserializer.java |   103 +
 .../collection/BaseIterableYAMLDeserializer.java   |    46 +
 .../deser/collection/BaseListYAMLDeserializer.java |    43 +
 .../collection/BaseQueueYAMLDeserializer.java      |    49 +
 .../deser/collection/BaseSetYAMLDeserializer.java  |    56 +
 .../collection/BaseSortedSetYAMLDeserializer.java  |    49 +
 .../collection/CollectionYAMLDeserializer.java     |    60 +
 .../deser/collection/EnumSetYAMLDeserializer.java  |    68 +
 .../deser/collection/HashSetYAMLDeserializer.java  |    57 +
 .../deser/collection/IterableYAMLDeserializer.java |    64 +
 .../collection/LinkedHashSetYAMLDeserializer.java  |    57 +
 .../collection/LinkedListYAMLDeserializer.java     |    57 +
 .../deser/collection/ListYAMLDeserializer.java     |    59 +
 .../collection/PriorityQueueYAMLDeserializer.java  |    58 +
 .../deser/collection/QueueYAMLDeserializer.java    |    59 +
 .../deser/collection/SetYAMLDeserializer.java      |    59 +
 .../collection/SortedSetYAMLDeserializer.java      |    60 +
 .../deser/collection/StackYAMLDeserializer.java    |    57 +
 .../deser/collection/TreeSetYAMLDeserializer.java  |    57 +
 .../deser/collection/VectorYAMLDeserializer.java   |    57 +
 .../deser/map/AbstractMapYAMLDeserializer.java     |    66 +
 .../deser/map/BaseMapYAMLDeserializer.java         |    79 +
 .../deser/map/EnumMapYAMLDeserializer.java         |    68 +
 .../deser/map/HashMapYAMLDeserializer.java         |    64 +
 .../deser/map/IdentityHashMapYAMLDeserializer.java |    64 +
 .../deser/map/LinkedHashMapYAMLDeserializer.java   |    64 +
 .../internal/deser/map/MapYAMLDeserializer.java    |    65 +
 .../deser/map/SortedMapYAMLDeserializer.java       |    66 +
 .../deser/map/TreeMapYAMLDeserializer.java         |    64 +
 .../api/internal/ser/AbstractYAMLSerializer.java   |    82 +
 .../api/internal/ser/BaseDateYAMLSerializer.java   |   140 +
 .../api/internal/ser/BaseNumberYAMLSerializer.java |   112 +
 .../api/internal/ser/BooleanYAMLSerializer.java    |    49 +
 .../api/internal/ser/CharacterYAMLSerializer.java  |    50 +
 .../api/internal/ser/CollectionYAMLSerializer.java |    91 +
 .../api/internal/ser/EnumYAMLSerializer.java       |    50 +
 .../api/internal/ser/IterableYAMLSerializer.java   |    76 +
 .../api/internal/ser/StringYAMLSerializer.java     |    58 +
 .../api/internal/ser/YAMLSerializationContext.java |    29 +
 .../internal/ser/YamlTypeSerializerWrapper.java    |    47 +
 .../internal/ser/array/ArrayYAMLSerializer.java    |    82 +
 .../ser/array/BasicArrayYAMLSerializer.java        |    22 +
 .../array/PrimitiveBooleanArrayYAMLSerializer.java |    66 +
 .../array/PrimitiveByteArrayYAMLSerializer.java    |    57 +
 .../PrimitiveCharacterArrayYAMLSerializer.java     |    66 +
 .../array/PrimitiveDoubleArrayYAMLSerializer.java  |    68 +
 .../array/PrimitiveFloatArrayYAMLSerializer.java   |    66 +
 .../array/PrimitiveIntegerArrayYAMLSerializer.java |    67 +
 .../array/PrimitiveLongArrayYAMLSerializer.java    |    66 +
 .../array/PrimitiveShortArrayYAMLSerializer.java   |    68 +
 .../ser/bean/AbstractBeanYAMLSerializer.java       |   122 +
 .../internal/ser/bean/BeanPropertySerializer.java  |    79 +
 .../api/internal/ser/bean/HasSerializer.java       |    49 +
 .../api/internal/ser/bean/InternalSerializer.java  |    37 +
 .../internal/ser/bean/YamlSubtypeSerializer.java   |   122 +
 .../api/internal/ser/map/MapYAMLSerializer.java    |   136 +
 .../mapper/api/internal/utils/Base64Utils.java     |   220 +
 .../yaml/mapper/api/internal/utils/Pair.java       |    29 +
 .../client/yaml/mapper/api/stream/YAMLReader.java  |    22 +
 .../yaml/mapper/api/stream/YAMLSequenceWriter.java |    29 +
 .../client/yaml/mapper/api/stream/YAMLWriter.java  |    36 +
 .../mapper/api/stream/impl/DefaultYAMLReader.java  |    47 +
 .../api/stream/impl/DefaultYAMLSequenceWriter.java |    45 +
 .../mapper/api/stream/impl/DefaultYAMLWriter.java  |   559 +
 .../stunner/client/yaml/mapper/Mapper.gwt.xml      |     9 +
 .../third_party/tooling/marshalling/yaml/pom.xml   |    23 +
 .../tooling/marshalling/yaml/processor/pom.xml     |    99 +
 .../yaml/processor/ApplicationProcessor.java       |   121 +
 .../client/yaml/processor/TypeRegistry.java        |   899 ++
 .../stunner/client/yaml/processor/TypeUtils.java   |   857 ++
 .../yaml/processor/context/GenerationContext.java  |    85 +
 .../definition/ArrayBeanFieldDefinition.java       |   126 +
 .../definition/BasicTypeFieldDefinition.java       |    70 +
 .../yaml/processor/definition/BeanDefinition.java  |   122 +
 .../definition/DefaultBeanFieldDefinition.java     |    54 +
 .../yaml/processor/definition/Definition.java      |    39 +
 .../definition/EnumBeanFieldDefinition.java        |    68 +
 .../yaml/processor/definition/FieldDefinition.java |    35 +
 .../definition/FieldDefinitionFactory.java         |    65 +
 .../definition/IterableBeanFieldDefinition.java    |    78 +
 .../definition/MapBeanFieldDefinition.java         |    86 +
 .../processor/definition/PropertyDefinition.java   |   172 +
 .../definition/YamlTypeInfoFieldDefinition.java    |   124 +
 .../deserializer/DeserializerGenerator.java        |   373 +
 .../processor/exception/GenerationException.java   |    45 +
 .../exception/UnableToCompleteException.java       |    87 +
 .../processor/generator/AbstractGenerator.java     |    92 +
 .../yaml/processor/generator/MapperGenerator.java  |   181 +
 .../yaml/processor/logger/AbstractTreeLogger.java  |   307 +
 .../processor/logger/PrintWriterTreeLogger.java    |    98 +
 .../client/yaml/processor/logger/TreeLogger.java   |   250 +
 .../yaml/processor/processor/BeanProcessor.java    |   202 +
 .../processor/serializer/SerializerGenerator.java  |   265 +
 .../third_party/tooling/pom.xml                    |     4 +-
 .../views/pfly/tab/TabPanelWithDropdownsTest.java  |    14 +-
 .../org/uberfire/client/mvp/EditorActivity.java    |     4 +
 .../java/org/uberfire/client/util/JSFunctions.java |     8 +
 packages/stunner-editors-dmn-loader/package.json   |     1 -
 .../src/@types/react-table.d.ts                    |    74 -
 packages/stunner-editors-dmn-loader/src/index.tsx  |   171 +-
 .../rebind/BindableProxyLoaderGenerator.java       |     7 -
 .../errai/databinding/rebind/DataBindingUtil.java  |    39 +-
 .../common/dmn/api/definition/model/Binding.java   |     7 +
 .../common/dmn/api/definition/model/Context.java   |    13 +
 .../dmn/api/definition/model/ContextEntry.java     |     9 +-
 .../dmn/api/definition/model/DecisionRule.java     |    13 +
 .../dmn/api/definition/model/DecisionTable.java    |    21 +
 .../dmn/api/definition/model/Expression.java       |     8 +
 .../api/definition/model/FunctionDefinition.java   |    17 +
 .../dmn/api/definition/model/ImportedValues.java   |    11 +
 .../dmn/api/definition/model/InformationItem.java  |     6 +
 .../dmn/api/definition/model/InputClause.java      |     9 +
 .../model/InputClauseLiteralExpression.java        |    15 +
 .../definition/model/InputClauseUnaryTests.java    |     8 +
 .../dmn/api/definition/model/Invocation.java       |    12 +
 .../common/dmn/api/definition/model/List.java      |    15 +
 .../api/definition/model/LiteralExpression.java    |    13 +
 .../dmn/api/definition/model/OutputClause.java     |    11 +
 .../model/OutputClauseLiteralExpression.java       |    10 +
 .../definition/model/OutputClauseUnaryTests.java   |     8 +
 .../common/dmn/api/definition/model/Relation.java  |    12 +
 .../api/definition/model/RuleAnnotationClause.java |     4 +
 .../dmn/api/definition/model/UnaryTests.java       |    10 +
 .../definition/model/common/HasTypeRefHelper.java  |     2 +
 .../workbench/common/dmn/api/property/dmn/Id.java  |     4 +
 .../api/resources/i18n/DMNAPIConstants.properties  |     2 +-
 .../dmn/api/definition/model/BindingTest.java      |    17 +
 .../dmn/api/definition/model/ContextEntryTest.java |    17 +
 .../dmn/api/definition/model/ContextTest.java      |    12 +
 .../dmn/api/definition/model/DecisionRuleTest.java |    13 +
 .../api/definition/model/DecisionTableTest.java    |    28 +
 .../dmn/api/definition/model/ExpressionTest.java   |     5 +
 .../definition/model/FunctionDefinitionTest.java   |    17 +
 .../api/definition/model/ImportedValuesTest.java   |    23 +
 .../api/definition/model/InformationItemTest.java  |    13 +
 .../model/InputClauseLiteralExpressionTest.java    |    19 +
 .../dmn/api/definition/model/InputClauseTest.java  |    25 +
 .../model/InputClauseUnaryTestsTest.java           |    16 +
 .../dmn/api/definition/model/InvocationTest.java   |    20 +
 .../common/dmn/api/definition/model/ListTest.java  |    18 +
 .../definition/model/LiteralExpressionTest.java    |    22 +
 .../model/OutputClauseLiteralExpressionTest.java   |    20 +
 .../dmn/api/definition/model/OutputClauseTest.java |    30 +-
 .../model/OutputClauseUnaryTestsTest.java          |    16 +
 .../dmn/api/definition/model/RelationTest.java     |    20 +
 .../dmn/api/definition/model/UnaryTestsTest.java   |    20 +
 .../general/NavigateToDRGEditorCommand.java        |     3 +-
 .../documentation/common/DMNDocumentation.java     |     8 -
 .../template/dmn-documentation-template.html       |    14 -
 .../expressions/ExpressionContainerGrid.java       |     8 +
 .../editors/expressions/ExpressionEditor.java      |    46 +-
 .../expressions/ExpressionEditorControlImpl.java   |    12 +-
 .../editors/expressions/ExpressionEditorView.java  |     4 -
 .../expressions/ExpressionEditorViewImpl.html      |    32 +-
 .../expressions/ExpressionEditorViewImpl.java      |   456 +-
 .../expressions/ExpressionEditorViewImpl.less      |    76 +-
 .../expressions/SaveCurrentStateCommand.java       |     5 +-
 .../commands/ClearExpressionCommand.java           |    11 +-
 .../commands/FillContextExpressionCommand.java     |    11 +-
 .../FillDecisionTableExpressionCommand.java        |    11 +-
 .../commands/FillExpressionCommand.java            |    24 +-
 .../commands/FillFunctionExpressionCommand.java    |    11 +-
 .../commands/FillInvocationExpressionCommand.java  |    11 +-
 .../commands/FillListExpressionCommand.java        |    11 +-
 .../commands/FillLiteralExpressionCommand.java     |     9 +-
 .../commands/FillRelationExpressionCommand.java    |    11 +-
 .../expressions/jsinterop/props/Annotation.java    |     5 +-
 .../editors/expressions/jsinterop/props/Cell.java  |    31 +
 .../expressions/jsinterop/props/Clause.java        |     5 +-
 .../jsinterop/props/ClauseUnaryTests.java          |    36 +
 .../jsinterop/props/DecisionTableProps.java        |     4 +-
 .../jsinterop/props/DecisionTableRule.java         |     6 +-
 .../expressions/jsinterop/props/FunctionProps.java |     6 +-
 .../jsinterop/props/InputClauseProps.java          |    31 +
 .../jsinterop/props/InvocationFunctionProps.java   |    15 +
 .../jsinterop/props/InvocationProps.java           |     6 +-
 .../expressions/jsinterop/props/ListProps.java     |     5 +-
 .../expressions/jsinterop/props/PMMLParam.java     |     6 +-
 .../editors/expressions/jsinterop/props/Row.java   |     4 +-
 .../expressions/jsinterop/props/RuleEntry.java     |    32 +
 .../jsinterop/util/BoxedExpressionService.java     |   100 -
 .../jsinterop/util/ExpressionEditorService.java    |    73 +
 .../jsinterop/util/ExpressionModelFiller.java      |   214 +-
 .../jsinterop/util/ExpressionPropsFiller.java      |    60 +-
 .../types/ExpressionEditorModelEnricher.java       |    19 +
 .../editors/expressions/types/ExpressionType.java  |     4 +-
 .../expressions/types/context/ContextGrid.java     |     6 +-
 .../dtable/DecisionTableEditorDefinition.java      |     5 +
 .../DecisionTableEditorDefinitionEnricher.java     |   115 +-
 .../pmml/PMMLDocumentMetadataProvider.java         |     3 +-
 .../types/invocation/InvocationGrid.java           |     6 +-
 .../editors/expressions/types/list/ListGrid.java   |     6 +-
 .../types/literal/LiteralExpressionGrid.java       |     3 +-
 .../editors/expressions/util/ExpressionState.java  |    14 +-
 .../editors/expressions/util/TypeRefUtils.java     |    22 +
 .../included/commands/AddIncludedModelCommand.java |    15 +-
 .../commands/RemovePMMLIncludedModelCommand.java   |     4 +-
 .../editors/included/grid/PMMLCardComponent.java   |     3 +-
 .../editors/included/modal/IncludedModelModal.java |     7 +
 .../dmn/client/events/IncludedPMMLModelUpdate.java |    33 +
 .../workbench/common/dmn/client/js/DMNLoader.java  |     4 +-
 .../dmn/client/marshaller/common/WrapperUtils.java |    11 +
 .../converters/ContextEntryPropertyConverter.java  |     8 -
 .../converters/ListPropertyConverter.java          |    10 +-
 .../dmn/client/resources/DMNImageResources.java    |     6 -
 .../dmn/client/resources/DMNSVGGlyphFactory.java   |     2 -
 .../resources/i18n/DMNClientConstants.properties   |    18 +-
 .../images/logos/supported-by-red-hat-logo.svg     |     1 -
 .../common/DMNDocumentationFactoryTest.java        |     1 -
 .../ExpressionEditorControlImplTest.java           |     7 +-
 .../editors/expressions/ExpressionEditorTest.java  |    32 +-
 .../expressions/ExpressionEditorViewImplTest.java  |   538 +-
 .../expressions/SaveCurrentStateCommandTest.java   |     2 +-
 .../commands/ClearExpressionCommandTest.java       |    10 +-
 .../commands/FillContextExpressionCommandTest.java |    18 +-
 .../FillDecisionTableExpressionCommandTest.java    |    18 +-
 .../commands/FillExpressionCommandTest.java        |    13 +-
 .../FillFunctionExpressionCommandTest.java         |    18 +-
 .../FillInvocationExpressionCommandTest.java       |    18 +-
 .../commands/FillListExpressionCommandTest.java    |    17 +-
 .../commands/FillLiteralExpressionCommandTest.java |    18 +-
 .../FillRelationExpressionCommandTest.java         |    18 +-
 .../jsinterop/util/ExpressionModelFillerTest.java  |   105 +-
 .../jsinterop/util/ExpressionPropsFillerTest.java  |    16 +-
 .../expressions/types/context/ContextGridTest.java |     3 +-
 .../DecisionTableEditorDefinitionEnricherTest.java |     6 +-
 .../types/invocation/InvocationGridTest.java       |     3 +-
 .../expressions/types/list/ListGridTest.java       |     4 +-
 .../expressions/util/ExpressionStateTest.java      |    30 +-
 .../commands/AddIncludedModelCommandTest.java      |    23 +-
 .../included/modal/IncludedModelModalTest.java     |     8 +-
 .../client/editor/AbstractDMNDiagramEditor.java    |     8 +-
 .../editor/AbstractDMNDiagramEditorTest.java       |    13 +-
 .../pom.xml                                        |     2 +-
 .../showcase/client/editor/DMNDiagramEditor.java   |     7 +-
 .../src/main/webapp/test.html                      |    14 +-
 .../client/selenium/DMNDesignerIntelliSenseIT.java |     4 +-
 .../selenium/DMNDesignerKogitoSeleniumIT.java      |     5 +-
 .../selenium/locator/EditorXPathLocator.java       |    10 +-
 .../pom.xml                                        |     2 +-
 .../widget/grid/columns/RowNumberColumn.java       |     4 +-
 packages/uniforms-patternfly/.eslintignore         |     2 +
 packages/uniforms-patternfly/package.json          |     2 +
 packages/uniforms-patternfly/src/DateField.tsx     |   197 +-
 packages/uniforms-patternfly/src/NumField.tsx      |     7 +-
 packages/uniforms-patternfly/src/TextField.tsx     |   209 +-
 .../src/__tests__/DateField.test.tsx               |   105 +-
 .../src/__tests__/NumField.test.tsx                |     7 +
 .../src/__tests__/TextField.test.tsx               |    80 +-
 packages/uniforms-patternfly/src/cjs               |     1 +
 packages/uniforms-patternfly/src/esm               |     1 +
 packages/unitables-dmn/package.json                |     1 +
 packages/unitables-dmn/src/DmnBoxedOutputs.tsx     |   252 -
 packages/unitables-dmn/src/DmnRunnerOutputs.tsx    |   201 +
 .../unitables-dmn/src/DmnRunnerOutputsTable.css    |    20 +
 .../unitables-dmn/src/DmnRunnerOutputsTable.tsx    |   326 +
 packages/unitables-dmn/src/DmnTableResults.tsx     |   126 -
 packages/unitables-dmn/src/DmnTypes.ts             |    43 -
 .../unitables-dmn/src/DmnUnitablesValidator.ts     |     4 +-
 packages/unitables-dmn/src/index.ts                |     2 +-
 .../src/uniforms/DmnUnitablesJsonSchemaBridge.ts   |    22 +-
 packages/unitables/package.json                    |     3 +
 packages/unitables/src/Unitables.css               |    24 +
 packages/unitables/src/Unitables.tsx               |   358 +-
 packages/unitables/src/UnitablesBoxedTypes.ts      |    43 -
 packages/unitables/src/UnitablesContext.tsx        |    41 +
 .../unitables/src/UnitablesContextProvider.tsx     |    37 +
 packages/unitables/src/UnitablesInputs.tsx         |   201 -
 packages/unitables/src/UnitablesRow.tsx            |   109 +-
 packages/unitables/src/UnitablesTypes.ts           |    39 +
 packages/unitables/src/UnitablesWrapper.tsx        |    61 +
 packages/unitables/src/bee/UnitablesBeeTable.tsx   |   519 +
 packages/unitables/src/bee/index.ts                |    17 +
 packages/unitables/src/boxed/CustomTable.css       |   128 -
 packages/unitables/src/boxed/CustomTable.tsx       |   337 -
 .../unitables/src/boxed/TableOperationHandler.ts   |    90 -
 packages/unitables/src/boxed/index.ts              |    17 -
 packages/unitables/src/index.ts                    |     4 +-
 packages/unitables/src/style.scss                  |     4 -
 .../src/uniforms/UnitablesJsonSchemaBridge.ts      |   167 -
 .../src/uniforms/UnitablesJsonSchemaBridge.tsx     |   159 +
 .../dashbuilder-editor-extension-smoke.test.ts     |     2 +
 .../it-tests/helpers/VSCodeTestHelper.ts           |    32 +
 .../package.json                                   |     6 +-
 .../it-tests/extension-editors-bpmn.test.ts        |     2 +
 .../it-tests/extension-editors-dmn.test.ts         |     7 +-
 .../it-tests/extension-editors-scesim.test.ts      |     2 +
 .../it-tests/extension-editors-smoke.test.ts       |     2 +
 .../it-tests/helpers/VSCodeTestHelper.ts           |    32 +
 .../it-tests/helpers/dmn/ExpressionEditorHelper.ts |    18 +-
 .../it-tests/helpers/dmn/ExpressionType.ts         |     2 +-
 .../package.json                                   |     6 +-
 .../it-tests/helpers/VSCodeTestHelper.ts           |    59 +-
 .../it-tests/helpers/swf/SwfEditorTestHelper.ts    |     2 +-
 .../autocompletion/autocompletion.sw.yaml          |     1 +
 .../autocompletion/autocompletion.sw.yaml.result   |    13 +-
 .../resources/expression/expression.sw.json        |    35 +
 .../resources/expression/expression.sw.yaml        |    22 +
 .../resources/expression/schema/schema.json        |    24 +
 .../resources/expression/specs/openapi.json        |    49 +
 ...orkflow-editor-extension-autocompletion.test.ts |    35 +-
 ...kflow-editor-extension-basic-operations.test.ts |     4 +-
 ...low-editor-extension-diagram-navigation.test.ts |    47 +-
 ...ss-workflow-editor-extension-expression.test.ts |    85 +
 ...ess-workflow-editor-extension-functions.test.ts |     2 +
 ...verless-workflow-editor-extension-smoke.test.ts |     2 +
 ...kflow-editor-extension-syntax-highlight.test.ts |     4 +-
 .../package.json                                   |     8 +-
 .../builtInVsCodeEditorSwfContributions.ts         |     2 +-
 .../src/extension/extension.ts                     |    11 +-
 .../it-tests/helpers/VSCodeTestHelper.ts           |    32 +
 .../it-tests/yard-editor.test.ts                   |     2 +
 packages/vscode-extension-yard-editor/package.json |     6 +-
 .../src/constants/ExtensionHelper.ts               |     8 +-
 .../src/context/WorkspacesContextProvider.tsx      |    37 +-
 .../WorkspaceFileRelativePathParser.ts             |    45 +-
 .../src/worker/WorkspacesSharedWorker.ts           |     4 +
 .../WorkspaceFileRelativePathParser.test.ts        |    12 +-
 .../src/decision/DecisionExpressionDefinitions.ts  |    54 +-
 packages/yard-editor/src/uiEditor/YardUIEditor.tsx |    21 +-
 pnpm-lock.yaml                                     |   393 +-
 repo/graph.dot                                     |    23 +-
 repo/graph.json                                    |    37 +-
 3998 files changed, 72884 insertions(+), 277290 deletions(-)

diff --cc packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx
index 76a2eeb0bf,6c90c16bf3..ea11e10fc9
--- a/packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx
@@@ -14,25 -14,30 +14,25 @@@
   * limitations under the License.
   */
  
- import { OpenShiftConnection } from "@kie-tools-core/openshift/dist/service/OpenShiftConnection";
- import { OpenShiftService } from "@kie-tools-core/openshift/dist/service/OpenShiftService";
 +import { Octokit } from "@octokit/rest";
  import * as React from "react";
 -import { useCallback, useContext, useEffect, useMemo, useState } from "react";
 +import { useContext, useEffect, useMemo, useState } from "react";
  import { getCookie, setCookie } from "../cookies";
 -import { Octokit } from "@octokit/rest";
 -import { useQueryParams } from "../queryParams/QueryParamsContext";
 -import { Modal, ModalVariant } from "@patternfly/react-core/dist/js/components/Modal";
 -import { SettingsModalBody, SettingsTabs } from "./SettingsModalBody";
 -import { readOpenShiftConfigCookie } from "./openshift/OpenShiftSettingsConfig";
 +import { SwfServiceCatalogStore } from "../editor/api/SwfServiceCatalogStore";
 +import { useKieSandboxExtendedServices } from "../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
 +import { KieSandboxExtendedServicesStatus } from "../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
  import { OpenShiftInstanceStatus } from "../openshift/OpenShiftInstanceStatus";
+ import { OpenShiftService } from "@kie-tools-core/kubernetes-bridge/dist/service/OpenShiftService";
 -import { useHistory } from "react-router";
 -import { QueryParams } from "../navigation/Routes";
 -import { GITHUB_AUTH_TOKEN_COOKIE_NAME } from "./github/GitHubSettingsTab";
 +import { FeaturePreviewSettingsConfig, readFeaturePreviewConfigCookie } from "./featurePreview/FeaturePreviewConfig";
 +import { GITHUB_AUTH_TOKEN_COOKIE_NAME } from "./github/GitHubSettings";
  import { KafkaSettingsConfig, readKafkaConfigCookie } from "./kafka/KafkaSettingsConfig";
 +import { readOpenShiftConfigCookie } from "./openshift/OpenShiftSettingsConfig";
  import { readServiceAccountConfigCookie, ServiceAccountSettingsConfig } from "./serviceAccount/ServiceAccountConfig";
  import {
    readServiceRegistryConfigCookie,
    ServiceRegistrySettingsConfig,
  } from "./serviceRegistry/ServiceRegistryConfig";
 -import { useKieSandboxExtendedServices } from "../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
 -import { KieSandboxExtendedServicesStatus } from "../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
 -import { SwfServiceCatalogStore } from "../editor/api/SwfServiceCatalogStore";
 -import { FeaturePreviewSettingsConfig, readFeaturePreviewConfigCookie } from "./featurePreview/FeaturePreviewConfig";
+ import { KubernetesConnection } from "@kie-tools-core/kubernetes-bridge/dist/service";
  
  export enum AuthStatus {
    SIGNED_OUT,
@@@ -64,9 -69,11 +64,9 @@@ export class ExtendedServicesConfig 
  }
  
  export interface SettingsContextType {
 -  isOpen: boolean;
 -  activeTab: SettingsTabs;
    openshift: {
      status: OpenShiftInstanceStatus;
-     config: OpenShiftConnection;
+     config: KubernetesConnection;
    };
    kieSandboxExtendedServices: {
      config: ExtendedServicesConfig;
diff --cc packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettings.tsx
index 0e3990579c,0000000000..7402abd0dd
mode 100644,000000..100644
--- a/packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettings.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettings.tsx
@@@ -1,155 -1,0 +1,155 @@@
 +/*
 + * Copyright 2023 Red Hat, Inc. and/or its affiliates.
 + *
 + * Licensed under the Apache License, Version 2.0 (the "License");
 + * you may not use this file except in compliance with the License.
 + * You may obtain a copy of the License at
 + *
 + *        http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing, software
 + * distributed under the License is distributed on an "AS IS" BASIS,
 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 + * See the License for the specific language governing permissions and
 + * limitations under the License.
 + */
 +
- import { OpenShiftConnection } from "@kie-tools-core/openshift/dist/service/OpenShiftConnection";
 +import { Modal, ModalVariant } from "@patternfly/react-core/dist/js/components/Modal";
 +import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
 +import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
 +import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
 +import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
 +import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
 +import { AddCircleOIcon } from "@patternfly/react-icons/dist/js/icons/add-circle-o-icon";
 +import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-circle-icon";
 +import * as React from "react";
 +import { useCallback, useState } from "react";
 +import { Link } from "react-router-dom";
 +import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
 +import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
 +import { routes } from "../../navigation/Routes";
 +import { OpenShiftInstanceStatus } from "../../openshift/OpenShiftInstanceStatus";
 +import { obfuscate } from "../github/GitHubSettings";
 +import { useSettings, useSettingsDispatch } from "../SettingsContext";
 +import { SettingsPageProps } from "../types";
 +import { saveConfigCookie } from "./OpenShiftSettingsConfig";
 +import { OpenShiftSettingsSimpleConfig } from "./OpenShiftSettingsSimpleConfig";
++import { KubernetesConnection } from "@kie-tools-core/kubernetes-bridge/dist/service";
 +
 +export function OpenShiftSettings(props: SettingsPageProps) {
 +  const settings = useSettings();
 +  const settingsDispatch = useSettingsDispatch();
 +  const [isModalOpen, setIsModalOpen] = useState(false);
 +  const kieSandboxExtendedServices = useKieSandboxExtendedServices();
 +
 +  const handleModalToggle = useCallback(() => {
 +    setIsModalOpen((prevIsModalOpen) => !prevIsModalOpen);
 +  }, []);
 +
 +  const onDisconnect = useCallback(() => {
 +    settingsDispatch.openshift.setStatus(OpenShiftInstanceStatus.DISCONNECTED);
-     const newConfig: OpenShiftConnection = {
++    const newConfig: KubernetesConnection = {
 +      namespace: settings.openshift.config.namespace,
 +      host: settings.openshift.config.host,
 +      token: "",
 +    };
 +    settingsDispatch.openshift.setConfig(newConfig);
 +    saveConfigCookie(newConfig);
 +  }, [settings.openshift.config, settingsDispatch.openshift]);
 +
 +  return (
 +    <Page>
 +      <PageSection variant={"light"} isWidthLimited>
 +        <TextContent>
 +          <Text component={TextVariants.h1}>OpenShift</Text>
 +          <Text component={TextVariants.p}>
 +            Data you provide here is necessary for deploying models you design to your OpenShift instance.
 +            <br />
 +            All information is locally stored in your browser and never shared with anyone.
 +          </Text>
 +        </TextContent>
 +      </PageSection>
 +
 +      <PageSection>
 +        {kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.RUNNING && (
 +          <>
 +            <Alert
 +              variant="danger"
 +              title={
 +                <Text>
 +                  Connect to{" "}
 +                  <Link to={routes.settings.kie_sandbox_extended_services.path({})}>KIE Sandbox Extended Services</Link>{" "}
 +                  before configuring your OpenShift instance
 +                </Text>
 +              }
 +              aria-live="polite"
 +              isInline
 +            >
 +              KIE Sandbox Extended Services is necessary for proxying Serverless Logic Web Tools requests to OpenShift,
 +              thus making it possible to deploy models.
 +            </Alert>
 +            <br />
 +          </>
 +        )}
 +        <PageSection variant={"light"}>
 +          {settings.openshift.status === OpenShiftInstanceStatus.CONNECTED ? (
 +            <EmptyState>
 +              <EmptyStateIcon icon={CheckCircleIcon} color={"var(--pf-global--success-color--100)"} />
 +              <TextContent>
 +                <Text component={"h2"}>{"You're connected to OpenShift."}</Text>
 +              </TextContent>
 +              <EmptyStateBody>
 +                Deploying models is <b>enabled</b>.
 +                <br />
 +                <b>Token: </b>
 +                <i>{obfuscate(settings.openshift.config.token)}</i>
 +                <br />
 +                <b>Host: </b>
 +                <i>{settings.openshift.config.host}</i>
 +                <br />
 +                <b>Namespace (project): </b>
 +                <i>{settings.openshift.config.namespace}</i>
 +                <br />
 +                <br />
 +                <Button variant={ButtonVariant.tertiary} onClick={onDisconnect}>
 +                  Disconnect
 +                </Button>
 +              </EmptyStateBody>
 +            </EmptyState>
 +          ) : (
 +            <EmptyState>
 +              <EmptyStateIcon icon={AddCircleOIcon} />
 +              <TextContent>
 +                <Text component={"h2"}>You are not connected to OpenShift.</Text>
 +              </TextContent>
 +              <EmptyStateBody>
 +                You currently have no OpenShift connections. <br />
 +                <br />
 +                <Button variant={ButtonVariant.primary} onClick={handleModalToggle} data-testid="add-connection-button">
 +                  Add connection
 +                </Button>
 +              </EmptyStateBody>
 +            </EmptyState>
 +          )}
 +        </PageSection>
 +      </PageSection>
 +
 +      {props.pageContainerRef.current && (
 +        <Modal
 +          title="Add connection"
 +          isOpen={
 +            isModalOpen &&
 +            kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.STOPPED &&
 +            (settings.openshift.status === OpenShiftInstanceStatus.DISCONNECTED ||
 +              settings.openshift.status === OpenShiftInstanceStatus.EXPIRED)
 +          }
 +          onClose={handleModalToggle}
 +          variant={ModalVariant.large}
 +          appendTo={props.pageContainerRef.current || document.body}
 +        >
 +          <OpenShiftSettingsSimpleConfig />
 +        </Modal>
 +      )}
 +    </Page>
 +  );
 +}
diff --cc packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettingsSimpleConfig.tsx
index b652885b4f,2024355c73..c3de7692a6
--- a/packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettingsSimpleConfig.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettingsSimpleConfig.tsx
@@@ -14,11 -14,7 +14,6 @@@
   * limitations under the License.
   */
  
- import {
-   isOpenShiftConnectionValid,
-   OpenShiftConnection,
- } from "@kie-tools-core/openshift/dist/service/OpenShiftConnection";
- import { QuickStartContext, QuickStartContextValues } from "@patternfly/quickstarts";
 -import * as React from "react";
  import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
  import { Button } from "@patternfly/react-core/dist/js/components/Button";
  import { ActionGroup, Form, FormAlert, FormGroup } from "@patternfly/react-core/dist/js/components/Form";
@@@ -28,17 -24,19 +23,23 @@@ import { Text } from "@patternfly/react
  import { TextInput } from "@patternfly/react-core/dist/js/components/TextInput";
  import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
  import { TimesIcon } from "@patternfly/react-icons/dist/js/icons/times-icon";
 -import { useCallback, useEffect, useState } from "react";
 +import * as React from "react";
 +import { useCallback, useEffect, useState, useContext } from "react";
 +import { Link } from "react-router-dom";
  import { useAppI18n } from "../../i18n";
 -import { OpenShiftInstanceStatus } from "../../openshift/OpenShiftInstanceStatus";
+ import {
+   isKubernetesConnectionValid,
+   KubernetesConnection,
+   KubernetesConnectionStatus,
+ } from "@kie-tools-core/kubernetes-bridge/dist/service";
 -import { EMPTY_CONFIG, saveConfigCookie } from "./OpenShiftSettingsConfig";
 -import { useSettings, useSettingsDispatch } from "../SettingsContext";
  import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
  import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
 -import { SettingsTabs } from "../SettingsModalBody";
 +import { routes } from "../../navigation/Routes";
 +import { OpenShiftInstanceStatus } from "../../openshift/OpenShiftInstanceStatus";
 +import { QuickStartIds } from "../../quickstarts-data";
 +import { useSettings, useSettingsDispatch } from "../SettingsContext";
 +import { EMPTY_CONFIG, saveConfigCookie } from "./OpenShiftSettingsConfig";
++import { QuickStartContext, QuickStartContextValues } from "@patternfly/quickstarts";
  
  enum FormValiationOptions {
    INITIAL = "INITIAL",
@@@ -90,8 -87,16 +91,15 @@@ export function OpenShiftSettingsSimple
      }
  
      setConnecting(true);
-     const isConfigOk = await settingsDispatch.openshift.service.isConnectionEstablished(config);
+     const isConfigOk =
+       (await settingsDispatch.openshift.service.isConnectionEstablished(config)) ===
+       KubernetesConnectionStatus.CONNECTED;
  
+     if (isConfigOk) {
+       saveConfigCookie(config);
+       settingsDispatch.openshift.setConfig(config);
+       settingsDispatch.openshift.setStatus(OpenShiftInstanceStatus.CONNECTED);
+     }
 -
      setConnecting(false);
  
      if (!isConfigOk) {
diff --cc packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/TransitionShape.java
index 3b2a6e00ac,8f9537f37e..e28bee3f12
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/TransitionShape.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/TransitionShape.java
@@@ -99,7 -96,6 +96,6 @@@ public class TransitionShape<W
                  || object instanceof EventConditionTransition
                  || object instanceof DataConditionTransition
                  || object instanceof DefaultConditionTransition
-                 || object instanceof ActionTransition
                  || object instanceof CompensationTransition;
      }
 -}
 +}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 15/27: NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1590)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit 41be9e3883cb43c3f58247101598d044e7699f57
Merge: 414c4cbca7 feac1737f8
Author: Paulo Martins <pa...@gmail.com>
AuthorDate: Thu Apr 27 10:27:46 2023 -0300

    NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1590)

 .github/actions/setup-env/action.yml               |     6 +-
 .github/workflows/ci_build.yml                     |     4 +-
 .github/workflows/ci_check_code_formatting.yml     |     1 +
 .github/workflows/daily_dev_publish.yml            |    12 +-
 .github/workflows/publish_jitexecutor_native.yml   |    16 +-
 .github/workflows/release_build.yml                |   109 +-
 .github/workflows/release_dry_run.yml              |     2 +-
 .github/workflows/release_publish.yml              |     2 +-
 .github/workflows/staging_build.yml                |    38 -
 .gitignore                                         |     2 +
 .../uniforms-patternfly/src/schemas/json-schema.ts |     3 +-
 package.json                                       |     4 +-
 packages/boxed-expression-component/README.md      |     2 +-
 .../it-tests/cypress.config.ts                     |    28 -
 .../it-tests/cypress/plugins/index.js              |    25 -
 .../data_cell_focus.snap.png                       |   Bin 43437 -> 0 bytes
 .../header_cell_focus.snap.png                     |   Bin 43443 -> 0 bytes
 .../input_header_cell_focus.snap.png               |   Bin 42798 -> 0 bytes
 .../function_parameter_focus.snap.png              |   Bin 31810 -> 0 bytes
 .../list_expression.cy.ts/data_cell_focus.snap.png |   Bin 16670 -> 0 bytes
 .../data_cell_focus.snap.png                       |   Bin 23398 -> 0 bytes
 .../literal_expression.cy.ts/no_focus.snap.png     |   Bin 23367 -> 0 bytes
 .../data_cell_focus.snap.png                       |   Bin 38625 -> 0 bytes
 .../it-tests/e2e/context_expression.cy.ts          |   274 -
 .../it-tests/e2e/decision_table_expression.cy.ts   |   447 -
 .../it-tests/e2e/invocation_expression.cy.ts       |    54 -
 .../it-tests/e2e/list_expression.cy.ts             |    42 -
 .../it-tests/e2e/literal_expression.cy.ts          |    63 -
 .../it-tests/e2e/popover.cy.ts                     |   161 -
 .../it-tests/e2e/relation_expression.cy.ts         |   158 -
 .../it-tests/plugins/index.js                      |    20 -
 .../it-tests/support/commands.d.ts                 |    28 -
 .../it-tests/support/commands.ts                   |    71 -
 .../it-tests/support/e2e.ts                        |    20 -
 .../it-tests/tsconfig.json                         |     7 -
 packages/boxed-expression-component/package.json   |     3 +-
 .../showcase/defaultExpression.ts                  |   255 +
 .../boxed-expression-component/showcase/index.css  |     7 +-
 .../boxed-expression-component/showcase/index.tsx  |   136 +-
 .../showcase/static/index.html                     |     1 -
 .../showcase/webpack.config.js                     |     2 +-
 .../src/@types/react-table.ts                      |    46 +-
 packages/boxed-expression-component/src/api/Bee.ts |    50 +
 .../src/api/BeeGwtService.ts                       |    26 +
 .../boxed-expression-component/src/api/BeeTable.ts |   116 +
 .../src/api/BoxedExpressionEditor.ts               |    85 -
 .../src/api/BoxedExpressionEditorGWTService.ts     |    44 -
 .../src/api/BuiltinAggregation.ts                  |    23 -
 .../src/api/ContextEntry.ts                        |    83 -
 .../boxed-expression-component/src/api/DataType.ts |    29 -
 .../src/api/DataTypeProps.ts                       |    24 -
 .../src/api/DecisionTableRule.ts                   |    48 -
 .../src/api/DmnBuiltInDataType.ts                  |    29 +
 .../src/api/DmnDataType.ts                         |    24 +
 .../src/api/EnumUtils.ts                           |    23 -
 .../src/api/ExpressionDefinition.ts                |   309 +
 .../src/api/ExpressionDefinitionLogicType.ts       |    26 +
 .../src/api/ExpressionProps.ts                     |   139 -
 .../src/api/FunctionKind.ts                        |    67 -
 .../src/api/HitPolicy.ts                           |    25 -
 .../src/api/LogicType.ts                           |    27 -
 .../boxed-expression-component/src/api/Table.ts    |   164 -
 .../boxed-expression-component/src/api/index.ts    |    20 +-
 .../BoxedExpressionEditor.tsx                      |    93 -
 .../BoxedExpressionProvider.css                    |    94 -
 .../BoxedExpressionProvider.tsx                    |    67 -
 .../src/components/BoxedExpressionEditor/index.ts  |    18 -
 .../ContextExpression/ContextEntryExpression.tsx   |    67 -
 .../ContextEntryExpressionCell.css                 |    19 -
 .../ContextEntryExpressionCell.tsx                 |    57 -
 .../ContextExpression/ContextEntryInfo.css         |    37 -
 .../ContextExpression/ContextEntryInfo.tsx         |    83 -
 .../ContextExpression/ContextEntryInfoCell.tsx     |    71 -
 .../ContextExpression/ContextExpression.css        |    32 -
 .../ContextExpression/ContextExpression.tsx        |   301 -
 .../src/components/ContextExpression/index.ts      |    21 -
 .../DecisionTableExpression.css                    |   102 -
 .../DecisionTableExpression.tsx                    |   431 -
 .../DecisionTableExpression/HitPolicySelector.css  |    31 -
 .../DecisionTableExpression/HitPolicySelector.tsx  |   158 -
 .../EditExpressionMenu/DataTypeSelector.tsx        |   140 -
 .../EditExpressionMenu/EditExpressionMenu.tsx      |   216 -
 .../EditExpressionMenu/EditTextInline.tsx          |   113 -
 .../src/components/EditExpressionMenu/index.ts     |    19 -
 .../ExpressionContainer/ExpressionContainer.css    |    35 -
 .../ExpressionContainer/ExpressionContainer.tsx    |   102 -
 .../src/components/ExpressionContainer/index.ts    |    17 -
 .../FunctionExpression/EditParameters.css          |    65 -
 .../FunctionExpression/EditParameters.tsx          |   116 -
 .../FunctionExpression/FunctionExpression.css      |    49 -
 .../FunctionExpression/FunctionExpression.tsx      |   520 -
 .../FunctionExpression/FunctionKindSelector.tsx    |    74 -
 .../src/components/FunctionExpression/index.ts     |    19 -
 .../InvocationExpression/InvocationExpression.css  |    61 -
 .../InvocationExpression/InvocationExpression.tsx  |   273 -
 .../components/ListExpression/ListExpression.tsx   |   182 -
 .../LiteralExpression/LiteralExpression.css        |    74 -
 .../LiteralExpression/LiteralExpression.tsx        |   151 -
 .../LiteralExpression/PMMLLiteralExpression.css    |    26 -
 .../LiteralExpression/PMMLLiteralExpression.tsx    |    94 -
 .../src/components/LiteralExpression/index.ts      |    18 -
 .../LogicTypeSelector/LogicTypeSelector.css        |    42 -
 .../LogicTypeSelector/LogicTypeSelector.tsx        |   252 -
 .../src/components/LogicTypeSelector/index.ts      |    17 -
 .../src/components/PopoverMenu/PopoverMenu.css     |    45 -
 .../src/components/PopoverMenu/PopoverMenu.tsx     |   156 -
 .../RelationExpression/RelationExpression.css      |    19 -
 .../RelationExpression/RelationExpression.tsx      |   192 -
 .../src/components/Resizer/Resizer.css             |    37 -
 .../src/components/Resizer/Resizer.tsx             |   215 -
 .../src/components/Resizer/ResizerSupervisor.css   |    19 -
 .../src/components/Resizer/ResizerSupervisor.tsx   |    42 -
 .../src/components/Resizer/common/index.ts         |    55 -
 .../src/components/Resizer/dom/Cell.ts             |   186 -
 .../src/components/Resizer/dom/DOMSession.ts       |    65 -
 .../components/Resizer/dom/ResizerSupervisorDOM.ts |    74 -
 .../src/components/Resizer/dom/index.ts            |    19 -
 .../src/components/Resizer/index.ts                |    20 -
 .../components/SelectionBox/CellSelectionBox.css   |    25 -
 .../components/SelectionBox/CellSelectionBox.tsx   |   186 -
 .../src/components/SelectionBox/SelectionBox.css   |    27 -
 .../src/components/SelectionBox/SelectionBox.tsx   |   154 -
 .../src/components/SelectionBox/index.ts           |    18 -
 .../src/components/Table/EditableCell.css          |    72 -
 .../src/components/Table/EditableCell.tsx          |   277 -
 .../src/components/Table/ResizableHeaderCell.tsx   |   159 -
 .../src/components/Table/Table.css                 |   215 -
 .../src/components/Table/Table.tsx                 |   542 -
 .../src/components/Table/TableBody.tsx             |   191 -
 .../src/components/Table/TableHandler.tsx          |   305 -
 .../src/components/Table/TableHandlerMenu.css      |    23 -
 .../src/components/Table/TableHandlerMenu.tsx      |    69 -
 .../src/components/Table/TableHeader.tsx           |   297 -
 .../src/components/Table/TdAdditiveCell.tsx        |    71 -
 .../src/components/Table/TdCell.tsx                |    97 -
 .../src/components/Table/ThCell.tsx                |    70 -
 .../components/Table/common/CopyAndPasteUtils.ts   |   162 -
 .../src/components/Table/common/FocusUtils.ts      |   343 -
 .../components/Table/common/NavigationKeysUtils.ts |    70 -
 .../src/components/Table/common/TableUtils.ts      |   236 -
 .../src/components/Table/common/index.ts           |    20 -
 .../src/components/Table/index.ts                  |    22 -
 .../src/components/common/NavigationKeysUtils.ts   |    70 -
 .../src/components/common/index.ts                 |    17 -
 .../src/components/index.ts                        |    20 -
 .../src/context/BoxedExpressionGlobalContext.tsx   |    43 -
 .../src/context/index.ts                           |    17 -
 .../src/contextMenu/Hooks.ts                       |   134 +
 .../contextMenu/MenuWithHelp/MenuItemWithHelp.tsx  |    73 +
 .../src/contextMenu/MenuWithHelp/MenuWithHelp.css  |    36 +
 .../src/contextMenu/MenuWithHelp/index.ts          |    17 +
 .../src/contextMenu/PopoverMenu/PopoverMenu.css    |    44 +
 .../src/contextMenu/PopoverMenu/PopoverMenu.tsx    |   149 +
 .../PopoverMenu/index.ts                           |     0
 .../src/{hooks => contextMenu}/index.ts            |     0
 .../BoxedExpressionEditor.tsx                      |    82 +
 .../BoxedExpressionEditorContext.css               |    93 +
 .../BoxedExpressionEditorContext.tsx               |   131 +
 .../base-no-reset-wrapped.css                      |     0
 .../src/expressions/BoxedExpressionEditor/index.ts |    17 +
 .../ContextEntryExpressionCell.css                 |    15 +
 .../ContextEntryExpressionCell.tsx                 |    69 +
 .../ContextExpression/ContextEntryInfoCell.css     |    24 +
 .../ContextExpression/ContextEntryInfoCell.tsx     |   140 +
 .../ContextExpression/ContextExpression.css        |    35 +
 .../ContextExpression/ContextExpression.tsx        |   356 +
 .../ContextResultExpressionCell.tsx                |    38 +
 .../src/expressions/ContextExpression/index.ts     |    19 +
 .../DecisionTableExpression.css                    |    67 +
 .../DecisionTableExpression.tsx                    |   678 +
 .../DecisionTableExpression/HitPolicySelector.css  |    33 +
 .../DecisionTableExpression/HitPolicySelector.tsx  |   214 +
 .../DecisionTableExpression/index.ts               |     0
 .../DataTypeSelector.tsx                           |   146 +
 .../ExpressionDefinitionHeaderMenu.css}            |     0
 .../ExpressionDefinitionHeaderMenu.tsx             |   185 +
 .../InlineEditableTextInput.tsx                    |   101 +
 .../ExpressionDefinitionHeaderMenu/index.ts        |    19 +
 .../ExpressionContainer.tsx                        |    91 +
 .../ExpressionDefinitionLogicTypeSelector.css      |    74 +
 .../ExpressionDefinitionLogicTypeSelector.tsx      |   487 +
 .../ExpressionDefinitionLogicTypeSelector/index.ts |    17 +
 .../ExpressionDefinitionRoot.css                   |    34 +
 .../ExpressionDefinitionRoot.tsx                   |    53 +
 .../expressions/ExpressionDefinitionRoot/index.ts  |    17 +
 .../FunctionExpression/FeelFunctionExpression.tsx  |   211 +
 .../FunctionExpression/FunctionExpression.css      |    45 +
 .../FunctionExpression/FunctionExpression.tsx      |   150 +
 .../FunctionExpression/FunctionKindSelector.tsx    |   102 +
 .../FunctionExpression/JavaFunctionExpression.css  |    55 +
 .../FunctionExpression/JavaFunctionExpression.tsx  |   338 +
 .../FunctionExpression/ParametersPopover.css       |    72 +
 .../FunctionExpression/ParametersPopover.tsx       |   157 +
 .../FunctionExpression/PmmlFunctionExpression.css  |    49 +
 .../FunctionExpression/PmmlFunctionExpression.tsx  |   397 +
 .../src/expressions/FunctionExpression/index.ts    |    19 +
 .../ArgumentEntryExpressionCell.tsx                |    69 +
 .../InvocationExpression/InvocationExpression.css  |    26 +
 .../InvocationExpression/InvocationExpression.tsx  |   329 +
 .../InvocationExpression/index.ts                  |     0
 .../ListExpression/ListExpression.css              |     0
 .../expressions/ListExpression/ListExpression.tsx  |   208 +
 .../expressions/ListExpression/ListItemCell.tsx    |    38 +
 .../ListExpression/index.ts                        |     0
 .../LiteralExpression/LiteralExpression.css        |    69 +
 .../LiteralExpression/LiteralExpression.tsx        |   181 +
 .../src/expressions/LiteralExpression/index.ts     |    17 +
 .../RelationExpression/RelationExpression.css      |    15 +
 .../RelationExpression/RelationExpression.tsx      |   331 +
 .../RelationExpression/index.ts                    |     0
 .../src/{components => expressions}/index.css      |     0
 .../src/expressions/index.ts                       |    20 +
 .../boxed-expression-component/src/hooks/Hooks.ts  |    77 -
 .../src/i18n/BoxedExpressionEditorI18n.ts          |    28 +-
 .../src/i18n/locales/en.ts                         |    31 +-
 .../src/keysUtils/index.ts                         |    69 +
 .../resizing/BeeTableCellWidthToFitDataContext.tsx |   102 +
 .../resizing/BeeTableResizableColumnsContext.tsx   |   207 +
 .../src/resizing/FillingColumnResizingWidth.tsx    |   245 +
 .../src/resizing/Hooks.tsx                         |   406 +
 .../resizing/NestedExpressionContainerContext.tsx  |    35 +
 .../src/resizing/Resizer/Resizer.css               |    35 +
 .../src/resizing/Resizer/Resizer.tsx               |   209 +
 .../src/resizing/Resizer/index.ts                  |    17 +
 .../src/resizing/ResizingWidthsContext.tsx         |   109 +
 .../src/resizing/WidthConstants.ts                 |    48 +
 .../src/resizing/WidthMaths.ts                     |   220 +
 .../src/resizing/WidthsToFitData.ts                |    30 +
 .../src/selection/BeeTableSelectionContext.tsx     |  1075 ++
 .../src/table/BeeTable/BeeTable.css                |   347 +
 .../src/table/BeeTable/BeeTable.tsx                |   662 +
 .../src/table/BeeTable/BeeTableBody.tsx            |   184 +
 .../table/BeeTable/BeeTableContextMenuHandler.css  |    37 +
 .../table/BeeTable/BeeTableContextMenuHandler.tsx  |   338 +
 .../src/table/BeeTable/BeeTableDefaultCell.tsx     |    72 +
 .../table/BeeTable/BeeTableEditableCellContent.css |    64 +
 .../table/BeeTable/BeeTableEditableCellContent.tsx |   219 +
 .../src/table/BeeTable/BeeTableHeader.tsx          |   361 +
 .../src/table/BeeTable/BeeTableTd.tsx              |   250 +
 .../table/BeeTable/BeeTableTdForAdditionalRow.tsx  |    92 +
 .../src/table/BeeTable/BeeTableTh.tsx              |   195 +
 .../src/table/BeeTable/BeeTableThController.tsx    |    18 +
 .../src/table/BeeTable/BeeTableThResizable.tsx     |   272 +
 .../src/table/BeeTable/StandaloneBeeTable.tsx      |    66 +
 .../src/table/BeeTable/index.ts                    |    21 +
 .../tests/__mocks__/ReactWithSupervisor.ts         |    33 -
 .../tests/api/BoxedExpressionEditor.test.ts        |    58 -
 .../tests/api/EnumUtils.test.ts                    |    46 -
 .../BoxedExpressionEditor.test.tsx                 |    36 -
 .../BoxedExpressionEditor.test.tsx.snap            |    52 -
 .../ContextEntryExpression.test.tsx                |    67 -
 .../ContextEntryExpressionCell.test.tsx            |   104 -
 .../ContextExpression/ContextEntryInfo.test.tsx    |    79 -
 .../ContextEntryInfoCell.test.tsx                  |    93 -
 .../ContextExpression/ContextExpression.test.tsx   |   121 -
 .../DecisionTableExpression.test.tsx               |   207 -
 .../HitPolicySelector.test.tsx                     |   174 -
 .../EditExpressionMenu/EditExpressionMenu.test.tsx |   262 -
 .../EditExpressionMenu/EditTextInline.test.tsx     |   110 -
 .../__snapshots__/EditExpressionMenu.test.tsx.snap |    75 -
 .../ExpressionContainer.test.tsx                   |    80 -
 .../ExpressionContainer.test.tsx.snap              |    52 -
 .../FunctionExpression/FunctionExpression.test.tsx |   453 -
 .../FunctionKindSelector.test.tsx                  |    59 -
 .../InvocationExpression.test.tsx                  |   115 -
 .../ListExpression/ListExpression.test.tsx         |    71 -
 .../LiteralExpression/LiteralExpression.test.tsx   |   153 -
 .../LogicTypeSelector/LogicTypeSelector.test.tsx   |   141 -
 .../PMMLLiteralExpression.test.tsx                 |    98 -
 .../components/PopoverMenu/PopoverMenu.test.tsx    |    77 -
 .../__snapshots__/PopoverMenu.test.tsx.snap        |    75 -
 .../RelationExpression/RelationExpression.test.tsx |   106 -
 .../tests/components/Resizer/Resizer.test.tsx      |    82 -
 .../tests/components/Resizer/dom/Cell.test.tsx     |   249 -
 .../components/Resizer/dom/DOMSession.test.tsx     |    80 -
 .../Resizer/dom/ResizerSupervisorDOM.test.ts       |    63 -
 .../SelectionBox/CellSelectionBox.test.tsx         |   157 -
 .../components/SelectionBox/SelectionBox.test.tsx  |    95 -
 .../tests/components/Table/EditableCell.test.tsx   |   136 -
 .../tests/components/Table/Table.test.tsx          |   793 --
 .../components/Table/TableHandlerMenu.test.tsx     |    78 -
 .../Table/common/CopyAndPasteUtils.test.tsx        |   244 -
 .../components/Table/common/FocusUtils.test.tsx    |   627 -
 .../Table/common/NavigationKeysUtils.test.ts       |   197 -
 .../components/Table/common/TableUtils.test.tsx    |   416 -
 .../tests/components/test-utils.tsx                |   244 -
 .../tests/keysUtils/NavigationKeysUtils.test.ts    |   165 +
 .../ContainerFile.DashBuilderAuthoring             |     5 -
 .../ContainerFile.DashBuilderRuntime               |     5 -
 packages/dashbuilder-images/env/index.js           |    60 -
 packages/dashbuilder-images/package.json           |    34 -
 packages/dashbuilder/appformer/pom.xml             |     1 -
 .../org/uberfire/annotations/Customizable.java     |    35 -
 .../annotations/FallbackImplementation.java        |    35 -
 .../org/uberfire/backend/vfs/ObservablePath.java   |    61 -
 .../main/java/org/uberfire/backend/vfs/Path.java   |    27 -
 .../java/org/uberfire/backend/vfs/PathFactory.java |   217 -
 .../backend/vfs/impl/ForceUnlockEvent.java         |    38 -
 .../org/uberfire/backend/vfs/impl/LockInfo.java    |   123 -
 .../org/uberfire/backend/vfs/impl/LockResult.java  |    75 -
 .../backend/vfs/impl/ObservablePathImpl.java       |   406 -
 .../java/org/uberfire/lifecycle/GetContent.java    |    32 -
 .../java/org/uberfire/lifecycle/GetPreview.java    |    32 -
 .../main/java/org/uberfire/lifecycle/IsDirty.java  |    33 -
 .../java/org/uberfire/lifecycle/SetContent.java    |    32 -
 .../main/java/org/uberfire/mvp/PlaceRequest.java   |     8 -
 .../mvp/impl/ExternalPathPlaceRequest.java         |    48 -
 .../org/uberfire/mvp/impl/PathPlaceRequest.java    |   142 -
 .../java/org/uberfire/paging/AbstractPageRow.java  |    28 -
 .../org/uberfire/paging/AbstractPathPageRow.java   |    45 -
 .../main/java/org/uberfire/paging/PageRequest.java |    57 -
 .../java/org/uberfire/paging/PageResponse.java     |    86 -
 .../main/java/org/uberfire/rpc/SessionInfo.java    |    23 -
 .../org/uberfire/rpc/impl/SessionInfoImpl.java     |    76 -
 .../uberfire/rpc/impl/SessionInfoMarshalller.java  |    50 -
 .../main/java/org/uberfire/security/Resource.java  |    68 -
 .../java/org/uberfire/security/ResourceAction.java |    41 -
 .../java/org/uberfire/security/ResourceRef.java    |    76 -
 .../java/org/uberfire/security/ResourceType.java   |    36 -
 .../uberfire/security/authz/ResourceActionRef.java |    72 -
 .../security/authz/RuntimeContentResource.java     |    21 -
 .../security/authz/RuntimeFeatureResource.java     |    21 -
 .../uberfire/security/authz/RuntimeResource.java   |    25 -
 .../uberfire/security/authz/VotingStrategy.java    |    46 -
 .../workbench/annotations/VisibleAsset.java        |    26 -
 .../org/uberfire/workbench/category/Category.java  |    40 -
 .../org/uberfire/workbench/category/Others.java    |    31 -
 .../org/uberfire/workbench/category/Undefined.java |    31 -
 .../java/org/uberfire/workbench/diff/DiffMode.java |    22 -
 .../workbench/events/PluginAddedEvent.java         |    28 -
 .../org/uberfire/workbench/events/PluginEvent.java |    29 -
 .../workbench/events/PluginReloadedEvent.java      |    24 -
 .../workbench/events/PluginUpdatedEvent.java       |    28 -
 .../uberfire/workbench/events/ResourceAdded.java   |    48 -
 .../workbench/events/ResourceAddedEvent.java       |    62 -
 .../events/ResourceBatchChangesEvent.java          |    79 -
 .../uberfire/workbench/events/ResourceChange.java  |    24 -
 .../workbench/events/ResourceChangeType.java       |    31 -
 .../uberfire/workbench/events/ResourceCopied.java  |    52 -
 .../workbench/events/ResourceCopiedEvent.java      |    65 -
 .../uberfire/workbench/events/ResourceDeleted.java |    41 -
 .../workbench/events/ResourceDeletedEvent.java     |    62 -
 .../uberfire/workbench/events/ResourceEvent.java   |    24 -
 .../workbench/events/ResourceOpenedEvent.java      |    55 -
 .../uberfire/workbench/events/ResourceRenamed.java |    52 -
 .../workbench/events/ResourceRenamedEvent.java     |    60 -
 .../uberfire/workbench/events/ResourceUpdated.java |    41 -
 .../workbench/events/ResourceUpdatedEvent.java     |    58 -
 .../workbench/events/UberfireJSAPIReadyEvent.java  |    24 -
 .../workbench/model/ActivityResourceType.java      |    41 +-
 .../model/AppFormerActivitiesProducer.java         |    50 -
 .../model/DefaultAppFormerActivities.java          |    49 -
 .../org/uberfire/workbench/model/Notification.java |    99 -
 .../workbench/model/SplashScreenFilter.java        |    42 -
 .../workbench/model/bridge/Notification.java       |    52 -
 .../model/bridge/NotificationSeverity.java         |    29 -
 .../workbench/model/bridge/NotificationType.java   |    26 -
 .../model/impl/SplashScreenFilterImpl.java         |    74 -
 .../model/menu/EnabledStateChangeListener.java     |    31 -
 .../model/menu/HasEnabledStateChangeListeners.java |    32 -
 .../uberfire/workbench/model/menu/MenuCustom.java  |    30 -
 .../uberfire/workbench/model/menu/MenuFactory.java |   182 -
 .../uberfire/workbench/model/menu/MenuGroup.java   |    31 -
 .../uberfire/workbench/model/menu/MenuItem.java    |    75 -
 .../workbench/model/menu/MenuItemCommand.java      |    32 -
 .../workbench/model/menu/MenuItemPerspective.java  |    29 -
 .../workbench/model/menu/MenuItemPlain.java        |    28 -
 .../workbench/model/menu/MenuPosition.java         |    28 -
 .../uberfire/workbench/model/menu/MenuVisitor.java |    93 -
 .../org/uberfire/workbench/model/menu/Menus.java   |    48 -
 .../workbench/model/menu/impl/BaseMenuCustom.java  |   126 -
 .../workbench/model/menu/impl/BaseMenuVisitor.java |    68 -
 .../model/menu/impl/DefaultMenuGroup.java          |   148 -
 .../workbench/model/menu/impl/DefaultMenus.java    |    77 -
 .../workbench/model/menu/impl/MenuBuilderImpl.java |   616 -
 .../uberfire/workbench/model/toolbar/IconType.java |   269 -
 .../uberfire/workbench/model/toolbar/ToolBar.java  |    33 -
 .../workbench/model/toolbar/ToolBarIcon.java       |    27 -
 .../workbench/model/toolbar/ToolBarItem.java       |    55 -
 .../workbench/model/toolbar/ToolBarTypeIcon.java   |    22 -
 .../workbench/model/toolbar/ToolBarUrlIcon.java    |    26 -
 .../model/toolbar/impl/DefaultToolBar.java         |    65 -
 .../model/toolbar/impl/DefaultToolBarItem.java     |   105 -
 .../workbench/type/AnyResourceTypeDefinition.java  |    72 -
 .../workbench/type/DotResourceTypeDefinition.java  |    72 -
 .../org/uberfire/workbench/type/FileNameUtil.java  |    75 -
 .../workbench/type/ResourceTypeDefinition.java     |    88 -
 .../workbench/type/TextResourceTypeDefinition.java |    78 -
 .../org/uberfire/workspace/WorkspaceContext.java   |    37 -
 .../org/uberfire/backend/vfs/PathFactoryTest.java  |    46 -
 .../uberfire/mvp/impl/PathPlaceRequestTest.java    |    44 -
 .../org/uberfire/security/ResourceRefTest.java     |    54 -
 .../uberfire/workbench/category/CategoryTest.java  |    84 -
 .../workbench/model/menu/TestMenuSyntax.java       |    79 -
 .../workbench/model/menu/impl/TestBehavior.java    |   128 -
 .../uberfire/workbench/type/FileNameUtilTest.java  |    60 -
 .../appformer/uberfire-client-all/pom.xml          |     4 -
 .../org/uberfire/UberfireClientAll.gwt.xml         |     1 -
 .../client/annotations/DefaultPosition.java        |    33 -
 .../org/uberfire/client/annotations/Intercept.java |    29 -
 .../client/annotations/SplashBodyHeight.java       |    29 -
 .../uberfire/client/annotations/SplashFilter.java  |    34 -
 .../client/annotations/WorkbenchClientEditor.java  |    67 -
 .../client/annotations/WorkbenchContextId.java     |    29 -
 .../client/annotations/WorkbenchEditor.java        |   118 -
 .../uberfire/client/annotations/WorkbenchMenu.java |    34 -
 .../client/annotations/WorkbenchToolBar.java       |    34 -
 .../org/uberfire/client/callbacks/Callback.java    |    24 -
 .../org/uberfire/client/mvp/LockRequiredEvent.java |    24 -
 .../java/org/uberfire/client/mvp/LockTarget.java   |    91 -
 .../uberfire/client/mvp/RenameInProgressEvent.java |    35 -
 .../uberfire/client/mvp/SaveInProgressEvent.java   |    35 -
 .../client/mvp/UpdatedLockStatusEvent.java         |    49 -
 .../client/resources/UberfireResources.java        |    29 -
 .../client/resources/i18n/UberfireConstants.java   |    32 -
 .../resources/images/UberfireImageResources.java   |    28 -
 .../java/org/uberfire/client/util/Clipboard.java   |    40 -
 .../main/java/org/uberfire/client/util/Cookie.java |    53 -
 .../workbench/events/ChangeTitleWidgetEvent.java   |    56 -
 .../events/NewSplashScreenActiveEvent.java         |    26 -
 .../client/workbench/type/AnyResourceType.java     |    57 -
 .../client/workbench/type/ClientResourceType.java  |    38 -
 .../client/workbench/type/ClientTypeRegistry.java  |    32 -
 .../client/workbench/type/DotResourceType.java     |    53 -
 .../type/impl/ClientTypeRegistryImpl.java          |   101 -
 .../java/org/uberfire/client/util/CookieTest.java  |    83 -
 .../uberfire/commons/config/ConfigProperties.java  |   170 -
 .../java/org/uberfire/commons/data/Cacheable.java  |    32 -
 .../main/java/org/uberfire/commons/data/Pair.java  |    22 +-
 .../java/org/uberfire/commons/data/Triple.java     |    13 +-
 .../lifecycle/PriorityDisposableRegistry.java      |     4 +-
 .../commons/message/MessageHandlerResolver.java    |    25 -
 .../uberfire/commons/message/MessageService.java   |    48 -
 .../commons/regex/util/AntPathMatcher.java         |   444 -
 .../uberfire/commons/regex/util/GlobToRegEx.java   |   109 -
 .../commons/services/cdi/ApplicationStarted.java   |    21 -
 .../uberfire/commons/services/cdi/Startable.java   |    28 -
 .../org/uberfire/commons/services/cdi/Startup.java |    42 -
 .../uberfire/commons/services/cdi/StartupType.java |    46 -
 .../org/uberfire/commons/services/cdi/Veto.java    |    29 -
 .../main/java/org/uberfire/commons/uuid/UUID.java  |    88 -
 .../commons/regex/util/GlobToRegExTest.java        |    52 -
 .../java/org/uberfire/commons/uuid/UUIDTest.java   |    82 -
 .../appformer/uberfire-extensions/pom.xml          |     2 -
 .../uberfire-commons-editor/pom.xml                |    38 -
 .../uberfire-commons-editor-api/pom.xml            |    48 -
 .../ext/editor/commons/file/DefaultMetadata.java   |    25 -
 .../commons/readonly/ReadOnlyPathPlaceRequest.java |    71 -
 .../restriction/PathOperationRestriction.java      |    32 -
 .../commons/service/restrictor/CopyRestrictor.java |    24 -
 .../service/restrictor/DeleteRestrictor.java       |    24 -
 .../restrictor/PathOperationRestrictor.java        |    33 -
 .../service/restrictor/RenameRestrictor.java       |    24 -
 .../commons/service/support/SupportsCopy.java      |    48 -
 .../commons/service/support/SupportsCreate.java    |    26 -
 .../commons/service/support/SupportsDelete.java    |    24 -
 .../commons/service/support/SupportsRead.java      |    23 -
 .../commons/service/support/SupportsRename.java    |    25 -
 .../service/support/SupportsSaveAndRename.java     |    29 -
 .../commons/service/support/SupportsUpdate.java    |    26 -
 .../editor/commons/template/TemplateRenderer.java  |    26 -
 .../mustache/MustacheTemplateRenderer.java         |    33 -
 .../ext/editor/commons/version/CurrentBranch.java  |    22 -
 .../main/resources/META-INF/ErraiApp.properties    |    33 -
 .../src/main/resources/META-INF/beans.xml          |     5 -
 .../commons/UberfireCommonsEditorAPI.gwt.xml       |    30 -
 .../uberfire-commons-editor-backend/pom.xml        |    81 -
 .../commons/backend/service/helper/CopyHelper.java |    39 -
 .../backend/service/helper/DeleteHelper.java       |    37 -
 .../backend/service/helper/RenameHelper.java       |    39 -
 .../service/restriction/LockRestrictor.java        |    35 -
 .../validation/DefaultFileNameValidator.java       |    47 -
 .../backend/validation/FileNameValidator.java      |    50 -
 .../backend/validation/ValidationUtils.java        |    71 -
 .../src/main/resources/META-INF/beans.xml          |     0
 ...alidationUtils_ParameterizedArtifactIdTest.java |    91 -
 .../ValidationUtils_ParameterizedFilenameTest.java |    87 -
 .../ValidationUtils_ParameterizedJavaIdTest.java   |   105 -
 ...g.uberfire.java.nio.file.spi.FileSystemProvider |    18 -
 .../uberfire-commons-editor-client/pom.xml         |   282 -
 .../ext/editor/commons/client/BaseEditor.java      |   576 -
 .../commons/client/BaseEditorEntryPoint.java       |    31 -
 .../ext/editor/commons/client/BaseEditorView.java  |    37 -
 .../editor/commons/client/BaseEditorViewImpl.java  |    69 -
 .../ext/editor/commons/client/EditorTitle.java     |    41 -
 .../file/CommandWithFileNameAndCommitMessage.java  |    26 -
 .../commons/client/file/CopyPopUpViewProducer.java |    47 -
 .../editor/commons/client/file/Customizable.java   |    31 -
 .../client/file/FileNameAndCommitMessage.java      |    40 -
 .../editor/commons/client/file/RestoreUtil.java    |    33 -
 .../client/file/exports/AbstractFileExport.java    |    50 -
 .../commons/client/file/exports/FileExport.java    |    40 -
 .../client/file/exports/FileExportProducer.java    |    64 -
 .../client/file/exports/FileExportResources.java   |    36 -
 .../client/file/exports/ImageDataUriContent.java   |    62 -
 .../client/file/exports/ImageFileExport.java       |    64 -
 .../commons/client/file/exports/TextContent.java   |    34 -
 .../client/file/exports/TextFileExport.java        |    39 -
 .../file/exports/jso/FileExportScriptInjector.java |    95 -
 .../client/file/exports/jso/JsFileSaver.java       |    42 -
 .../commons/client/file/exports/jso/svg/C2S.java   |   269 -
 .../client/file/exports/jso/svg/C2SContext2D.java  |   300 -
 .../client/file/exports/jso/svg/C2SSettings.java   |    51 -
 .../client/file/exports/svg/Context2DFactory.java  |    31 -
 .../client/file/exports/svg/IContext2D.java        |   157 -
 .../client/file/exports/svg/SvgExportSettings.java |    45 -
 .../client/file/exports/svg/SvgFileExport.java     |    42 -
 .../client/file/popups/CommonModalBuilder.java     |   109 -
 .../client/file/popups/CopyPopUpPresenter.java     |   158 -
 .../commons/client/file/popups/CopyPopUpView.html  |    28 -
 .../commons/client/file/popups/CopyPopUpView.java  |   158 -
 .../client/file/popups/DeletePopUpPresenter.java   |   131 -
 .../client/file/popups/DeletePopUpView.html        |    27 -
 .../client/file/popups/DeletePopUpView.java        |   137 -
 .../client/file/popups/RenamePopUpPresenter.java   |   246 -
 .../client/file/popups/RenamePopUpView.html        |    37 -
 .../client/file/popups/RenamePopUpView.java        |   226 -
 .../client/file/popups/RenamePopUpView.less        |    21 -
 .../client/file/popups/RestorePopUpView.html       |    21 -
 .../client/file/popups/SavePopUpPresenter.java     |    94 -
 .../commons/client/file/popups/SavePopUpView.html  |    21 -
 .../commons/client/file/popups/SavePopUpView.java  |   110 -
 .../file/popups/elemental2/Elemental2Modal.java    |   104 -
 .../editor/commons/client/history/SaveButton.java  |   153 -
 .../commons/client/history/ViewAllLabel.java       |    57 -
 .../commons/client/history/ViewAllLabel.ui.xml     |    56 -
 .../client/htmleditor/HtmlEditorLibraryLoader.java |    47 -
 .../client/htmleditor/HtmlEditorPresenter.java     |    66 -
 .../commons/client/htmleditor/HtmlEditorView.css   |   311 -
 .../commons/client/htmleditor/HtmlEditorView.html  |   624 -
 .../commons/client/htmleditor/HtmlEditorView.java  |   410 -
 .../client/htmleditor/HtmlResourceType.java        |    85 -
 .../commons/client/menu/BasicFileMenuBuilder.java  |    99 -
 .../client/menu/BasicFileMenuBuilderImpl.java      |   447 -
 .../client/menu/DownloadMenuItemBuilder.java       |    82 -
 .../client/menu/HasLockSyncMenuStateHelper.java    |    78 -
 .../ext/editor/commons/client/menu/MenuItems.java  |    29 -
 .../client/menu/common/CurrentBranchProducer.java  |    41 -
 .../client/menu/common/DefaultCurrentBranch.java   |    35 -
 .../menu/common/SaveAndRenameCommandBuilder.java   |   252 -
 .../commons/client/resources/CommonImages.java     |    31 -
 .../client/resources/i18n/CommonConstants.java     |   127 -
 .../commons/client/resources/i18n/Constants.java   |   262 -
 .../mustache/ClientMustacheTemplateRenderer.java   |    67 -
 .../commons/client/template/mustache/Mustache.java |    32 -
 .../client/template/mustache/MustacheSource.java   |    29 -
 .../validation/DefaultFileNameValidator.java       |    33 -
 .../client/validation/ValidationErrorReason.java   |    24 -
 .../commons/client/validation/Validator.java       |    25 -
 .../client/validation/ValidatorCallback.java       |    27 -
 .../validation/ValidatorWithReasonCallback.java    |    25 -
 .../main/resources/META-INF/ErraiApp.properties    |    33 -
 .../src/main/resources/META-INF/beans.xml          |     7 -
 .../commons/UberfireCommonsEditorClient.gwt.xml    |    29 -
 .../resources/i18n/CommonConstants.properties      |   135 -
 .../resources/i18n/CommonConstants_de.properties   |   212 -
 .../resources/i18n/CommonConstants_es.properties   |   136 -
 .../resources/i18n/CommonConstants_fr.properties   |   136 -
 .../resources/i18n/CommonConstants_ja.properties   |   136 -
 .../i18n/CommonConstants_pt_BR.properties          |   113 -
 .../i18n/CommonConstants_zh_CN.properties          |   212 -
 .../client/resources/i18n/Constants.properties     |   112 -
 .../client/resources/i18n/Constants_es.properties  |   113 -
 .../client/resources/i18n/Constants_fr.properties  |   113 -
 .../client/resources/i18n/Constants_ja.properties  |   113 -
 .../commons/client/resources/images/edit.gif       |   Bin 210 -> 0 bytes
 .../ext/editor/commons/client/BaseEditorTest.java  |   465 -
 .../commons/client/BaseEditorValidationTest.java   |    85 -
 .../ext/editor/commons/client/KieEditorTest.java   |   166 -
 .../file/exports/AbstractFileExportTest.java       |    32 -
 .../file/exports/FileExportProducerTest.java       |    61 -
 .../file/exports/ImageDataUriContentTest.java      |    71 -
 .../client/file/exports/ImageFileExportTest.java   |    56 -
 .../client/file/exports/TextContentTest.java       |    32 -
 .../client/file/exports/TextFileExportTest.java    |    48 -
 .../exports/jso/FileExportScriptInjectorTest.java  |    50 -
 .../file/exports/jso/svg/C2SContext2DTest.java     |   468 -
 .../file/exports/svg/Context2DFactoryTest.java     |    46 -
 .../client/file/exports/svg/SvgFileExportTest.java |    53 -
 .../client/file/popups/CommonModalBuilderTest.java |    94 -
 .../client/file/popups/CopyPopUpPresenterTest.java |   127 -
 .../file/popups/DeletePopUpPresenterTest.java      |   126 -
 .../file/popups/RenamePopUpPresenterTest.java      |   247 -
 .../client/file/popups/SavePopUpPresenterTest.java |   120 -
 .../htmleditor/HtmlEditorLibraryLoaderTest.java    |    45 -
 .../client/htmleditor/HtmlEditorPresenterTest.java |    68 -
 .../client/htmleditor/HtmlEditorViewTest.java      |    77 -
 .../client/menu/BasicFileMenuBuilderTest.java      |   359 -
 .../client/menu/DownloadMenuItemBuilderTest.java   |   112 -
 .../menu/common/CurrentBranchProducerTest.java     |    48 -
 .../menu/common/DefaultCurrentBranchTest.java      |    41 -
 .../ClientMustacheTemplateRendererTest.java        |    72 -
 .../uberfire-layout-editor/pom.xml                 |     1 -
 .../uberfire-layout-editor-api/pom.xml             |     8 -
 .../ext/layout/editor/api/LayoutServices.java      |    28 -
 .../ext/layout/editor/api/PerspectiveServices.java |    48 -
 .../ext/layout/editor/api/css/CssColour.java       |    26 -
 .../ext/layout/editor/api/css/CssProperty.java     |    14 +-
 .../ext/layout/editor/api/css/CssRule.java         |    91 -
 .../ext/layout/editor/api/css/CssRuleList.java     |    51 -
 .../layout/editor/api/editor/LayoutInstance.java   |     4 +-
 .../layout/editor/UberfireLayoutEditorAPI.gwt.xml  |     3 +-
 .../uberfire-layout-editor-backend/pom.xml         |    75 -
 .../ext/layout/editor/impl/LayoutServicesImpl.java |    53 -
 .../editor/impl/PerspectiveServicesImpl.java       |   179 -
 .../impl/old/perspective/editor/ColumnEditor.java  |   107 -
 .../impl/old/perspective/editor/HTMLEditor.java    |    62 -
 .../old/perspective/editor/PerspectiveEditor.java  |    98 -
 .../impl/old/perspective/editor/RowEditor.java     |    76 -
 .../impl/old/perspective/editor/ScreenEditor.java  |   138 -
 .../src/main/resources/META-INF/beans.xml          |     0
 .../layout/editor/impl/LayoutServicesImplTest.java |    82 -
 .../editor/impl/PerspectiveServicesImplTest.java   |   183 -
 .../ext/layout/editor/impl/12withHTMLComponent.txt |    29 -
 .../uberfire/ext/layout/editor/impl/BigLayout.txt  |    95 -
 .../impl/DeprecatedComplexPerspectiveEditor.txt    |    61 -
 .../impl/DeprecatedEmptyPerspectiveEditor.txt      |    19 -
 .../DeprecatedMoreColumnsPerspectiveEditor.txt     |    66 -
 .../editor/impl/LayoutWithComponentWithParts.txt   |    36 -
 .../ext/layout/editor/impl/SubColumnsLayout.txt    |    95 -
 .../uberfire-layout-editor-client/pom.xml          |    17 -
 .../client/LayoutComponentPaletteScreen.java       |    53 -
 .../editor/client/LayoutEditorEntryPoint.java      |     2 +-
 .../editor/client/LayoutEditorPluginImpl.java      |   173 -
 .../editor/client/LayoutEditorPresenter.java       |   170 -
 .../client/LayoutEditorPropertiesScreen.java       |    54 -
 .../ext/layout/editor/client/LayoutEditorView.css  |   138 -
 .../ext/layout/editor/client/LayoutEditorView.html |    18 -
 .../ext/layout/editor/client/LayoutEditorView.java |   132 -
 .../editor/client/api/ComponentDropEvent.java      |    43 -
 .../editor/client/api/ComponentDropType.java       |    22 -
 .../editor/client/api/ComponentRemovedEvent.java   |    44 -
 .../ext/layout/editor/client/api/EditorWidget.java |    36 -
 .../layout/editor/client/api/HasConfiguration.java |    24 -
 .../editor/client/api/HasDragAndDropSettings.java  |    34 -
 .../editor/client/api/HasModalConfiguration.java   |    31 -
 .../editor/client/api/InternalDragComponent.java   |    39 -
 .../editor/client/api/LayoutDragComponent.java     |    66 -
 .../client/api/LayoutDragComponentGroup.java       |    64 -
 .../client/api/LayoutDragComponentPalette.java     |    43 -
 .../ext/layout/editor/client/api/LayoutEditor.java |    56 -
 .../editor/client/api/LayoutEditorElement.java     |     2 +-
 .../editor/client/api/LayoutEditorPlugin.java      |    29 -
 .../client/api/LayoutElementWithProperties.java    |     5 -
 .../client/api/ModalConfigurationContext.java      |    39 -
 .../client/api/PanelConfigurationContext.java      |    39 -
 .../editor/client/components/columns/Column.java   |    54 -
 .../components/columns/ColumnWithComponents.java   |   364 -
 .../columns/ColumnWithComponentsView.css           |    48 -
 .../columns/ColumnWithComponentsView.html          |     9 -
 .../columns/ColumnWithComponentsView.java          |   281 -
 .../client/components/columns/ComponentColumn.java |   503 -
 .../components/columns/ComponentColumnPart.java    |    90 -
 .../components/columns/ComponentColumnView.css     |   123 -
 .../components/columns/ComponentColumnView.html    |    15 -
 .../components/columns/ComponentColumnView.java    |   614 -
 .../client/components/container/Container.java     |   740 --
 .../client/components/container/ContainerView.css  |    97 -
 .../client/components/container/ContainerView.html |     5 -
 .../client/components/container/ContainerView.java |   150 -
 .../client/components/rows/EmptyDropRow.java       |    92 -
 .../client/components/rows/EmptyDropRowView.css    |     6 -
 .../client/components/rows/EmptyDropRowView.html   |     7 -
 .../client/components/rows/EmptyDropRowView.java   |   110 -
 .../layout/editor/client/components/rows/Row.java  |  1154 --
 .../editor/client/components/rows/RowDnDEvent.java |    44 -
 .../editor/client/components/rows/RowDrop.java     |    77 -
 .../editor/client/components/rows/RowView.css      |    75 -
 .../editor/client/components/rows/RowView.html     |    13 -
 .../editor/client/components/rows/RowView.java     |   323 -
 .../event/LayoutEditorElementSelectEvent.java      |    32 -
 .../event/LayoutEditorElementUnselectEvent.java    |    32 -
 .../LayoutElementClearAllPropertiesEvent.java      |    32 -
 .../event/LayoutElementPropertyChangedEvent.java   |    50 -
 .../client/generator/AbstractLayoutGenerator.java  |   115 +-
 .../generator/BootstrapLayoutGeneratorDriver.java  |    34 +-
 .../client/generator/LayoutGeneratorDriver.java    |     2 +-
 .../ext/layout/editor/client/infra/BeanHelper.java |    26 -
 .../ext/layout/editor/client/infra/ColumnDrop.java |    89 -
 .../editor/client/infra/ColumnDropContext.java     |    35 -
 .../editor/client/infra/ColumnResizeEvent.java     |    62 -
 .../editor/client/infra/ColumnSizeBuilder.java     |     4 +
 .../editor/client/infra/ContainerResizeEvent.java  |    67 -
 .../ext/layout/editor/client/infra/DnDManager.java |   103 -
 .../editor/client/infra/DndDataJSONConverter.java  |   105 -
 .../editor/client/infra/DragComponentEndEvent.java |    21 -
 .../client/infra/DragHelperComponentColumn.java    |   139 -
 .../layout/editor/client/infra/HTML5DnDHelper.java |    31 -
 .../client/infra/LayoutDragComponentHelper.java    |    34 +-
 .../editor/client/infra/LayoutEditorCssHelper.java |   263 +-
 .../client/infra/LayoutEditorFocusController.java  |    88 -
 .../editor/client/infra/LayoutTemplateAdapter.java |    93 -
 .../layout/editor/client/infra/NameValidator.java  |    63 -
 .../layout/editor/client/infra/RowResizeEvent.java |    60 -
 .../layout/editor/client/infra/RowSizeBuilder.java |    24 -
 .../editor/client/infra/UniqueIDGenerator.java     |    48 -
 .../editor/client/resources/WebAppResource.java    |     2 +-
 .../client/resources/i18n/CommonConstants.java     |    75 -
 .../resources/i18n/CssAllowedValueConstants.java   |    71 -
 .../client/resources/i18n/PropertiesConstants.java |    90 -
 .../LayoutEditorPropertyLengthValidator.java       |    58 -
 .../LayoutEditorPropertyNumberValidator.java       |    40 -
 .../layout/editor/client/widgets/KebabWidget.html  |    32 -
 .../layout/editor/client/widgets/KebabWidget.java  |    69 -
 .../LayoutComponentPaletteGroupProvider.java       |    39 -
 .../widgets/LayoutComponentPalettePresenter.java   |   132 -
 .../client/widgets/LayoutComponentPaletteView.css  |     3 -
 .../client/widgets/LayoutComponentPaletteView.html |    18 -
 .../client/widgets/LayoutComponentPaletteView.java |    54 -
 .../widgets/LayoutDragComponentGroupPresenter.java |    93 -
 .../widgets/LayoutDragComponentGroupView.css       |     3 -
 .../widgets/LayoutDragComponentGroupView.html      |    26 -
 .../widgets/LayoutDragComponentGroupView.java      |   126 -
 .../client/widgets/LayoutDragComponentWidget.html  |    21 -
 .../client/widgets/LayoutDragComponentWidget.java  |    77 -
 .../widgets/LayoutEditorPropertiesPresenter.java   |   358 -
 .../client/widgets/LayoutEditorPropertiesView.css  |    10 -
 .../client/widgets/LayoutEditorPropertiesView.html |    15 -
 .../client/widgets/LayoutEditorPropertiesView.java |   194 -
 .../widgets/LayoutElementPropertiesPresenter.java  |   144 -
 .../widgets/LayoutElementPropertiesView.java       |    79 -
 .../editor/UberfireLayoutEditorClient.gwt.xml      |     5 -
 .../resources/i18n/CommonConstants.properties      |    43 -
 .../resources/i18n/CommonConstants_de.properties   |    17 -
 .../resources/i18n/CommonConstants_es.properties   |    44 -
 .../resources/i18n/CommonConstants_fr.properties   |    44 -
 .../resources/i18n/CommonConstants_ja.properties   |    44 -
 .../i18n/CommonConstants_pt_BR.properties          |    17 -
 .../i18n/CommonConstants_zh_CN.properties          |    17 -
 .../i18n/CssAllowedValueConstants.properties       |    23 -
 .../i18n/CssAllowedValueConstants_es.properties    |    20 -
 .../i18n/CssAllowedValueConstants_fr.properties    |    20 -
 .../i18n/CssAllowedValueConstants_ja.properties    |    20 -
 .../resources/i18n/PropertiesConstants.properties  |    31 -
 .../i18n/PropertiesConstants_de.properties         |     2 -
 .../i18n/PropertiesConstants_es.properties         |    32 -
 .../i18n/PropertiesConstants_fr.properties         |    32 -
 .../i18n/PropertiesConstants_ja.properties         |    32 -
 .../i18n/PropertiesConstants_pt_BR.properties      |     2 -
 .../i18n/PropertiesConstants_zh_CN.properties      |     2 -
 .../editor/client/AbstractLayoutEditorTest.java    |   278 -
 .../LayoutComponentPalettePresenterTest.java       |   200 -
 .../editor/client/LayoutEditorPluginImplTest.java  |    66 -
 .../editor/client/LayoutEditorPresenterTest.java   |   107 -
 .../LayoutEditorPropertiesPresenterTest.java       |   360 -
 .../LayoutElementPropertiesPresenterTest.java      |   125 -
 .../editor/client/components/FullLayoutTest.java   |   166 -
 .../columns/ColumnWithComponentsTest.java          |    68 -
 .../components/columns/ComponentColumnTest.java    |   148 -
 .../columns/ComponentColumnViewTest.java           |    79 -
 .../client/components/container/ContainerTest.java |   341 -
 .../editor/client/components/rows/RowTest.java     |   421 -
 .../client/generator/LayoutGeneratorTest.java      |   124 -
 .../infra/LayoutDragComponentHelperTest.java       |    10 -
 .../client/infra/LayoutEditorCssHelperTest.java    |     8 +-
 .../infra/LayoutEditorFocusControllerTest.java     |    82 -
 .../editor/client/infra/UniqueIDGeneratorTest.java |    54 -
 .../TestLayoutComponentPaletteGroupProvider.java   |    44 -
 .../client/test/TestLayoutDragComponent.java       |    68 -
 .../Group1LayoutComponentPaletteGroupProvider.java |    41 -
 .../test/group1/Group1LayoutDragComponent1.java    |    12 -
 .../test/group1/Group1LayoutDragComponent2.java    |    28 -
 .../test/group1/Group1LayoutDragComponent3.java    |    28 -
 .../Group2LayoutComponentPaletteGroupProvider.java |    41 -
 .../test/group2/Group2LayoutDragComponent1.java    |    28 -
 .../test/group2/Group2LayoutDragComponent2.java    |    28 -
 .../Group3LayoutComponentPaletteGroupProvider.java |    41 -
 .../test/group3/Group3LayoutDragComponent1.java    |    28 -
 .../uberfire-runtime-plugins/pom.xml               |     2 -
 .../uberfire-runtime-plugins-api/pom.xml           |    65 -
 .../uberfire/ext/plugin/event/BasePluginEvent.java |    41 -
 .../ext/plugin/event/NewPluginRegistered.java      |    43 -
 .../org/uberfire/ext/plugin/event/PluginAdded.java |    32 -
 .../uberfire/ext/plugin/event/PluginDeleted.java   |    41 -
 .../uberfire/ext/plugin/event/PluginRenamed.java   |    48 -
 .../org/uberfire/ext/plugin/event/PluginSaved.java |    32 -
 .../ext/plugin/event/PluginUnregistered.java       |    43 -
 .../ext/plugin/exception/PluginAlreadyExists.java  |    26 -
 .../org/uberfire/ext/plugin/model/Activity.java    |    60 -
 .../org/uberfire/ext/plugin/model/Language.java    |    25 -
 .../ext/plugin/model/LayoutEditorModel.java        |    84 -
 .../java/org/uberfire/ext/plugin/model/Plugin.java |    72 -
 .../org/uberfire/ext/plugin/model/PluginType.java  |    28 -
 .../uberfire/ext/plugin/model/RuntimePlugin.java   |    71 -
 .../ext/plugin/service/PluginServices.java         |    29 -
 .../type/BasePluginResourceTypeDefinition.java     |    43 -
 .../type/EditorPluginResourceTypeDefinition.java   |    54 -
 ...spectiveLayoutPluginResourceTypeDefinition.java |    54 -
 .../ext/plugin/type/TagsConverterUtil.java         |    49 -
 .../ext/plugin/type/TypeConverterUtil.java         |    49 -
 .../main/resources/META-INF/ErraiApp.properties    |    33 -
 .../uberfire/ext/plugin/RuntimePluginAPI.gwt.xml   |    30 -
 .../uberfire-runtime-plugins-backend/pom.xml       |    59 -
 .../ext/plugin/backend/PluginServicesImpl.java     |    67 -
 .../src/main/resources/META-INF/beans.xml          |     0
 .../main/resources/frameworks/angular.dependency   |   307 -
 .../main/resources/frameworks/knockout.dependency  |   123 -
 .../src/main/resources/nofound.png                 |   Bin 11090 -> 0 bytes
 .../src/main/resources/placeholder.png             |   Bin 8722 -> 0 bytes
 .../ext/plugin/backend/PluginServicesImplTest.java |    79 -
 ...g.uberfire.java.nio.file.spi.FileSystemProvider |    18 -
 .../uberfire/ext/plugin/backend/angular_css.txt    |     0
 .../uberfire/ext/plugin/backend/angular_main.txt   |    36 -
 .../ext/plugin/backend/angular_template.txt        |    18 -
 .../ext/plugin/backend/angular_todo_registry.txt   |    36 -
 .../ext/plugin/backend/empty_screen_registry.txt   |     1 -
 .../screen_with_title_and_name_registry.txt        |     1 -
 .../plugin/backend/screen_with_title_registry.txt  |     1 -
 .../uberfire/ext/plugin/backend/splash_main.txt    |     1 -
 .../ext/plugin/backend/splash_screen_registry.txt  |     1 -
 .../ext/plugin/backend/splash_template.txt         |     1 -
 .../uberfire-runtime-plugins-client/pom.xml        |    37 -
 .../editor/PerspectiveEditorPresenter.java         |   338 -
 .../perspective/editor/PerspectiveEditorView.java  |    64 -
 .../editor/PerspectiveEditorView.ui.xml            |    34 -
 .../PerspectiveEditorComponentGroupProvider.java   |    54 -
 .../editor/api/PerspectiveEditorCoreComponent.java |    26 -
 .../api/PerspectiveEditorCoreGroupProvider.java    |    63 -
 .../editor/api/PerspectiveEditorNavComponent.java  |    26 -
 .../api/PerspectiveEditorNavGroupProvider.java     |    58 -
 .../editor/components/popup/AddTag.java            |   156 -
 .../editor/components/popup/AddTag.ui.xml          |    54 -
 .../editor/events/PerspectiveEditorFocusEvent.java |    31 -
 .../generator/PerspectiveEditorActivity.java       |    18 +-
 .../generator/PerspectiveEditorGenerator.java      |   206 -
 .../generator/PerspectiveEditorScreenActivity.java |    26 +-
 .../layout/editor/HTMLLayoutDragComponent.java     |    66 +-
 .../layout/editor/PerspectiveEditorSettings.java   |    39 -
 .../layout/editor/ScreenLayoutDragComponent.java   |   174 -
 .../layout/editor/TargetDivDragComponent.java      |    51 +-
 .../editor/layout/editor/TargetDivList.java        |    67 -
 .../layout/editor/popups/EditHTMLPresenter.java    |   106 -
 .../editor/layout/editor/popups/EditHTMLView.html  |    22 -
 .../editor/layout/editor/popups/EditHTMLView.java  |   121 -
 .../editor/layout/editor/popups/EditScreen.java    |   286 -
 .../editor/layout/editor/popups/EditScreen.ui.xml  |    72 -
 .../editor/layout/editor/popups/EditTargetDiv.java |   163 -
 .../layout/editor/popups/EditTargetDiv.ui.xml      |    36 -
 .../type/PerspectiveLayoutPluginResourceType.java  |    46 -
 .../plugin/client/validation/NameValidator.java    |    70 -
 .../client/validation/PluginNameValidator.java     |   100 -
 .../plugin/client/validation/RuleValidator.java    |    42 -
 .../ext/plugin/RuntimePluginClient.gwt.xml         |     4 -
 .../editor/PerspectiveEditorPresenterTest.java     |   231 -
 .../generator/PerspectiveEditorGeneratorTest.java  |    80 -
 .../editor/ScreenLayoutDragComponentTest.java      |   169 -
 .../editor/layout/editor/TargetDivListTest.java    |    61 -
 .../editor/popups/EditHTMLPresenterTest.java       |   121 -
 .../layout/editor/popups/EditScreenTest.java       |   171 -
 .../client/validation/NameValidatorTest.java       |    64 -
 .../client/validation/PluginNameValidatorTest.java |   118 -
 .../client/validation/RuleValidatorTest.java       |    95 -
 .../uberfire-simple-docks/pom.xml                  |    36 -
 .../uberfire-simple-docks-client/pom.xml           |    84 -
 .../java/org/uberfire/client/DocksEntryPoint.java  |    31 -
 .../uberfire/client/docks/UberfireDocksImpl.java   |   254 -
 .../uberfire/client/docks/view/DockResizeBar.java  |   200 -
 .../org/uberfire/client/docks/view/DocksBar.java   |   134 -
 .../org/uberfire/client/docks/view/DocksBars.java  |   430 -
 .../client/docks/view/bars/DocksCollapsedBar.java  |   183 -
 .../docks/view/bars/DocksCollapsedBar.ui.xml       |    23 -
 .../client/docks/view/bars/DocksExpandedBar.java   |   222 -
 .../client/docks/view/bars/DocksExpandedBar.ui.xml |    31 -
 .../client/docks/view/items/AbstractDockItem.java  |   162 -
 .../docks/view/items/AbstractSideDockItem.java     |    24 -
 .../client/docks/view/items/SideDockItem.java      |   130 -
 .../client/docks/view/items/SideDockItem.ui.xml    |    30 -
 .../docks/view/items/SingleSideDockItem.java       |    79 -
 .../docks/view/items/SingleSideDockItem.ui.xml     |    24 -
 .../client/docks/view/items/SouthDockItem.java     |   109 -
 .../client/docks/view/items/SouthDockItem.ui.xml   |    23 -
 .../client/docks/view/menu/MenuBuilder.java        |   124 -
 .../org/uberfire/client/resources/DocksCss.java    |    79 -
 .../uberfire/client/resources/WebAppResource.java  |    30 -
 .../client/resources/i18n/DockConstants.java       |    29 -
 .../main/resources/META-INF/ErraiApp.properties    |    33 -
 .../src/main/resources/META-INF/beans.xml          |     7 -
 .../org/uberfire/UberfireDocksClient.gwt.xml       |    27 -
 .../org/uberfire/client/resources/css/docks.css    |   121 -
 .../resources/i18n/CommonConstants.properties      |    17 -
 .../resources/i18n/CommonConstants_de.properties   |     1 -
 .../resources/i18n/CommonConstants_es.properties   |    18 -
 .../resources/i18n/CommonConstants_fr.properties   |    18 -
 .../resources/i18n/CommonConstants_ja.properties   |    18 -
 .../i18n/CommonConstants_pt_BR.properties          |     1 -
 .../i18n/CommonConstants_zh_CN.properties          |     1 -
 .../client/docks/UberfireDocksImplTest.java        |   299 -
 .../client/docks/view/DockResizeBarTest.java       |    75 -
 .../uberfire/client/docks/view/DocksBarsTest.java  |   412 -
 .../client/docks/view/DocksBars_OpenDockTest.java  |    98 -
 .../docks/view/bars/DocksCollapsedBarTest.java     |    72 -
 .../docks/view/bars/DocksExpandedBarTest.java      |   123 -
 .../docks/view/items/AbstractDockItemOuiaTest.java |    86 -
 .../client/docks/view/items/SideDockItemTest.java  |   177 -
 .../client/docks/view/items/SouthDockItemTest.java |   136 -
 .../uberfire-extensions/uberfire-widgets/pom.xml   |     2 -
 .../uberfire-widgets-commons/pom.xml               |     5 -
 .../common/client/accordion/TriggerWidget.java     |   144 -
 .../client/breadcrumbs/UberfireBreadcrumbs.java    |   307 -
 .../client/breadcrumbs/UberfireBreadcrumbsView.css |    29 -
 .../breadcrumbs/UberfireBreadcrumbsView.html       |    23 -
 .../breadcrumbs/UberfireBreadcrumbsView.java       |    69 -
 .../header/UberfireBreadcrumbsContainer.java       |    27 -
 .../header/UberfireBreadcrumbsContainerImpl.css    |     3 -
 .../header/UberfireBreadcrumbsContainerImpl.html   |     1 -
 .../header/UberfireBreadcrumbsContainerImpl.java   |    71 -
 .../breadcrumbs/widget/BreadcrumbPresenter.java    |    28 -
 .../widget/DefaultBreadcrumbsPresenter.java        |    89 -
 .../breadcrumbs/widget/DefaultBreadcrumbsView.css  |    48 -
 .../breadcrumbs/widget/DefaultBreadcrumbsView.html |    19 -
 .../breadcrumbs/widget/DefaultBreadcrumbsView.java |    71 -
 .../client/colorpicker/ColorChangedEvent.java      |    50 -
 .../client/colorpicker/ColorChangedHandler.java    |    23 -
 .../client/colorpicker/ColorPickerDialog.java      |    71 -
 .../common/client/colorpicker/ColorUtils.java      |   150 -
 .../common/client/colorpicker/HueChangedEvent.java |    50 -
 .../client/colorpicker/HueChangedHandler.java      |    23 -
 .../common/client/colorpicker/HuePicker.java       |   146 -
 .../colorpicker/SaturationLightnessPicker.java     |   204 -
 .../common/client/colorpicker/canvas/Canvas.java   |    79 -
 .../common/client/colorpicker/canvas/Gradient.java |    29 -
 .../client/colorpicker/canvas/ImageData.java       |    37 -
 .../colorpicker/canvas/RenderingContext.java       |    84 -
 .../common/client/colorpicker/dialog/Dialog.java   |   101 -
 .../colorpicker/dialog/DialogClosedEvent.java      |    50 -
 .../colorpicker/dialog/DialogClosedHandler.java    |    23 -
 .../widgets/common/client/common/AddButton.java    |    52 -
 .../common/client/common/BooleanTextBox.java       |    40 -
 .../client/common/ConcurrentChangePopup.java       |    81 -
 .../common/client/common/DirtyableContainer.java   |    22 -
 .../common/client/common/DirtyableFlexTable.java   |    47 -
 .../client/common/DirtyableHorizontalPane.java     |    37 -
 .../client/common/DirtyableVerticalPane.java       |    44 -
 .../common/client/common/FileInputButton.java      |   145 -
 .../common/client/common/FileInputGroupButton.java |    33 -
 .../widgets/common/client/common/FileUpload.java   |   141 -
 .../widgets/common/client/common/FileUpload.ui.xml |    31 -
 .../client/common/FileUploadFormEncoder.java       |    39 -
 .../common/client/common/FormStyleItem.java        |    86 -
 .../common/client/common/FormStyleLayout.java      |   102 -
 .../widgets/common/client/common/ImageButton.java  |   115 -
 .../ext/widgets/common/client/common/InfoCube.java |    64 -
 .../widgets/common/client/common/InfoCube.ui.xml   |    38 -
 .../widgets/common/client/common/InfoPopup.java    |    60 -
 .../common/client/common/LazyStackPanel.java       |   218 -
 .../client/common/LazyStackPanelHeader.ui.xml      |    52 -
 .../common/client/common/LazyStackPanelRow.java    |   133 -
 .../ext/widgets/common/client/common/Page.java     |    95 -
 .../common/client/common/PrettyFormLayout.java     |   152 -
 .../common/client/common/ResizableTextArea.java    |    33 -
 .../widgets/common/client/common/SmallLabel.java   |    53 -
 .../common/client/common/StackItemHeader.java      |    36 -
 .../common/client/common/StackItemHeaderView.java  |    27 -
 .../client/common/StackItemHeaderViewImpl.java     |    53 -
 .../client/common/StackItemHeaderViewImpl.ui.xml   |    39 -
 .../widgets/common/client/common/StyleHelper.java  |    67 -
 .../ext/widgets/common/client/common/Util.java     |    90 -
 .../common/client/common/popups/ButtonPressed.java |    23 -
 .../client/common/popups/FormStylePopup.java       |   105 -
 .../common/client/menu/MenuItemDivider.java        |    41 -
 .../common/client/menu/MenuItemDividerView.html    |     1 -
 .../common/client/menu/MenuItemDividerView.java    |    24 -
 .../common/client/menu/MenuItemFactory.java        |   232 -
 .../widgets/common/client/menu/MenuItemHeader.java |    41 -
 .../common/client/menu/MenuItemHeaderView.html     |     3 -
 .../common/client/menu/MenuItemHeaderView.java     |    35 -
 .../widgets/common/client/menu/MenuItemView.java   |    26 -
 .../common/client/menu/MenuItemWithIcon.java       |    41 -
 .../common/client/menu/MenuItemWithIconView.html   |     6 -
 .../common/client/menu/MenuItemWithIconView.java   |    85 -
 .../common/client/menu/RefreshMenuBuilder.java     |    81 -
 .../client/menu/RefreshSelectorMenuBuilder.java    |   197 -
 .../widgets/common/client/tables/ColumnPicker.java |   184 -
 .../common/client/tables/FilterPagedTable.java     |   315 -
 .../common/client/tables/FilterPagedTable.ui.xml   |    27 -
 .../widgets/common/client/tables/PagedTable.java   |    41 +-
 .../widgets/common/client/tables/SimpleTable.java  |    86 +-
 .../client/tables/popup/DataGridFilterSummary.java |    42 -
 .../common/client/tables/popup/NewFilterPopup.java |   466 -
 .../client/tables/popup/NewFilterPopup.ui.xml      |    52 -
 .../client/tables/popup/NewTabFilterPopup.java     |   300 -
 .../client/tables/popup/NewTabFilterPopup.ui.xml   |    53 -
 .../widgets/common/UberfireWidgetsCommons.gwt.xml  |     1 -
 .../breadcrumbs/UberfireBreadcrumbsTest.java       |   319 -
 .../widget/DefaultBreadcrumbsPresenterTest.java    |    59 -
 .../common/client/common/BooleanTextBoxTest.java   |    50 -
 .../common/client/common/FileUploadTest.java       |    62 -
 .../common/client/common/FormStyleItemTest.java    |    97 -
 .../common/client/common/FormStyleLayoutTest.java  |    72 -
 .../common/client/common/InfoPopupTest.java        |    70 -
 .../client/common/popups/FormStylePopupTest.java   |    77 -
 .../common/client/menu/MenuItemFactoryTest.java    |   157 -
 .../common/client/menu/RefreshMenuBuilderTest.java |    66 -
 .../menu/RefreshSelectorMenuBuilderTest.java       |    91 -
 .../common/client/tables/ColumnPickerTest.java     |    87 +-
 .../common/client/tables/FilterPagedTableTest.java |   159 -
 .../common/client/tables/PagedTableTest.java       |    68 +-
 .../common/client/tables/SimpleTableTest.java      |    74 +-
 .../uberfire-widgets/uberfire-widgets-core/pom.xml |     1 -
 .../uberfire-widgets-core-ace/pom.xml              |    58 -
 .../widgets/common/client/ace/AceAnnotation.java   |    35 -
 .../common/client/ace/AceAnnotationType.java       |    39 -
 .../ext/widgets/common/client/ace/AceCommand.java  |    42 -
 .../widgets/common/client/ace/AceCompletion.java   |    35 -
 .../common/client/ace/AceCompletionCallback.java   |    29 -
 .../client/ace/AceCompletionCallbackImpl.java      |    48 -
 .../common/client/ace/AceCompletionProvider.java   |    43 -
 .../common/client/ace/AceCompletionSnippet.java    |   127 -
 .../client/ace/AceCompletionSnippetSegment.java    |    29 -
 .../ace/AceCompletionSnippetSegmentLiteral.java    |    41 -
 .../AceCompletionSnippetSegmentTabstopItem.java    |    50 -
 .../common/client/ace/AceCompletionValue.java      |    80 -
 .../ext/widgets/common/client/ace/AceEditor.java   |   501 -
 .../common/client/ace/AceEditorCallback.java       |    35 -
 .../common/client/ace/AceEditorCursorPosition.java |    82 -
 .../widgets/common/client/ace/AceEditorMode.java   |   492 -
 .../widgets/common/client/ace/AceEditorTheme.java  |    74 -
 .../ext/widgets/common/UberfireAceEditor.gwt.xml   |    24 -
 .../ext/widgets/common/public/ace/ace-compat.js    |    83 -
 .../uberfire/ext/widgets/common/public/ace/ace.js  | 12421 -------------------
 .../ext/widgets/common/public/ace/cockpit.js       |  1134 --
 .../ext/widgets/common/public/ace/ext-beautify.js  |   148 -
 .../ext/widgets/common/public/ace/ext-chromevox.js |   347 -
 .../common/public/ace/ext-elastic_tabstops_lite.js |   192 -
 .../ext/widgets/common/public/ace/ext-emmet.js     |   938 --
 .../widgets/common/public/ace/ext-error_marker.js  |     3 -
 .../common/public/ace/ext-keybinding_menu.js       |   129 -
 .../common/public/ace/ext-language_tools.js        |  1421 ---
 .../ext/widgets/common/public/ace/ext-linking.js   |    36 -
 .../ext/widgets/common/public/ace/ext-modelist.js  |   157 -
 .../ext/widgets/common/public/ace/ext-old_ie.js    |   255 -
 .../ext/widgets/common/public/ace/ext-options.js   |   276 -
 .../ext/widgets/common/public/ace/ext-prompt.js    |    46 -
 .../ext/widgets/common/public/ace/ext-searchbox.js |   200 -
 .../widgets/common/public/ace/ext-settings_menu.js |   493 -
 .../widgets/common/public/ace/ext-spellcheck.js    |    55 -
 .../ext/widgets/common/public/ace/ext-split.js     |   205 -
 .../common/public/ace/ext-static_highlight.js      |    89 -
 .../ext/widgets/common/public/ace/ext-statusbar.js |    41 -
 .../ext/widgets/common/public/ace/ext-textarea.js  |   338 -
 .../ext/widgets/common/public/ace/ext-themelist.js |    46 -
 .../widgets/common/public/ace/ext-whitespace.js    |   128 -
 .../widgets/common/public/ace/keybinding-emacs.js  |   907 --
 .../widgets/common/public/ace/keybinding-vim.js    |  1214 --
 .../ext/widgets/common/public/ace/mode-html.js     |  1808 ---
 .../widgets/common/public/ace/mode-javascript.js   |   634 -
 .../ext/widgets/common/public/ace/snippets/html.js |     5 -
 .../common/public/ace/snippets/javascript.js       |     5 -
 .../ext/widgets/common/public/ace/theme-chrome.js  |     8 -
 .../ext/widgets/common/public/ace/worker-html.js   |  9097 --------------
 .../widgets/common/public/ace/worker-javascript.js |  6974 -----------
 .../defaulteditor/DefaultEditorFileUpload.java     |    68 -
 .../defaulteditor/DefaultEditorFileUploadBase.java |   156 -
 .../DefaultEditorFileUploadBase.ui.xml             |    37 -
 .../defaulteditor/DefaultEditorNewFileUpload.java  |    53 -
 .../defaulteditor/DefaultFileEditorPresenter.java  |    69 -
 .../defaulteditor/DefaultFileEditorView.java       |    66 -
 .../defaulteditor/DefaultFileEditorView.ui.xml     |    47 -
 .../core/client/wizards/AbstractWizard.java        |    16 +-
 .../ext/widgets/core/client/wizards/Wizard.java    |     4 +-
 .../widgets/core/client/wizards/WizardPage.java    |     5 +-
 .../core/client/wizards/WizardPageTitle.java       |    35 +-
 .../ext/widgets/core/UberfireWidgetsCore.gwt.xml   |     1 -
 .../DefaultEditorFileUploadBaseTestWrapper.java    |    56 -
 .../DefaultEditorFileUploadParametersTest.java     |    55 -
 .../defaulteditor/DefaultEditorFileUploadTest.java |    92 -
 .../editors/defaulteditor/UploadEventTest.java     |    55 -
 .../uberfire-widgets-properties-editor/pom.xml     |    37 -
 .../uberfire-widgets-properties-editor-api/pom.xml |    68 -
 .../model/CustomPropertyEditorFieldInfo.java       |    39 -
 .../editor/model/PropertyEditorCategory.java       |   107 -
 .../editor/model/PropertyEditorChangeEvent.java    |    49 -
 .../editor/model/PropertyEditorEvent.java          |   110 -
 .../editor/model/PropertyEditorFieldInfo.java      |   251 -
 .../editor/model/PropertyEditorFieldOption.java    |    22 -
 .../editor/model/PropertyEditorType.java           |   117 -
 .../ext/properties/editor/model/PropertyUtils.java |    38 -
 .../editor/model/validators/ColorValidator.java    |    65 -
 .../editor/model/validators/LongValidator.java     |    38 -
 .../model/validators/MandatoryValidator.java       |    34 -
 .../model/validators/PropertyFieldValidator.java   |    38 -
 .../editor/model/validators/TextValidator.java     |    36 -
 .../service/BeanPropertyEditorBuilderService.java  |    29 -
 .../main/resources/META-INF/ErraiApp.properties    |    33 -
 .../properties/editor/PropertiesEditorAPI.gwt.xml  |    27 -
 .../editor/model/PropertyEditorEventTest.java      |    63 -
 .../properties/editor/model/PropertyUtilsTest.java |    56 -
 .../model/validators/MandatoryValidatorTest.java   |    46 -
 .../pom.xml                                        |    51 -
 .../editor/server/BeanPropertyEditorBuilder.java   |   155 -
 .../src/main/resources/META-INF/beans.xml          |     0
 .../server/BeanPropertyEditorBuilderTest.java      |   255 -
 .../editor/server/beans/ComplexPlanBean.java       |    52 -
 .../properties/editor/server/beans/SampleEnum.java |    22 -
 .../editor/server/beans/SamplePlanBean.java        |    31 -
 .../editor/server/beans/UnknownTypesBean.java      |    25 -
 .../pom.xml                                        |    88 -
 .../editor/client/PropertyEditorHelper.java        |   300 -
 .../editor/client/PropertyEditorItemsWidget.java   |    62 -
 .../editor/client/PropertyEditorItemsWidget.ui.xml |    23 -
 .../editor/client/PropertyEditorWidget.java        |   138 -
 .../editor/client/PropertyEditorWidget.ui.xml      |    32 -
 .../editor/client/fields/AbstractField.java        |    54 -
 .../editor/client/fields/BooleanField.java         |    61 -
 .../editor/client/fields/ColorField.java           |    56 -
 .../editor/client/fields/ComboField.java           |   104 -
 .../client/fields/PropertyEditorFieldType.java     |    88 -
 .../editor/client/fields/SecretTextField.java      |    96 -
 .../properties/editor/client/fields/TextField.java |    94 -
 .../options/PropertyEditorFieldOptionUtils.java    |    37 -
 .../client/resources/i18n/CommonConstants.java     |    26 -
 .../widgets/AbstractPropertyEditorWidget.java      |    38 -
 .../client/widgets/PropertyEditorCheckBox.java     |    61 -
 .../client/widgets/PropertyEditorCheckBox.ui.xml   |    22 -
 .../client/widgets/PropertyEditorColorPicker.java  |    97 -
 .../widgets/PropertyEditorColorPicker.ui.xml       |    27 -
 .../client/widgets/PropertyEditorComboBox.java     |    93 -
 .../client/widgets/PropertyEditorComboBox.ui.xml   |    21 -
 .../client/widgets/PropertyEditorItemButtons.java  |    62 -
 .../widgets/PropertyEditorItemButtons.ui.xml       |    22 -
 .../client/widgets/PropertyEditorItemLabel.java    |    55 -
 .../client/widgets/PropertyEditorItemLabel.ui.xml  |    23 -
 .../client/widgets/PropertyEditorItemWidget.java   |    43 -
 .../client/widgets/PropertyEditorItemWidget.ui.xml |    22 -
 .../widgets/PropertyEditorPasswordTextBox.java     |    74 -
 .../widgets/PropertyEditorPasswordTextBox.ui.xml   |    21 -
 .../client/widgets/PropertyEditorTextBox.java      |    78 -
 .../client/widgets/PropertyEditorTextBox.ui.xml    |    23 -
 .../main/resources/META-INF/ErraiApp.properties    |    33 -
 .../src/main/resources/META-INF/beans.xml          |     7 -
 .../editor/PropertiesEditorClient.gwt.xml          |    27 -
 .../resources/i18n/CommonConstants.properties      |     1 -
 .../resources/i18n/CommonConstants_de.properties   |     1 -
 .../resources/i18n/CommonConstants_es.properties   |     1 -
 .../resources/i18n/CommonConstants_fr.properties   |     1 -
 .../resources/i18n/CommonConstants_ja.properties   |     1 -
 .../i18n/CommonConstants_pt_BR.properties          |     1 -
 .../i18n/CommonConstants_zh_CN.properties          |     1 -
 .../editor/client/PropertyEditorHelperTest.java    |   115 -
 .../editor/client/PropertyEditorWidgetTest.java    |    54 -
 .../PropertyEditorFieldOptionUtilsTest.java        |    38 -
 .../uberfire-widgets-service/pom.xml               |    33 -
 .../uberfire-widgets-service-api/pom.xml           |    40 -
 .../shared/preferences/GridColumnPreference.java   |   108 -
 .../shared/preferences/GridGlobalPreferences.java  |    63 -
 .../shared/preferences/GridPreferencesStore.java   |   114 -
 .../preferences/GridSortedColumnPreference.java    |    92 -
 .../preferences/MultiGridPreferencesStore.java     |   130 -
 .../shared/preferences/UserPreference.java         |    42 -
 .../shared/preferences/UserPreferencesService.java |    29 -
 .../shared/preferences/UserPreferencesType.java    |    34 -
 .../preferences/UserWorkbenchPreferences.java      |    51 -
 .../main/resources/META-INF/ErraiApp.properties    |    33 -
 .../services/UberfireWidgetsServicesAPI.gwt.xml    |    24 -
 .../uberfire-widgets-service-backend/pom.xml       |    48 -
 .../preferences/UserPreferencesServiceImpl.java    |    44 -
 .../main/resources/META-INF/ErraiApp.properties    |    31 -
 .../src/main/resources/META-INF/beans.xml          |     0
 .../dashbuilder/appformer/uberfire-server/pom.xml  |    90 -
 .../backend/server/util/gzip/GzipFilter.java       |    99 -
 .../util/gzip/GzipHttpServletResponseWrapper.java  |    94 -
 .../util/gzip/GzipResponseServletOutputStream.java |   106 -
 .../org/uberfire/server/FileDownloadServlet.java   |    73 -
 .../main/java/org/uberfire/server/MimeType.java    |  1386 ---
 .../server/cdi/UberFireGeneralFactory.java         |    45 -
 .../server/locale/GWTLocaleHeaderFilter.java       |   144 -
 .../org/uberfire/server/util/FileServletUtil.java  |    64 -
 .../src/main/resources/META-INF/beans.xml          |     0
 .../uberfire/server/FileDownloadServletTest.java   |   114 -
 .../server/locale/GWTLocaleHeaderFilterTest.java   |   148 -
 .../src/test/resources/expected-2-sample.html      |    22 -
 .../src/test/resources/expected-3-sample.html      |    22 -
 .../src/test/resources/expected-4-sample.html      |    22 -
 .../src/test/resources/expected-sample.html        |    22 -
 .../uberfire-server/src/test/resources/sample.html |    20 -
 .../java/org/uberfire/mocks/SessionInfoMock.java   |    36 -
 .../appformer/uberfire-workbench/pom.xml           |     1 -
 .../uberfire-workbench-client-backend/pom.xml      |    70 -
 .../client/WorkbenchBackendEntryPoint.java         |   119 -
 .../main/resources/META-INF/ErraiApp.properties    |    35 -
 .../src/main/resources/META-INF/beans.xml          |     6 -
 .../org/uberfire/UberfireWorkbenchBackend.gwt.xml  |    24 -
 .../client/WorkbenchBackendEntryPointTest.java     |   201 -
 .../src/test/resources/logback-test.xml            |    20 -
 .../client/views/pfly/HTML5DndSeleniumSupport.java |    95 -
 .../client/views/pfly/icon/PatternFlyIconType.java |    80 -
 .../views/pfly/listbar/ListBarWidgetImpl.java      |   150 -
 .../views/pfly/menu/DropdownMenuVisitor.java       |   160 -
 .../client/views/pfly/menu/HasMenuItems.java       |    40 -
 .../uberfire/client/views/pfly/menu/MainBrand.java |    30 -
 .../views/pfly/menu/PartContextMenusView.java      |    37 -
 .../views/pfly/menu/SplashScreenMenuView.java      |    75 -
 .../client/views/pfly/menu/UtilityMenuBarView.java |    61 -
 .../views/pfly/menu/WorkbenchMenuBarView.java      |   355 -
 .../pfly/menu/WorkbenchMenuCompactNavBarView.java  |   196 -
 .../views/pfly/menu/WorkbenchMenuNavBarView.java   |   122 -
 .../pfly/menu/WorkbenchMenuStandardNavBarView.java |   267 -
 .../pfly/menu/WorkbenchViewModeSwitcherView.java   |    68 -
 .../pfly/menu/megamenu/WorkbenchMegaMenuView.html  |    71 -
 .../pfly/menu/megamenu/WorkbenchMegaMenuView.java  |   267 -
 .../pfly/menu/megamenu/WorkbenchMegaMenuView.less  |   170 -
 .../contextmenuitem/ChildContextMenuItemView.html  |    19 -
 .../contextmenuitem/ChildContextMenuItemView.java  |    78 -
 .../contextmenuitem/GroupContextMenuItemView.html  |    20 -
 .../contextmenuitem/GroupContextMenuItemView.java  |    77 -
 .../menu/megamenu/menuitem/ChildMenuItemView.html  |    19 -
 .../menu/megamenu/menuitem/ChildMenuItemView.java  |    73 -
 .../menu/megamenu/menuitem/GroupMenuItemView.html  |    20 -
 .../menu/megamenu/menuitem/GroupMenuItemView.java  |    58 -
 .../menu/megamenu/menuitem/IconMenuItemView.html   |    21 -
 .../menu/megamenu/menuitem/IconMenuItemView.java   |    82 -
 .../views/pfly/multipage/MultiPageEditorImpl.java  |    95 -
 .../MultiPageEditorSelectedPageEvent.java          |    32 -
 .../pfly/multipage/MultiPageEditorViewImpl.java    |   183 -
 .../client/views/pfly/multipage/PageImpl.java      |    56 -
 .../client/views/pfly/multipage/PageViewImpl.java  |    54 -
 .../pfly/multiscreen/MultiScreenMenuBuilder.java   |   156 -
 .../pfly/multiscreen/MultiScreenPartWidget.java    |    49 +-
 .../views/pfly/splash/SplashModalFooter.html       |    25 -
 .../views/pfly/splash/SplashModalFooter.java       |    70 -
 .../client/views/pfly/splash/SplashViewImpl.java   |   105 -
 .../views/pfly/tab/MultiTabWorkbenchPanelView.java |    56 -
 .../views/pfly/toolbar/WorkbenchToolBarView.java   |   277 -
 .../views/pfly/toolbar/WorkbenchToolBarView.ui.xml |    60 -
 .../client/views/static/uberfire-patternfly.css    |     5 -
 .../views/pfly/listbar/ListBarWidgetImplTest.java  |   169 +-
 .../views/pfly/menu/WorkbenchMenuBarViewTest.java  |   276 -
 .../menu/WorkbenchMenuCompactNavBarViewTest.java   |   246 -
 .../menu/WorkbenchMenuStandardNavBarViewTest.java  |   331 -
 .../client/views/pfly/mock/MockPlaceManager.java   |    76 -
 .../pfly/multipage/MultiPageEditorImplTest.java    |    79 -
 .../multipage/MultiPageEditorViewImplTest.java     |   233 -
 .../multiscreen/MultiScreenMenuBuilderTest.java    |   109 -
 .../multiscreen/MultiScreenPartWidgetTest.java     |     7 -
 .../pfly/tab/MultiTabWorkbenchPanelViewTest.java   |    59 -
 .../org/uberfire/client/menu/CustomSplashHelp.java |    51 -
 .../client/menu/SplashScreenMenuPresenter.java     |   116 -
 .../menu/WorkbenchViewModeSwitcherMenuBuilder.java |    45 -
 .../menu/WorkbenchViewModeSwitcherPresenter.java   |   118 -
 .../org/uberfire/client/mvp/AbstractActivity.java  |     4 +-
 .../uberfire/client/mvp/AbstractPopupActivity.java |    10 +-
 .../client/mvp/AbstractSplashScreenActivity.java   |   147 -
 .../client/mvp/AbstractWorkbenchActivity.java      |    20 -
 .../mvp/AbstractWorkbenchClientEditorActivity.java |    29 -
 .../mvp/AbstractWorkbenchEditorActivity.java       |   107 -
 .../mvp/AbstractWorkbenchPerspectiveActivity.java  |    28 +-
 .../mvp/AbstractWorkbenchScreenActivity.java       |     7 +-
 .../java/org/uberfire/client/mvp/AcceptItem.java   |    21 -
 .../java/org/uberfire/client/mvp/Activity.java     |    18 +-
 .../uberfire/client/mvp/ActivityAndMetaInfo.java   |    74 -
 .../uberfire/client/mvp/ActivityBeansCache.java    |   136 +-
 .../org/uberfire/client/mvp/ActivityBeansInfo.java |     8 -
 .../org/uberfire/client/mvp/ActivityManager.java   |    31 +-
 .../uberfire/client/mvp/ActivityManagerImpl.java   |    96 +-
 .../org/uberfire/client/mvp/ActivityMetaInfo.java  |    88 -
 .../uberfire/client/mvp/BookmarkableUrlHelper.java |   428 -
 .../client/mvp/CategoriesManagerCache.java         |    78 -
 .../org/uberfire/client/mvp/IsSplashScreen.java    |    33 -
 .../uberfire/client/mvp/LockDemandDetector.java    |   103 -
 .../uberfire/client/mvp/PerspectiveActivity.java   |    13 -
 .../client/mvp/PerspectiveManagerImpl.java         |    77 +-
 .../uberfire/client/mvp/PlaceHistoryHandler.java   |   285 -
 .../java/org/uberfire/client/mvp/PlaceManager.java |    81 +-
 .../org/uberfire/client/mvp/PlaceManagerImpl.java  |   565 +-
 .../client/mvp/PlaceRequestHistoryMapper.java      |    28 -
 .../client/mvp/PlaceRequestHistoryMapperImpl.java  |    97 -
 .../client/mvp/PluginActivityManagerImpl.java      |   111 -
 .../client/mvp/PluginPlaceManagerImpl.java         |   292 -
 .../client/mvp/ResourceTypeManagerCache.java       |    97 -
 .../uberfire/client/mvp/SplashScreenActivity.java  |    48 -
 .../org/uberfire/client/mvp/WorkbenchActivity.java |    10 -
 .../client/mvp/WorkbenchClientEditorActivity.java  |    61 -
 .../client/mvp/WorkbenchEditorActivity.java        |    40 -
 .../client/mvp/WorkbenchScreenActivity.java        |     1 -
 .../mvp/jsbridge/JsWorkbenchLazyActivity.java      |     8 -
 .../mvp/jsbridge/JsWorkbenchLazyPerspective.java   |     8 -
 .../resources/i18n/PermissionTreeConstants.java    |    26 -
 .../resources/i18n/PermissionTreeI18NImpl.java     |    78 -
 .../client/resources/i18n/PermissionTreeI18n.java  |    42 -
 .../org/uberfire/client/util/CSSLocatorsUtils.java |     3 +-
 .../org/uberfire/client/workbench/BeanFactory.java |     8 +-
 .../client/workbench/DefaultBeanFactory.java       |    24 +-
 .../java/org/uberfire/client/workbench/Footer.java |    36 -
 .../java/org/uberfire/client/workbench/Header.java |    36 -
 .../uberfire/client/workbench/PanelManager.java    |     3 -
 .../client/workbench/PanelManagerImpl.java         |   185 +-
 .../client/workbench/PluginEntryPoint.java         |    43 -
 .../workbench/StandaloneEditorPerspective.java     |    50 -
 .../org/uberfire/client/workbench/Workbench.java   |    25 -
 .../uberfire/client/workbench/WorkbenchLayout.java |     2 -
 .../client/workbench/WorkbenchLayoutImpl.java      |   239 +-
 .../client/workbench/WorkbenchLayoutInfo.java      |    28 -
 .../client/workbench/WorkbenchLayoutInfoImpl.java  |    36 -
 .../client/workbench/WorkbenchServicesProxy.java   |     6 -
 .../WorkbenchServicesProxyClientImpl.java          |    12 -
 .../workbench/annotations/AssociatedResources.java |    37 -
 .../client/workbench/docks/UberfireDock.java       |   190 -
 .../docks/UberfireDockContainerReadyEvent.java     |    23 -
 .../workbench/docks/UberfireDockPosition.java      |    55 -
 .../workbench/docks/UberfireDockReadyEvent.java    |    32 -
 .../client/workbench/docks/UberfireDocks.java      |    80 -
 .../workbench/docks/UberfireDocksContainer.java    |   125 -
 .../docks/UberfireDocksInteractionEvent.java       |    90 -
 .../workbench/events/AbstractPlaceEvent.java       |     2 +-
 .../client/workbench/events/PerspectiveChange.java |     9 -
 .../client/workbench/panels/UFFlowPanel.java       |    58 -
 .../AbstractDockingWorkbenchPanelPresenter.java    |     2 +-
 .../impl/AbstractDockingWorkbenchPanelView.java    |    23 +-
 .../AbstractMultiPartWorkbenchPanelPresenter.java  |   124 -
 .../impl/AbstractMultiPartWorkbenchPanelView.java  |   100 -
 .../impl/AbstractSimpleWorkbenchPanelView.java     |   166 -
 .../impl/AdaptiveWorkbenchPanelPresenter.java      |    49 -
 .../panels/impl/AdaptiveWorkbenchPanelView.java    |    32 -
 .../ClosableSimpleWorkbenchPanelPresenter.java     |    86 -
 .../impl/ClosableSimpleWorkbenchPanelView.java     |    33 -
 .../impl/ImmutableWorkbenchPanelPresenter.java     |    58 -
 .../panels/impl/ImmutableWorkbenchPanelView.java   |   124 -
 .../workbench/panels/impl/LayoutPanelView.java     |     7 +-
 .../impl/MultiListWorkbenchPanelPresenter.java     |    47 -
 .../panels/impl/MultiListWorkbenchPanelView.java   |    95 -
 .../impl/MultiScreenWorkbenchPanelPresenter.java   |    45 -
 .../panels/impl/MultiScreenWorkbenchPanelView.java |    50 -
 .../impl/MultiTabWorkbenchPanelPresenter.java      |    47 -
 .../impl/SimpleDnDWorkbenchPanelPresenter.java     |    75 -
 .../panels/impl/SimpleDnDWorkbenchPanelView.java   |    27 -
 .../SimpleNoExpandWorkbenchPanelPresenter.java     |    85 -
 .../impl/SimpleNoExpandWorkbenchPanelView.java     |    35 -
 .../panels/impl/SimpleWorkbenchPanelPresenter.java |    85 -
 .../panels/impl/SimpleWorkbenchPanelView.java      |    34 -
 .../panels/impl/SinglePartPanelHelper.java         |    54 -
 .../panels/impl/SplitLayoutPanelPresenter.java     |    53 -
 .../panels/impl/SplitLayoutPanelView.java          |   181 -
 .../panels/impl/StaticWorkbenchPanelPresenter.java |    85 -
 .../panels/impl/StaticWorkbenchPanelView.java      |   171 -
 .../impl/TemplatedWorkbenchPanelPresenter.java     |    74 -
 .../panels/impl/TemplatedWorkbenchPanelView.java   |   194 -
 .../UnanchoredStaticWorkbenchPanelPresenter.java   |    90 -
 .../impl/UnanchoredStaticWorkbenchPanelView.java   |   167 -
 .../part/AbstractWorkbenchPartPresenter.java       |    15 -
 .../workbench/part/WorkbenchPartPresenter.java     |    22 +-
 .../widgets/dnd/CompassDropController.java         |     3 -
 .../widgets/dnd/WorkbenchDragContext.java          |     8 -
 .../widgets/dnd/WorkbenchPickupDragController.java |    80 +-
 .../workbench/widgets/listbar/ListBarWidget.java   |     8 +-
 .../menu/AbstractWorkbenchMenuProducer.java        |    79 -
 .../client/workbench/widgets/menu/HasMenus.java    |    24 -
 .../widgets/menu/MenuItemVisibilityHandler.java    |    38 -
 .../widgets/menu/PartContextMenusPresenter.java    |    80 -
 .../workbench/widgets/menu/UtilityMenuBar.java     |    22 -
 .../widgets/menu/UtilityMenuBarPresenter.java      |    53 -
 .../workbench/widgets/menu/WorkbenchMenuBar.java   |    39 -
 .../widgets/menu/WorkbenchMenuBarPresenter.java    |   415 -
 .../widgets/menu/WorkbenchMenuBarProducer.java     |    75 -
 .../menu/WorkbenchMenuBarStandalonePresenter.java  |    45 -
 .../menu/base/WorkbenchBaseMenuPresenter.java      |   111 -
 .../widgets/menu/base/WorkbenchBaseMenuUtils.java  |    26 -
 .../widgets/menu/base/WorkbenchBaseMenuView.java   |    22 -
 .../events/PerspectiveVisibiltiyChangeEvent.java   |    38 -
 .../menu/megamenu/WorkbenchMegaMenuPresenter.java  |   400 -
 .../menu/megamenu/WorkbenchMegaMenuProducer.java   |   103 -
 .../WorkbenchMegaMenuStandalonePresenter.java      |    68 -
 .../menu/megamenu/base/BaseMenuItemPresenter.java  |    24 -
 .../widgets/menu/megamenu/base/CanBeDisabled.java  |    24 -
 .../widgets/menu/megamenu/base/CanHide.java        |    25 -
 .../widgets/menu/megamenu/base/HasChildren.java    |    24 -
 .../widgets/menu/megamenu/base/Selectable.java     |    22 -
 .../widgets/menu/megamenu/brand/MegaMenuBrand.java |    44 -
 .../ChildContextMenuItemPresenter.java             |    92 -
 .../GroupContextMenuItemPresenter.java             |    84 -
 .../megamenu/menuitem/ChildMenuItemPresenter.java  |   100 -
 .../megamenu/menuitem/GroupMenuItemPresenter.java  |    62 -
 .../megamenu/menuitem/IconMenuItemPresenter.java   |    90 -
 .../WorkbenchMegaMenuContextMenuVisitor.java       |   112 -
 .../megamenu/visitor/WorkbenchMegaMenuVisitor.java |   123 -
 .../widgets/multipage/MultiPageEditor.java         |    43 -
 .../widgets/multipage/MultiPageEditorView.java     |    38 -
 .../workbench/widgets/multipage/Multiple.java      |    29 -
 .../client/workbench/widgets/multipage/Page.java   |    28 -
 .../workbench/widgets/multipage/PageView.java      |    23 -
 .../widgets/notifications/NotificationManager.java |    10 +-
 .../workbench/widgets/splash/SplashView.java       |    65 -
 .../widgets/toolbar/WorkbenchToolBarPresenter.java |   218 -
 .../i18n/PermissionTreeConstants.properties        |    27 -
 .../i18n/PermissionTreeConstants_es.properties     |    28 -
 .../i18n/PermissionTreeConstants_fr.properties     |    28 -
 .../i18n/PermissionTreeConstants_ja.properties     |    28 -
 .../mvp/AbstractPerspectiveActivityTest.java       |     6 +
 .../mvp/ActivityBeansCacheActivatedByTest.java     |   238 -
 .../client/mvp/ActivityBeansCacheTest.java         |   256 -
 .../mvp/ActivityBeansCacheUnitTestWrapper.java     |    41 -
 .../client/mvp/ActivityManagerActivatedByTest.java |   154 -
 .../client/mvp/ActivityManagerLifecycleTest.java   |   301 +-
 .../uberfire/client/mvp/ActivityMetaInfoTest.java  |   108 -
 .../client/mvp/BookmarkableUrlHelperTest.java      |   684 -
 .../client/mvp/CategoriesManagerCacheTest.java     |   100 -
 .../client/mvp/PerspectiveManagerTest.java         |   214 +-
 .../client/mvp/PlaceHistoryHandlerTest.java        |   519 -
 .../mvp/PlaceRequestHistoryMapperImplTest.java     |   133 -
 .../client/mvp/ResourceTypeManagerCacheTest.java   |   215 -
 .../client/mvp/WorkbenchEditorActivityTest.java    |   114 -
 .../client/workbench/DefaultBeanFactoryTest.java   |     2 -
 .../client/workbench/PanelManagerTest.java         |   150 +-
 .../client/workbench/WorkbenchLayoutImplTest.java  |   125 +-
 .../workbench/WorkbenchLayoutInfoImplTest.java     |    57 -
 .../client/workbench/docks/UberfireDockTest.java   |   259 -
 ...AbstractDockingWorkbenchPanelPresenterTest.java |    12 +-
 ...stractMultiPartWorkbenchPanelPresenterTest.java |   239 -
 .../impl/AdaptiveWorkbenchPanelViewTest.java       |    66 -
 .../ClosableSimpleWorkbenchPanelPresenterTest.java |   100 -
 .../impl/ClosableSimpleWorkbenchPanelViewTest.java |    85 -
 .../impl/MultiListWorkbenchPanelPresenterTest.java |    41 -
 .../impl/MultiListWorkbenchPanelViewTest.java      |   120 -
 .../impl/MultiTabWorkbenchPanelPresenterTest.java  |    41 -
 .../workbench/panels/impl/PlaceManagerTest.java    |  1005 +-
 .../impl/SimpleDnDWorkbenchPanelPresenterTest.java |    85 -
 .../SimpleNoExpandWorkbenchPanelPresenterTest.java |    82 -
 .../impl/SimpleWorkbenchPanelPresenterTest.java    |   100 -
 .../panels/impl/SimpleWorkbenchPanelViewTest.java  |   128 -
 .../SimpleWorkbenchPanelViewUnitTestWrapper.java   |    34 -
 .../panels/impl/SinglePartPanelHelperTest.java     |    86 -
 .../impl/StaticWorkbenchPanelPresenterTest.java    |    97 -
 .../panels/impl/StaticWorkbenchPanelViewTest.java  |   160 -
 ...nanchoredStaticWorkbenchPanelPresenterTest.java |    97 -
 .../UnanchoredStaticWorkbenchPanelViewTest.java    |    42 -
 .../widgets/dnd/CompassDropControllerTest.java     |    41 +-
 .../menu/WorkbenchMenuBarPresenterTest.java        |   309 -
 .../widgets/menu/WorkbenchMenuBarProducerTest.java |   166 -
 .../WorkbenchMenuBarStandalonePresenterTest.java   |   113 -
 .../megamenu/WorkbenchMegaMenuPresenterTest.java   |   578 -
 .../megamenu/WorkbenchMegaMenuProducerTest.java    |   190 -
 .../WorkbenchMegaMenuStandalonePresenterTest.java  |   164 -
 .../ChildContextMenuItemPresenterTest.java         |    73 -
 .../GroupContextMenuItemPresenterTest.java         |    75 -
 .../menuitem/ChildMenuItemPresenterTest.java       |    73 -
 .../menuitem/GroupMenuItemPresenterTest.java       |    61 -
 .../menuitem/IconMenuItemPresenterTest.java        |    76 -
 .../processors/PerspectiveProcessorTest.java       |   139 -
 .../WorkbenchClientEditorProcessorTest.java        |   150 -
 .../processors/WorkbenchEditorProcessorTest.java   |   555 -
 .../processors/WorkbenchScreenProcessorTest.java   |    68 -
 .../WorkbenchSplashScreenProcessorTest.java        |   210 -
 .../java/org/uberfire/client/mvp/MyTestType.java   |    85 -
 .../annotations/processors/PerspectiveTest10.java  |     7 -
 .../annotations/processors/PerspectiveTest11.java  |     6 -
 .../annotations/processors/PerspectiveTest12.java  |    43 -
 .../annotations/processors/PerspectiveTest13.java  |     4 +-
 .../annotations/processors/PerspectiveTest16.java  |    35 -
 .../annotations/processors/PerspectiveTest17.java  |    33 -
 .../annotations/processors/PerspectiveTest18.java  |    33 -
 .../annotations/processors/PerspectiveTest8.java   |     6 -
 .../annotations/processors/PerspectiveTest9.java   |     6 -
 .../processors/WorkbenchEditorTest1.java           |     5 -
 .../processors/WorkbenchEditorTest10.java          |    28 -
 .../processors/WorkbenchEditorTest11.java          |    29 -
 .../processors/WorkbenchEditorTest12.java          |    31 -
 .../processors/WorkbenchEditorTest13.java          |    31 -
 .../processors/WorkbenchEditorTest14.java          |    35 -
 .../processors/WorkbenchEditorTest15.java          |    30 -
 .../processors/WorkbenchEditorTest16.java          |    29 -
 .../processors/WorkbenchEditorTest17.java          |    24 -
 .../processors/WorkbenchEditorTest18.java          |    25 -
 .../processors/WorkbenchEditorTest19.java          |    22 -
 .../processors/WorkbenchEditorTest2.java           |     9 -
 .../processors/WorkbenchEditorTest20.java          |    27 -
 .../processors/WorkbenchEditorTest21.java          |    23 -
 .../processors/WorkbenchEditorTest22.java          |    23 -
 .../processors/WorkbenchEditorTest23.java          |    23 -
 .../processors/WorkbenchEditorTest24.java          |    23 -
 .../processors/WorkbenchEditorTest25.java          |    23 -
 .../processors/WorkbenchEditorTest26.java          |    23 -
 .../processors/WorkbenchEditorTest27.java          |    24 -
 .../processors/WorkbenchEditorTest28.java          |    29 -
 .../processors/WorkbenchEditorTest29.java          |    43 -
 .../processors/WorkbenchEditorTest3.java           |    17 -
 .../processors/WorkbenchEditorTest4.java           |    15 -
 .../processors/WorkbenchEditorTest5.java           |    23 -
 .../processors/WorkbenchEditorTest6.java           |    16 -
 .../processors/WorkbenchEditorTest7.java           |    23 -
 .../processors/WorkbenchEditorTest8.java           |    56 -
 .../processors/WorkbenchEditorTest9.java           |    31 -
 .../processors/WorkbenchScreenTest10.java          |     6 -
 .../processors/WorkbenchScreenTest14.java          |     7 -
 .../processors/WorkbenchScreenTest15.java          |     6 -
 .../processors/WorkbenchScreenTest30.java          |     6 -
 .../processors/WorkbenchScreenTest9.java           |     6 -
 .../processors/WorkbenchSplashScreenTest1.java     |     5 -
 .../processors/WorkbenchSplashScreenTest10.java    |    49 -
 .../processors/WorkbenchSplashScreenTest2.java     |     8 -
 .../processors/WorkbenchSplashScreenTest3.java     |    16 -
 .../processors/WorkbenchSplashScreenTest4.java     |    14 -
 .../processors/WorkbenchSplashScreenTest5.java     |    22 -
 .../processors/WorkbenchSplashScreenTest6.java     |    29 -
 .../processors/WorkbenchSplashScreenTest7.java     |    31 -
 .../processors/WorkbenchSplashScreenTest8.java     |    38 -
 .../processors/WorkbenchSplashScreenTest9.java     |    31 -
 .../processors/expected/PerspectiveTest12.expected |   135 -
 .../processors/expected/PerspectiveTest13.expected |     2 +-
 .../processors/expected/PerspectiveTest17.expected |   117 -
 .../processors/expected/PerspectiveTest18.expected |   119 -
 .../expected/WorkbenchClientEditorTest6.expected   |    87 -
 .../expected/WorkbenchClientEditorTest7.expected   |    87 -
 .../expected/WorkbenchClientEditorTest8.expected   |    87 -
 .../expected/WorkbenchEditorTest10.expected        |    83 -
 .../expected/WorkbenchEditorTest11.expected        |    82 -
 .../expected/WorkbenchEditorTest12.expected        |    82 -
 .../expected/WorkbenchEditorTest13.expected        |    75 -
 .../expected/WorkbenchEditorTest14.expected        |    82 -
 .../expected/WorkbenchEditorTest15.expected        |    82 -
 .../expected/WorkbenchEditorTest16.expected        |    75 -
 .../expected/WorkbenchEditorTest17.expected        |    76 -
 .../expected/WorkbenchEditorTest18.expected        |    78 -
 .../expected/WorkbenchEditorTest19.expected        |    76 -
 .../expected/WorkbenchEditorTest21.expected        |    75 -
 .../expected/WorkbenchEditorTest22.expected        |    85 -
 .../expected/WorkbenchEditorTest23.expected        |    75 -
 .../expected/WorkbenchEditorTest24.expected        |    80 -
 .../expected/WorkbenchEditorTest25.expected        |    75 -
 .../expected/WorkbenchEditorTest26.expected        |    80 -
 .../expected/WorkbenchEditorTest27.expected        |    78 -
 .../expected/WorkbenchEditorTest28.expected        |    93 -
 .../expected/WorkbenchEditorTest29.expected        |    77 -
 .../expected/WorkbenchEditorTest5.expected         |    75 -
 .../expected/WorkbenchEditorTest6.expected         |    75 -
 .../expected/WorkbenchEditorTest7.expected         |    75 -
 .../expected/WorkbenchEditorTest8.expected         |   119 -
 .../expected/WorkbenchEditorTest9.expected         |    82 -
 .../expected/WorkbenchSplashScreenTest10.expected  |    82 -
 .../expected/WorkbenchSplashScreenTest6.expected   |    80 -
 .../expected/WorkbenchSplashScreenTest7.expected   |    83 -
 .../expected/WorkbenchSplashScreenTest9.expected   |    83 -
 .../processors/ClientEditorActivityGenerator.java  |   319 -
 .../processors/EditorActivityGenerator.java        |    13 +-
 .../annotations/processors/GeneratorUtils.java     |   472 +-
 .../processors/PerspectiveActivityGenerator.java   |    12 -
 .../processors/ScreenActivityGenerator.java        |   192 +-
 .../processors/SplashScreenActivityGenerator.java  |   241 -
 .../processors/WorkbenchClientEditorProcessor.java |   121 -
 .../processors/WorkbenchEditorProcessor.java       |   121 -
 .../processors/WorkbenchSplashScreenProcessor.java |   121 -
 .../processors/facades/ClientAPIModule.java        |   104 +-
 .../services/javax.annotation.processing.Processor |     3 -
 .../processors/templates/activityClientEditor.ftl  |   243 -
 .../processors/templates/activityScreen.ftl        |    18 -
 .../processors/templates/perspective.ftl           |    21 -
 .../processors/templates/splashScreen.ftl          |   181 -
 packages/dashbuilder/dashbuilder-authoring/pom.xml |   765 --
 .../org/dashbuilder/backend/RuntimeJaxApp.java     |    25 -
 .../org/dashbuilder/client/ShowcaseEntryPoint.java |    91 -
 .../org/dashbuilder/client/navbar/AppHeader.html   |    14 -
 .../org/dashbuilder/client/navbar/AppHeader.java   |    69 -
 .../client/navbar/DashbuilderNavBrand.java         |    40 -
 .../client/navigation/NavTreeDefinitions.java      |    50 -
 .../client/perspectives/HomePerspective.java       |    41 -
 .../client/resources/i18n/AppConstants.java        |    31 -
 .../resources/images/dashbuilder_user_logo.png     |   Bin 3381 -> 0 bytes
 .../org/dashbuilder/client/screens/HomeScreen.java |    82 -
 .../client/screens/view/HomeScreenView.html        |    57 -
 .../client/screens/view/HomeScreenView.java        |    80 -
 .../client/screens/view/HomeScreenView.less        |   188 -
 .../main/resources/META-INF/ErraiApp.properties    |    70 -
 ...g.uberfire.java.nio.file.spi.FileSystemProvider |     2 -
 .../src/main/resources/app.html.template           |    25 -
 .../src/main/resources/logback.xml                 |    18 -
 .../org/dashbuilder/DashbuilderAuthoring.gwt.xml   |    44 -
 .../FastCompiledDashbuilderAuthoring.gwt.xml       |    13 -
 .../client/resources/i18n/AppConstants.properties  |    21 -
 .../resources/i18n/AppConstants_de.properties      |   417 -
 .../resources/i18n/AppConstants_es.properties      |   461 -
 .../resources/i18n/AppConstants_fr.properties      |   461 -
 .../resources/i18n/AppConstants_ja.properties      |   461 -
 .../resources/i18n/AppConstants_pt_BR.properties   |   417 -
 .../resources/i18n/AppConstants_zh_CN.properties   |   417 -
 .../dashbuilder/public/css/uberfire-loading.css    |    30 -
 .../dashbuilder/public/css/uberfire-showcase.css   |    13 -
 .../org/dashbuilder/public/images/bg-login-top.png |   Bin 4432 -> 0 bytes
 .../org/dashbuilder/public/images/bg-login.png     |   Bin 4769 -> 0 bytes
 .../dashbuilder/public/images/dashbuilder-logo.png |   Bin 5379 -> 0 bytes
 .../org/dashbuilder/public/images/loading-icon.gif |   Bin 3208 -> 0 bytes
 .../src/main/webapp/WEB-INF/beans.xml              |    41 -
 .../src/main/webapp/WEB-INF/datasets/README.md     |    13 -
 .../webapp/WEB-INF/datasets/clusterMetrics.dset    |    16 -
 .../webapp/WEB-INF/datasets/expenseReports.csv     |    51 -
 .../webapp/WEB-INF/datasets/expenseReports.dset    |    23 -
 .../WEB-INF/datasets/salesOpportunities.dset       |    14 -
 .../webapp/WEB-INF/datasets/worldPopulation.csv    |   126 -
 .../webapp/WEB-INF/datasets/worldPopulation.dset   |    20 -
 .../webapp/WEB-INF/jboss-deployment-structure.xml  |    32 -
 .../src/main/webapp/WEB-INF/jboss-web.xml          |     8 -
 .../src/main/webapp/WEB-INF/web.xml                |    65 -
 .../src/main/webapp/banner/banner.html             |    11 -
 .../src/main/webapp/banner/logo.png                |   Bin 1113 -> 0 bytes
 .../src/main/webapp/favicon.ico                    |   Bin 1150 -> 0 bytes
 .../src/main/webapp/images/bg-login-top.png        |   Bin 4432 -> 0 bytes
 .../src/main/webapp/images/bg-login.png            |   Bin 4769 -> 0 bytes
 .../src/main/webapp/images/dashbuilder-logo.png    |   Bin 5379 -> 0 bytes
 .../src/main/webapp/images/dashbuilder_brand.png   |   Bin 5626 -> 0 bytes
 .../src/main/webapp/images/dashbuilder_home_bg.jpg |   Bin 101355 -> 0 bytes
 .../src/main/webapp/images/loading-icon.gif        |   Bin 3208 -> 0 bytes
 .../src/main/webapp/index.html                     |    87 -
 .../src/test/resources/datasources/h2-test-ds.xml  |    10 -
 .../dashbuilder-dataset-cdi/pom.xml                |   190 -
 .../src/main/java/org/dashbuilder/Bootstrap.java   |    80 -
 .../main/java/org/dashbuilder/config/Config.java   |    32 -
 .../java/org/dashbuilder/config/ConfigReader.java  |   192 -
 .../dataprovider/BeanDataSetProviderCDI.java       |    99 -
 .../dataprovider/CSVDataSetProviderCDI.java        |    66 -
 .../dataprovider/DataSetProviderRegistryCDI.java   |    94 -
 .../dataprovider/ExternalDataSetProviderCDI.java   |    52 -
 .../dataprovider/KafkaDataSetProviderCDI.java      |    61 -
 .../dataprovider/PrometheusDataSetProviderCDI.java |    61 -
 .../dataprovider/SQLDataSetProviderCDI.java        |    74 -
 .../dataprovider/SQLDataSourceLocatorCDI.java      |    42 -
 .../dataprovider/StaticDataSetProviderCDI.java     |    28 -
 .../dashbuilder/dataset/DataSetDefDeployerCDI.java |    54 -
 .../dashbuilder/dataset/DataSetDefRegistryCDI.java |   329 -
 .../org/dashbuilder/dataset/DataSetManagerCDI.java |    44 -
 .../dashbuilder/exception/ExceptionManager.java    |    47 -
 .../exception/GenericPortableException.java        |    38 -
 .../org/dashbuilder/scheduler/SchedulerCDI.java    |    39 -
 .../src/main/resources/META-INF/beans.xml          |     0
 .../src/test/java/BootstrapTest.java               |   106 -
 .../dashbuilder/config/ConfigAnnotationTest.java   |    54 -
 .../dataset/DataSetDefRegistryCDITest.java         |   108 -
 .../dataset/DataSetProviderRegistryCDITest.java    |    61 -
 .../dataset/DataSetSubsystemCDITest.java           |   127 -
 .../dataset/SQLDataSourceLocatorCDITest.java       |    65 -
 .../dataset/SQLDataSourceLocatorMock.java          |    46 -
 .../src/test/java/org/dashbuilder/pojo/Bean.java   |    41 -
 .../test/java/org/dashbuilder/pojo/BeanExt.java    |    35 -
 .../java/org/dashbuilder/test/BaseCDITest.java     |    34 -
 .../org/dashbuilder/test/MavenProjectHelper.java   |    94 -
 .../org/dashbuilder/test/ShrinkWrapHelper.java     |    38 -
 .../src/test/resources/META-INF/beans.config       |    18 -
 .../src/test/resources/META-INF/beans.xml          |     0
 .../META-INF/org.dashbuilder.pojo.Bean.config      |    17 -
 .../META-INF/org.dashbuilder.pojo.BeanExt.config   |    17 -
 .../dashbuilder-external-backend/pom.xml           |    76 -
 .../external/ExternalComponentServlet.java         |   128 -
 .../external/impl/BackendComponentFunction.java    |    44 -
 .../impl/BackendComponentFunctionServiceImpl.java  |    57 -
 .../external/impl/ComponentAssetProviderImpl.java  |    87 -
 .../external/impl/ComponentLoaderImpl.java         |   129 -
 .../external/impl/ComponentServiceImpl.java        |    54 -
 .../impl/function/BackendDateFunction.java         |    44 -
 .../src/main/resources/META-INF/beans.xml          |     0
 .../impl/ComponentAssetProviderImplTest.java       |   132 -
 .../external/impl/ComponentLoaderImplTest.java     |   172 -
 .../external/impl/ComponentServiceImplTest.java    |    71 -
 .../dashbuilder-kie-server-backend/pom.xml         |    64 -
 .../KieServerConnectionInfoProviderImpl.java       |   188 -
 .../backend/KieServerDataSetListener.java          |    94 -
 .../backend/RuntimeKieServerDataSetProvider.java   |   427 -
 .../backend/function/ProcessSVGFunction.java       |    98 -
 .../kieserver/backend/rest/BasicAuthFilter.java    |    48 -
 .../backend/rest/KieServerQueryClient.java         |   179 -
 .../kieserver/backend/rest/QueryDefinition.java    |   144 -
 .../kieserver/backend/rest/QueryFilterSpec.java    |    96 -
 .../kieserver/backend/rest/QueryParam.java         |    84 -
 .../kieserver/backend/rest/TokenFilter.java        |    36 -
 .../src/main/resources/META-INF/beans.xml          |     0
 .../KieServerConnectionInfoProviderImplTest.java   |   217 -
 .../RuntimeKieServerDataSetProviderTest.java       |   423 -
 .../dashbuilder-navigation-backend/pom.xml         |   106 -
 .../navigation/service/LayoutTemplateAnalyzer.java |   296 -
 .../navigation/service/NavigationServicesImpl.java |    48 -
 .../service/PerspectivePluginServicesImpl.java     |   102 -
 .../navigation/storage/NavTreeStorage.java         |    65 -
 .../src/main/resources/META-INF/beans.xml          |     0
 .../service/LayoutTemplateAnalyzerTest.java        |   334 -
 .../dashbuilder-services/pom.xml                   |   161 -
 .../dataset/service/DataSetDefServicesImpl.java    |   106 -
 .../dataset/service/DataSetDefVfsServicesImpl.java |   137 -
 .../dataset/service/DataSetExportServicesImpl.java |   339 -
 .../dataset/service/DataSetLookupServicesImpl.java |   112 -
 .../dataset/service/SQLProviderServicesImpl.java   |    45 -
 .../service/RendererSettingsServiceImpl.java       |    29 -
 .../transfer/DataTransferServicesImpl.java         |   503 -
 .../transfer/ExportModelValidationServiceImpl.java |    96 -
 .../transfer/LayoutComponentHelper.java            |    58 -
 .../transfer/rest/DataTransferResource.java        |    88 -
 .../dashbuilder/transfer/rest/FileUploadModel.java |    50 -
 .../src/main/resources/META-INF/beans.xml          |     0
 .../dataset/service/DataSetExportServicesTest.java |   115 -
 .../service/RendererSettingsServiceTest.java       |    31 -
 .../transfer/DataTransferServicesTest.java         |   533 -
 .../ExportModelValidationServiceImplTest.java      |   162 -
 .../transfer/LayoutComponentHelperTest.java        |    95 -
 .../transfer/rest/DataTransferResourceTest.java    |    63 -
 ...g.uberfire.java.nio.file.spi.FileSystemProvider |    18 -
 .../src/test/resources/empty.zip                   |   Bin 22 -> 0 bytes
 .../src/test/resources/import.zip                  |   Bin 23387 -> 0 bytes
 packages/dashbuilder/dashbuilder-backend/pom.xml   |    37 -
 packages/dashbuilder/dashbuilder-bom/pom.xml       |   411 -
 .../dashbuilder-cms-client/pom.xml                 |   182 -
 .../client/cms/ContentManagerEntryPoint.java       |    26 -
 .../layout/editor/PerspectiveDragComponent.java    |    93 -
 .../layout/editor/PerspectiveDragConfigModal.java  |   124 -
 .../editor/PerspectiveDragConfigModalView.css      |    15 -
 .../editor/PerspectiveDragConfigModalView.html     |    21 -
 .../editor/PerspectiveDragConfigModalView.java     |   161 -
 .../cms/perspective/ContentManagerPerspective.java |   158 -
 .../cms/perspective/DataTransferPerspective.java   |    50 -
 .../resources/i18n/ContentManagerConstants.java    |   152 -
 .../cms/resources/i18n/ContentManagerI18n.java     |   140 -
 .../screen/explorer/NavigationExplorerScreen.java  |   130 -
 .../explorer/PerspectivesExplorerScreen.java       |    84 -
 .../cms/screen/home/ContentManagerHomeScreen.java  |    71 -
 .../cms/screen/home/ContentManagerHomeView.html    |    38 -
 .../cms/screen/home/ContentManagerHomeView.java    |    90 -
 .../cms/screen/transfer/DataTransferPopUp.java     |    54 -
 .../cms/screen/transfer/DataTransferPopUpView.html |    21 -
 .../cms/screen/transfer/DataTransferPopUpView.java |   104 -
 .../cms/screen/transfer/DataTransferScreen.java    |   213 -
 .../cms/screen/transfer/DataTransferView.css       |    11 -
 .../cms/screen/transfer/DataTransferView.html      |    60 -
 .../cms/screen/transfer/DataTransferView.java      |   154 -
 .../transfer/export/wizard/DataSetsWizardPage.java |    68 -
 .../export/wizard/ExportSummaryWizardPage.java     |   202 -
 .../export/wizard/ExportSummaryWizardPageView.css  |    36 -
 .../export/wizard/ExportSummaryWizardPageView.html |    45 -
 .../export/wizard/ExportSummaryWizardPageView.java |   262 -
 .../transfer/export/wizard/ExportWizard.java       |   134 -
 .../transfer/export/wizard/PagesWizardPage.java    |    69 -
 .../widget/AssetsTableAbstractPresenter.java       |    73 -
 .../export/wizard/widget/AssetsTableView.css       |    29 -
 .../export/wizard/widget/AssetsTableView.html      |    35 -
 .../export/wizard/widget/AssetsTableView.java      |   213 -
 .../export/wizard/widget/DataSetsTable.java        |    42 -
 .../transfer/export/wizard/widget/PagesTable.java  |    36 -
 .../client/cms/screen/util/DomFactory.java         |    56 -
 .../client/cms/widget/NewPerspectivePopUp.java     |   146 -
 .../client/cms/widget/NewPerspectivePopUpView.css  |    16 -
 .../client/cms/widget/NewPerspectivePopUpView.html |    51 -
 .../client/cms/widget/NewPerspectivePopUpView.java |   208 -
 .../client/cms/widget/PerspectiveWidget.java       |    90 -
 .../client/cms/widget/PerspectiveWidgetView.html   |     1 -
 .../client/cms/widget/PerspectiveWidgetView.java   |    73 -
 .../client/cms/widget/PerspectivesExplorer.java    |   100 -
 .../client/cms/widget/PerspectivesExplorerView.css |     2 -
 .../cms/widget/PerspectivesExplorerView.html       |     1 -
 .../cms/widget/PerspectivesExplorerView.java       |   100 -
 .../main/resources/META-INF/ErraiApp.properties    |    17 -
 .../src/main/resources/META-INF/beans.xml          |     6 -
 .../org/dashbuilder/ContentManagerClient.gwt.xml   |    25 -
 .../i18n/ContentManagerConstants.properties        |    89 -
 .../i18n/ContentManagerConstants_ja.properties     |    64 -
 .../perspective/ContentManagerPerspectiveTest.java |    92 -
 .../explorer/NavigationExplorerScreenTest.java     |    99 -
 .../screen/transfer/DataTransferScreenTest.java    |    94 -
 .../export/wizard/ExportSummaryWizardPageTest.java |    75 -
 .../export/wizard/widget/AssetsTableViewTest.java  |   171 -
 .../client/cms/widget/NewPerspectivePopUpTest.java |   118 -
 .../cms/widget/PerspectivesExplorerTest.java       |    96 -
 .../dashbuilder/common/client/CollectionUtils.java |    92 -
 .../common/client/JsonSourceViewer.java            |   115 -
 .../dashbuilder/common/client/SpacerWidget.java    |    28 -
 .../org/dashbuilder/common/client/StringUtils.java |     4 +
 .../common/client/backend/PathUrlFactory.java      |    51 -
 .../common/client/editor/HasConstrainedValue.java  |    19 -
 .../common/client/editor/HasEditMode.java          |    18 -
 .../common/client/editor/HasRestrictedValue.java   |    25 -
 .../common/client/editor/LeafAttributeEditor.java  |    12 -
 .../common/client/editor/ToggleSwitchEditor.java   |   110 -
 .../client/editor/ToggleSwitchEditorView.java      |    92 -
 .../client/editor/ToggleSwitchEditorView.ui.xml    |    15 -
 .../common/client/editor/ValueBoxEditor.java       |   116 -
 .../common/client/editor/ValueBoxEditorView.java   |    96 -
 .../common/client/editor/ValueBoxEditorView.ui.xml |    13 -
 .../client/editor/file/FileUploadEditor.java       |   221 -
 .../client/editor/file/FileUploadEditorView.java   |   171 -
 .../client/editor/file/FileUploadEditorView.ui.xml |    29 -
 .../common/client/editor/list/DropDownEditor.java  |   235 -
 .../client/editor/list/DropDownEditorView.java     |   108 -
 .../client/editor/list/DropDownEditorView.ui.xml   |    25 -
 .../editor/list/DropDownImageListEditor.java       |    46 -
 .../editor/list/DropDownImageListEditorView.java   |   173 -
 .../editor/list/DropDownImageListEditorView.ui.xml |    39 -
 .../client/editor/list/HorizImageListEditor.java   |    27 -
 .../editor/list/HorizImageListEditorView.java      |   152 -
 .../editor/list/HorizImageListEditorView.ui.xml    |    29 -
 .../common/client/editor/list/ImageListEditor.java |   176 -
 .../client/editor/list/ImageListEditorView.java    |    23 -
 .../common/client/editor/map/MapEditor.java        |   258 -
 .../common/client/editor/map/MapEditorView.java    |   174 -
 .../common/client/editor/map/MapEditorView.ui.xml  |    43 -
 .../common/client/event/ContextualEvent.java       |    20 -
 .../common/client/event/ValueChangeEvent.java      |    32 -
 .../resources/bundles/DashbuilderCommonImages.java |    67 -
 .../bundles/DashbuilderCommonResources.java        |    12 -
 .../bundles/images/slider/default/dragh.png        |   Bin 872 -> 0 bytes
 .../bundles/images/slider/default/dragv.png        |   Bin 166 -> 0 bytes
 .../bundles/images/slider/default/lessh.png        |   Bin 945 -> 0 bytes
 .../bundles/images/slider/default/lessv.png        |   Bin 215 -> 0 bytes
 .../bundles/images/slider/default/moreh.png        |   Bin 945 -> 0 bytes
 .../bundles/images/slider/default/morev.png        |   Bin 209 -> 0 bytes
 .../bundles/images/slider/default/scaleh.png       |   Bin 844 -> 0 bytes
 .../bundles/images/slider/default/scalev.png       |   Bin 839 -> 0 bytes
 .../bundles/images/slider/triangle/drag.png        |   Bin 592 -> 0 bytes
 .../bundles/images/slider/triangle/line.png        |   Bin 129 -> 0 bytes
 .../bundles/images/slider/triangle/more_less.png   |   Bin 125 -> 0 bytes
 .../resources/i18n/DashbuilderCommonConstants.java |    14 +-
 .../resources/i18n/DashbuilderCommonMessages.java  |    16 -
 .../common/client/widgets/AlertPanel.java          |    59 -
 .../common/client/widgets/AlertPanelView.java      |    91 -
 .../common/client/widgets/AlertPanelView.ui.xml    |    44 -
 .../common/client/widgets/CharacterBox.java        |   112 -
 .../common/client/widgets/CharacterBoxBase.java    |    64 -
 .../common/client/widgets/LoadingBox.java          |    39 -
 .../common/client/widgets/LoadingBoxView.java      |    23 -
 .../i18n/DashbuilderCommonConstants.properties     |    14 +-
 .../i18n/DashbuilderCommonMessages.properties      |     1 -
 .../common/client/editor/AbstractEditorTest.java   |    24 -
 .../client/editor/ToggleSwitchEditorTest.java      |   107 -
 .../common/client/editor/ValueBoxEditorTest.java   |   111 -
 .../client/editor/file/FileUploadEditorTest.java   |   261 -
 .../client/editor/list/DropDownEditorTest.java     |   131 -
 .../editor/list/DropDownImageListEditorTest.java   |    90 -
 .../editor/list/HorizImageListEditorTest.java      |    70 -
 .../client/editor/list/ImageListEditorTest.java    |   177 -
 .../common/client/editor/map/MapEditorTest.java    |   178 -
 .../common/client/widgets/LoadingBoxTest.java      |    38 -
 .../dashbuilder-dataset-client/pom.xml             |     5 -
 .../dataset/client/DataSetClientServices.java      |    16 -
 .../dataset/client/DataSetClientServicesImpl.java  |   260 +-
 .../dataset/client/DataSetExportReadyCallback.java |     7 -
 .../editor/BeanDataSetDefAttributesEditor.java     |    25 -
 .../client/editor/BeanDataSetDefEditor.java        |    24 -
 .../editor/CSVDataSetDefAttributesEditor.java      |    41 -
 .../dataset/client/editor/CSVDataSetDefEditor.java |    34 -
 .../dataset/client/editor/ColumnListEditor.java    |    30 -
 .../dataset/client/editor/ColumnTypeEditor.java    |    26 -
 .../dataset/client/editor/DataColumnDefEditor.java |    44 -
 .../DataSetDefBackendCacheAttributesEditor.java    |    22 -
 .../editor/DataSetDefBasicAttributesEditor.java    |    22 -
 .../DataSetDefClientCacheAttributesEditor.java     |    22 -
 .../client/editor/DataSetDefColumnsEditor.java     |    22 -
 .../editor/DataSetDefColumnsFilterEditor.java      |    28 -
 .../dataset/client/editor/DataSetDefEditor.java    |    33 -
 .../client/editor/DataSetDefFilterEditor.java      |    16 -
 .../editor/DataSetDefProviderTypeEditor.java       |    21 -
 .../editor/DataSetDefRefreshAttributesEditor.java  |    25 -
 .../editor/DataSetDefRefreshIntervalEditor.java    |    14 -
 .../editor/ExternalDataSetDefAttributesEditor.java |    37 -
 .../client/editor/ExternalDataSetDefEditor.java    |    21 -
 .../editor/KafkaDataSetDefAttributesEditor.java    |    54 -
 .../client/editor/KafkaDataSetDefEditor.java       |    43 -
 .../PrometheusDataSetDefAttributesEditor.java      |    37 -
 .../client/editor/PrometheusDataSetDefEditor.java  |    30 -
 .../editor/RemoteDataSetDefAttributesEditor.java   |    41 -
 .../client/editor/RemoteDataSetDefEditor.java      |    30 -
 .../editor/SQLDataSetDefAttributesEditor.java      |    29 -
 .../dataset/client/editor/SQLDataSetDefEditor.java |    26 -
 .../resources/bundles/DataSetClientImages.java     |   102 -
 .../resources/bundles/DataSetClientResources.java  |    14 -
 .../resources/bundles/images/cancel_icon_small.gif |   Bin 947 -> 0 bytes
 .../resources/bundles/images/csv_icon_160.png      |   Bin 4915 -> 0 bytes
 .../resources/bundles/images/csv_icon_32.png       |   Bin 1220 -> 0 bytes
 .../resources/bundles/images/date_icon_16.png      |   Bin 677 -> 0 bytes
 .../resources/bundles/images/date_icon_32.png      |   Bin 1187 -> 0 bytes
 .../client/resources/bundles/images/excel_icon.png |   Bin 3348 -> 0 bytes
 .../resources/bundles/images/external_icon_160.png |   Bin 9829 -> 0 bytes
 .../resources/bundles/images/external_icon_32.png  |   Bin 5798 -> 0 bytes
 .../resources/bundles/images/java_icon_160.png     |   Bin 2094 -> 0 bytes
 .../resources/bundles/images/java_icon_32.png      |   Bin 609 -> 0 bytes
 .../resources/bundles/images/kafka_icon_160.png    |   Bin 12153 -> 0 bytes
 .../resources/bundles/images/kafka_icon_32.png     |   Bin 6023 -> 0 bytes
 .../resources/bundles/images/label_icon_16.png     |   Bin 362 -> 0 bytes
 .../resources/bundles/images/label_icon_32.png     |   Bin 689 -> 0 bytes
 .../resources/bundles/images/loading_icon.gif      |   Bin 3199 -> 0 bytes
 .../resources/bundles/images/number_icon_32_V1.png |   Bin 1018 -> 0 bytes
 .../resources/bundles/images/number_icon_32_V2.png |   Bin 1021 -> 0 bytes
 .../resources/bundles/images/number_icon_32_V3.png |   Bin 1012 -> 0 bytes
 .../resources/bundles/images/ok_icon_small.gif     |   Bin 308 -> 0 bytes
 .../bundles/images/prometheus_icon_160.png         |   Bin 12184 -> 0 bytes
 .../bundles/images/prometheus_icon_32.png          |   Bin 8152 -> 0 bytes
 .../resources/bundles/images/sql_icon_160.png      |   Bin 4558 -> 0 bytes
 .../resources/bundles/images/sql_icon_32.png       |   Bin 1239 -> 0 bytes
 .../resources/bundles/images/text_icon_16.png      |   Bin 255 -> 0 bytes
 .../resources/bundles/images/text_icon_32.png      |   Bin 572 -> 0 bytes
 .../dataset/client/AbstractDataSetTest.java        |    14 +-
 .../client/DataSetClientServicesImplTest.java      |    51 +-
 .../dashbuilder-dataset-editor/pom.xml             |   147 -
 .../perspectives/DataSetAuthoringPerspective.java  |    58 -
 .../resources/i18n/DataSetAuthoringConstants.java  |    26 -
 .../screens/DataSetAuthoringHomePresenter.java     |    96 -
 .../client/screens/DataSetAuthoringHomeView.java   |    66 -
 .../client/screens/DataSetAuthoringHomeView.ui.xml |    67 -
 .../client/screens/DataSetDefEditorPresenter.java  |   377 -
 .../client/screens/DataSetDefExplorerScreen.java   |   144 -
 .../client/screens/DataSetDefScreenView.java       |     8 -
 .../client/screens/DataSetDefScreenViewImpl.java   |    45 -
 .../editor/client/screens/DataSetDefType.java      |    84 -
 .../client/screens/DataSetDefWizardScreen.java     |   366 -
 .../main/resources/META-INF/ErraiApp.properties    |    17 -
 .../src/main/resources/META-INF/beans.xml          |    22 -
 .../org/dashbuilder/DataSetEditor.gwt.xml          |    14 -
 .../i18n/DataSetAuthoringConstants.properties      |    17 -
 .../i18n/DataSetAuthoringConstants_de.properties   |    16 -
 .../i18n/DataSetAuthoringConstants_es.properties   |    18 -
 .../i18n/DataSetAuthoringConstants_fr.properties   |    18 -
 .../i18n/DataSetAuthoringConstants_ja.properties   |    18 -
 .../DataSetAuthoringConstants_pt_BR.properties     |    16 -
 .../DataSetAuthoringConstants_zh_CN.properties     |    16 -
 .../screens/DataSetAuthoringHomePresenterTest.java |    89 -
 .../screens/DataSetDefEditorPresenterTest.java     |   327 -
 .../screens/DataSetDefExplorerScreenTest.java      |    91 -
 .../editor/client/screens/DataSetDefTypeTest.java  |    37 -
 .../client/screens/DataSetDefWizardScreenTest.java |   334 -
 .../dashbuilder-displayer-client/pom.xml           |    15 -
 .../displayer/client/DataSetEditHandler.java       |    42 -
 .../displayer/client/DataSetHandlerImpl.java       |    29 +-
 .../displayer/client/DisplayerCoordinator.java     |     5 +-
 .../displayer/client/PerspectiveCoordinator.java   |    90 +
 .../displayer/client/RendererManager.java          |    72 +-
 .../component/ExternalComponentDispatcher.java     |    53 -
 .../component/function/BackendFunctionLoader.java  |    75 -
 .../function/ComponentFunctionLocator.java         |    67 -
 .../client/component/function/GWTVersion.java      |    23 -
 .../client/component/function/ListFunctions.java   |    41 -
 .../client/events/ColumnDetailsChangedEvent.java   |    38 -
 .../client/events/ColumnFilterChangedEvent.java    |    34 -
 .../client/events/ColumnFilterDeletedEvent.java    |    34 -
 .../client/events/DataSetFilterChangedEvent.java   |    38 -
 .../client/events/DataSetGroupDateChanged.java     |    38 -
 .../client/events/DataSetLookupChangedEvent.java   |    38 -
 .../client/events/DisplayerEditorClosedEvent.java  |    38 -
 .../client/events/DisplayerEditorSavedEvent.java   |    38 -
 .../events/DisplayerSettingsChangedEvent.java      |    38 -
 .../events/DisplayerSubtypeSelectedEvent.java      |    38 -
 .../client/events/DisplayerTypeSelectedEvent.java  |    38 -
 .../client/events/GroupFunctionChangedEvent.java   |    38 -
 .../client/events/GroupFunctionDeletedEvent.java   |    38 -
 .../client/prototypes/DataSetPrototypes.java       |   286 -
 .../client/prototypes/DisplayerPrototypes.java     |   359 -
 .../resources/i18n/DisplayerHtmlConstants.java     |    30 -
 .../resources/i18n/DisplayerTypeConstants.java     |   141 -
 .../resources/i18n/MapColorSchemeConstants.java    |    33 -
 .../client/resources/i18n/PositionConstants.java   |    37 -
 .../resources/i18n/SourceCodeEditorConstants.java  |    26 -
 .../i18n/SourceCodeValidatorConstants.java         |    28 -
 .../resources/images/DisplayerImagesResources.java |   163 -
 .../client/widgets/DataSetLookupEditor.java        |   662 -
 .../client/widgets/DataSetLookupEditorView.java    |   285 -
 .../client/widgets/DataSetLookupEditorView.ui.xml  |    72 -
 .../displayer/client/widgets/DisplayerEditor.java  |   552 -
 .../client/widgets/DisplayerEditorPopup.java       |   167 -
 .../client/widgets/DisplayerEditorPopup.ui.xml     |    30 -
 .../client/widgets/DisplayerEditorStatus.java      |    50 -
 .../client/widgets/DisplayerEditorView.java        |   245 -
 .../client/widgets/DisplayerEditorView.ui.xml      |    74 -
 .../client/widgets/DisplayerErrorWidget.html       |    16 +-
 .../client/widgets/DisplayerErrorWidget.java       |    30 +-
 .../client/widgets/DisplayerHtmlEditor.java        |   157 -
 .../client/widgets/DisplayerHtmlEditorView.html    |     8 -
 .../client/widgets/DisplayerHtmlEditorView.java    |   136 -
 .../client/widgets/DisplayerSettingsEditor.java    |   670 -
 .../widgets/DisplayerSettingsEditorView.java       |   350 -
 .../widgets/DisplayerSettingsEditorView.ui.xml     |    28 -
 .../widgets/DisplayerSettingsJSONSourceViewer.java |    53 -
 .../DisplayerSettingsJSONSourceViewer.ui.xml       |    37 -
 .../client/widgets/DisplayerSubtypeSelector.java   |   102 -
 .../widgets/DisplayerSubtypeSelectorView.java      |   146 -
 .../client/widgets/DisplayerTypeSelector.java      |    96 -
 .../client/widgets/DisplayerTypeSelectorView.java  |   112 -
 .../widgets/DisplayerTypeSelectorView.ui.xml       |    30 -
 .../client/widgets/ExternalComponentEditor.java    |    87 -
 .../widgets/ExternalComponentEditorPopUp.java      |    73 -
 .../client/widgets/ExternalComponentEditorView.css |    29 -
 .../widgets/ExternalComponentEditorView.html       |    23 -
 .../widgets/ExternalComponentEditorView.java       |    52 -
 .../widgets/ExternalComponentPropertiesEditor.java |   184 -
 .../ExternalComponentPropertiesEditorView.css      |    25 -
 .../ExternalComponentPropertiesEditorView.html     |    21 -
 .../ExternalComponentPropertiesEditorView.java     |   110 -
 .../client/widgets/filter/ColumnFilterEditor.java  |   419 -
 .../widgets/filter/ColumnFilterEditorView.java     |   175 -
 .../widgets/filter/ColumnFilterEditorView.ui.xml   |    47 -
 .../client/widgets/filter/DataSetFilterEditor.java |   157 -
 .../widgets/filter/DataSetFilterEditorView.java    |   131 -
 .../widgets/filter/DataSetFilterEditorView.ui.xml  |    40 -
 .../widgets/filter/LikeToFunctionEditor.java       |    93 -
 .../widgets/filter/LikeToFunctionEditorView.java   |   105 -
 .../widgets/filter/LikeToFunctionEditorView.ui.xml |    49 -
 .../filter/MultipleNumberParameterEditor.java      |   110 -
 .../filter/MultipleNumberParameterEditorView.java  |    86 -
 .../MultipleNumberParameterEditorView.ui.xml       |    34 -
 .../filter/MultipleTextParameterEditor.java        |   110 -
 .../filter/MultipleTextParameterEditorView.java    |    85 -
 .../filter/MultipleTextParameterEditorView.ui.xml  |    34 -
 .../client/widgets/filter/TextParameterEditor.java |    84 -
 .../widgets/filter/TextParameterEditorView.java    |    85 -
 .../widgets/filter/TextParameterEditorView.ui.xml  |    34 -
 .../client/widgets/filter/TimeAmountEditor.java    |   134 -
 .../widgets/filter/TimeAmountEditorView.java       |   118 -
 .../widgets/filter/TimeAmountEditorView.ui.xml     |    33 -
 .../client/widgets/filter/TimeFrameEditor.java     |   203 -
 .../client/widgets/filter/TimeFrameEditorView.java |    98 -
 .../widgets/filter/TimeFrameEditorView.ui.xml      |    41 -
 .../client/widgets/filter/TimeInstantEditor.java   |   159 -
 .../widgets/filter/TimeInstantEditorView.java      |   118 -
 .../widgets/filter/TimeInstantEditorView.ui.xml    |    32 -
 .../client/widgets/group/ColumnDetailsEditor.java  |    77 -
 .../widgets/group/ColumnDetailsEditorView.java     |    66 -
 .../widgets/group/ColumnDetailsEditorView.ui.xml   |    30 -
 .../client/widgets/group/ColumnFunctionEditor.java |   205 -
 .../widgets/group/ColumnFunctionEditorView.java    |   182 -
 .../widgets/group/ColumnFunctionEditorView.ui.xml  |    46 -
 .../widgets/group/DataSetGroupDateEditor.java      |   274 -
 .../widgets/group/DataSetGroupDateEditorView.java  |   216 -
 .../group/DataSetGroupDateEditorView.ui.xml        |    63 -
 .../widgets/sourcecode/DefaultHtmlValidator.java   |    33 -
 .../widgets/sourcecode/DefaultJsEvaluator.java     |    31 -
 .../widgets/sourcecode/DefaultJsValidator.java     |   149 -
 .../client/widgets/sourcecode/HasHtmlTemplate.java |    25 -
 .../client/widgets/sourcecode/HasJsTemplate.java   |    25 -
 .../client/widgets/sourcecode/HtmlValidator.java   |    27 -
 .../client/widgets/sourcecode/JsEvaluator.java     |    21 -
 .../client/widgets/sourcecode/JsValidator.java     |    30 -
 .../widgets/sourcecode/SourceCodeEditor.java       |   142 -
 .../widgets/sourcecode/SourceCodeEditorView.css    |    18 -
 .../widgets/sourcecode/SourceCodeEditorView.html   |    15 -
 .../widgets/sourcecode/SourceCodeEditorView.java   |   164 -
 .../client/widgets/sourcecode/SourceCodeType.java  |    21 -
 .../org/dashbuilder/DisplayerClient.gwt.xml        |     2 -
 .../i18n/DisplayerHtmlConstants.properties         |    19 -
 .../i18n/DisplayerHtmlConstants_es.properties      |    20 -
 .../i18n/DisplayerHtmlConstants_fr.properties      |    20 -
 .../i18n/DisplayerHtmlConstants_ja.properties      |    20 -
 .../i18n/DisplayerTypeConstants.properties         |    77 -
 .../i18n/DisplayerTypeConstants_de.properties      |    40 -
 .../i18n/DisplayerTypeConstants_es.properties      |    77 -
 .../i18n/DisplayerTypeConstants_fr.properties      |    77 -
 .../i18n/DisplayerTypeConstants_ja.properties      |    77 -
 .../i18n/DisplayerTypeConstants_pt_BR.properties   |    40 -
 .../i18n/DisplayerTypeConstants_zh_CN.properties   |    40 -
 .../i18n/MapColorSchemeConstants.properties        |    20 -
 .../resources/i18n/PositionConstants.properties    |    23 -
 .../resources/i18n/PositionConstants_de.properties |     5 -
 .../resources/i18n/PositionConstants_es.properties |    24 -
 .../resources/i18n/PositionConstants_fr.properties |    24 -
 .../resources/i18n/PositionConstants_ja.properties |    24 -
 .../i18n/PositionConstants_pt_BR.properties        |     5 -
 .../i18n/PositionConstants_zh_CN.properties        |     5 -
 .../i18n/SourceCodeEditorConstants.properties      |    17 -
 .../i18n/SourceCodeEditorConstants_es.properties   |    18 -
 .../i18n/SourceCodeEditorConstants_fr.properties   |    18 -
 .../i18n/SourceCodeEditorConstants_ja.properties   |    18 -
 .../i18n/SourceCodeValidatorConstants.properties   |    18 -
 .../SourceCodeValidatorConstants_es.properties     |    19 -
 .../SourceCodeValidatorConstants_fr.properties     |    19 -
 .../SourceCodeValidatorConstants_ja.properties     |    19 -
 .../client/resources/images/area_selected.png      |   Bin 4435 -> 0 bytes
 .../resources/images/area_stacked_selected.png     |   Bin 4998 -> 0 bytes
 .../resources/images/area_stacked_unselected.png   |   Bin 3271 -> 0 bytes
 .../client/resources/images/area_unselected.png    |   Bin 2814 -> 0 bytes
 .../client/resources/images/bar_selected.png       |   Bin 408 -> 0 bytes
 .../resources/images/bar_stacked_selected.png      |   Bin 386 -> 0 bytes
 .../resources/images/bar_stacked_unselected.png    |   Bin 761 -> 0 bytes
 .../client/resources/images/bar_unselected.png     |   Bin 617 -> 0 bytes
 .../client/resources/images/bubble_default.png     |   Bin 2952 -> 0 bytes
 .../client/resources/images/column_selected.png    |   Bin 411 -> 0 bytes
 .../resources/images/column_stacked_selected.png   |   Bin 443 -> 0 bytes
 .../resources/images/column_stacked_unselected.png |   Bin 785 -> 0 bytes
 .../client/resources/images/column_unselected.png  |   Bin 757 -> 0 bytes
 .../client/resources/images/donut_selected.png     |   Bin 4412 -> 0 bytes
 .../client/resources/images/donut_unselected.png   |   Bin 3542 -> 0 bytes
 .../client/resources/images/line_selected.png      |   Bin 3495 -> 0 bytes
 .../resources/images/line_smooth_selected.png      |   Bin 3821 -> 0 bytes
 .../resources/images/line_smooth_unselected.png    |   Bin 3370 -> 0 bytes
 .../client/resources/images/line_unselected.png    |   Bin 2998 -> 0 bytes
 .../resources/images/map_markers_selected.png      |   Bin 8586 -> 0 bytes
 .../resources/images/map_markers_unselected.png    |   Bin 5096 -> 0 bytes
 .../resources/images/map_regions_selected.png      |   Bin 9621 -> 0 bytes
 .../resources/images/map_regions_unselected.png    |   Bin 5655 -> 0 bytes
 .../client/resources/images/meter_default.png      |   Bin 4100 -> 0 bytes
 .../resources/images/metric_card2_selected.png     |   Bin 4284 -> 0 bytes
 .../resources/images/metric_card2_unselected.png   |   Bin 4242 -> 0 bytes
 .../resources/images/metric_card_selected.png      |   Bin 3000 -> 0 bytes
 .../resources/images/metric_card_unselected.png    |   Bin 3714 -> 0 bytes
 .../resources/images/metric_plaintext_selected.png |   Bin 1562 -> 0 bytes
 .../images/metric_plaintext_unselected.png         |   Bin 1487 -> 0 bytes
 .../resources/images/metric_quota_selected.png     |   Bin 1946 -> 0 bytes
 .../resources/images/metric_quota_unselected.png   |   Bin 1879 -> 0 bytes
 .../client/resources/images/pie_3d_selected.png    |   Bin 5166 -> 0 bytes
 .../client/resources/images/pie_3d_unselected.png  |   Bin 2970 -> 0 bytes
 .../client/resources/images/pie_selected.png       |   Bin 4647 -> 0 bytes
 .../client/resources/images/pie_unselected.png     |   Bin 2934 -> 0 bytes
 .../images/selector_dropdown_selected.png          |   Bin 2953 -> 0 bytes
 .../images/selector_dropdown_unselected.png        |   Bin 2150 -> 0 bytes
 .../resources/images/selector_labels_selected.png  |   Bin 2634 -> 0 bytes
 .../images/selector_labels_unselected.png          |   Bin 2636 -> 0 bytes
 .../resources/images/selector_slider_selected.png  |   Bin 2502 -> 0 bytes
 .../images/selector_slider_unselected.png          |   Bin 1619 -> 0 bytes
 .../client/resources/images/table_default.png      |   Bin 2289 -> 0 bytes
 .../displayer/client/DisplayerExportTest.java      |   172 -
 .../displayer/client/RendererManagerTest.java      |    39 +-
 .../component/ExternalComponentDispatcherTest.java |   122 -
 .../function/ComponentFunctionLocatorTest.java     |    56 -
 .../client/widgets/DataSetLookupEditorTest.java    |   491 -
 .../client/widgets/DisplayerEditorTest.java        |   303 -
 .../client/widgets/DisplayerHtmlEditorTest.java    |    75 -
 .../widgets/DisplayerSettingsEditorTest.java       |   396 -
 .../widgets/DisplayerSubtypeSelectorTest.java      |   101 -
 .../client/widgets/DisplayerTypeSelectorTest.java  |    81 -
 .../ExternalComponentPropertiesEditorTest.java     |   114 -
 .../widgets/filter/ColumnFilterEditorTest.java     |   247 -
 .../widgets/filter/DataSetFilterEditorTest.java    |   168 -
 .../widgets/filter/LikeToFunctionEditorTest.java   |    65 -
 .../filter/MultipleNumberParameterEditorTest.java  |   122 -
 .../filter/MultipleTextParameterEditorTest.java    |   100 -
 .../widgets/filter/NumberParameterEditorTest.java  |    75 -
 .../widgets/filter/TextParameterEditorTest.java    |    65 -
 .../widgets/filter/TimeAmountEditorTest.java       |    89 -
 .../client/widgets/filter/TimeFrameEditorTest.java |   149 -
 .../widgets/filter/TimeInstantEditorTest.java      |   141 -
 .../widgets/group/ColumnFunctionEditorTest.java    |   196 -
 .../widgets/group/DataSetGroupDateEditorTest.java  |   164 -
 .../client/widgets/sourcecode/JsValidatorTest.java |   150 -
 .../widgets/sourcecode/SourceCodeEditorTest.java   |   106 -
 .../dashbuilder-displayer-editor/pom.xml           |     5 -
 .../client/editor/AreaChartDragComponent.java      |    55 -
 .../client/editor/BarChartDragComponent.java       |    55 -
 .../client/editor/BubbleChartDragComponent.java    |    50 -
 .../client/editor/DisplayerDragComponent.java      |    90 +-
 .../client/editor/DisplayerEditorEntryPoint.java   |    35 -
 .../client/editor/LineChartDragComponent.java      |    55 -
 .../client/editor/MapChartDragComponent.java       |    55 -
 .../client/editor/MeterChartDragComponent.java     |    55 -
 .../client/editor/MetricDragComponent.java         |    55 -
 .../PerspectiveEditorReportingGroupProvider.java   |    89 -
 .../client/editor/PieChartDragComponent.java       |    55 -
 .../client/editor/SelectorDragComponent.java       |    55 -
 .../client/editor/TableDragComponent.java          |    55 -
 .../editor/external/ComponentGroupProducer.java    |   123 -
 .../editor/external/ExternalComponentDragDef.java  |    70 -
 .../external/ExternalDisplayerDragComponent.java   |   118 -
 .../editor/external/ExternalDragComponent.java     |    95 +-
 .../client/editor/resources/i18n/Constants.java    |    54 -
 .../editor/resources/i18n/Constants.properties     |    31 -
 .../editor/resources/i18n/Constants_de.properties  |     1 -
 .../editor/resources/i18n/Constants_es.properties  |    30 -
 .../editor/resources/i18n/Constants_fr.properties  |    30 -
 .../editor/resources/i18n/Constants_ja.properties  |    30 -
 .../resources/i18n/Constants_pt_BR.properties      |     1 -
 .../resources/i18n/Constants_zh_CN.properties      |     1 -
 .../client/editor/DisplayerDragComponentTest.java  |    46 -
 ...erspectiveEditorReportingGroupProviderTest.java |    63 -
 .../ExternalComponentGroupProviderTest.java        |    73 -
 .../dashbuilder-displayer-screen/pom.xml           |    77 -
 .../displayer/client/DisplayerScreenPresenter.java |   346 -
 .../displayer/client/PerspectiveCoordinator.java   |   143 -
 .../displayer/client/resources/i18n/Constants.java |    41 -
 .../main/resources/META-INF/ErraiApp.properties    |    17 -
 .../src/main/resources/META-INF/beans.xml          |     6 -
 .../org/dashbuilder/DisplayerScreen.gwt.xml        |    12 -
 .../client/resources/i18n/Constants.properties     |    24 -
 .../client/resources/i18n/Constants_de.properties  |     7 -
 .../client/resources/i18n/Constants_es.properties  |    25 -
 .../client/resources/i18n/Constants_fr.properties  |    25 -
 .../client/resources/i18n/Constants_ja.properties  |    25 -
 .../resources/i18n/Constants_pt_BR.properties      |     7 -
 .../resources/i18n/Constants_zh_CN.properties      |     7 -
 .../client/PerspectiveCoordinatorTest.java         |    39 -
 .../dashbuilder-navigation-client/pom.xml          |    20 -
 .../client/navigation/NavBarHelper.java            |   114 -
 .../event/NavItemEditCancelledEvent.java           |    35 -
 .../navigation/event/NavItemEditStartedEvent.java  |    35 -
 .../client/navigation/event/NavItemGotoEvent.java  |    35 -
 .../navigation/event/NavTreeLoadedEvent.java       |    34 -
 .../navigation/impl/NavigationManagerImpl.java     |    50 +-
 .../layout/editor/AbstractNavDragComponent.java    |    85 +-
 .../layout/editor/NavCarouselDragComponent.java    |    17 +-
 .../navigation/layout/editor/NavDragComponent.java |     7 +-
 .../layout/editor/NavMenuBarDragComponent.java     |    17 +-
 .../layout/editor/NavTabListDragComponent.java     |    17 +-
 .../layout/editor/NavTilesDragComponent.java       |    17 +-
 .../layout/editor/NavTreeDragComponent.java        |    17 +-
 .../plugin/PerspectivePluginEntryPoint.java        |    37 -
 .../plugin/PerspectivePluginManager.java           |     9 -
 .../plugin/PerspectivePluginManagerImpl.java       |   229 -
 .../navigation/widget/NavCarouselWidget.java       |    20 +-
 .../navigation/widget/NavComponentConfigModal.java |   291 -
 .../widget/NavComponentConfigModalView.java        |   284 -
 .../client/navigation/widget/NavTilesWidget.java   |    13 -
 .../widget/ScreenLayoutDragComponent.java          |    59 +
 .../navigation/widget/TargetDivNavWidget.java      |    16 +-
 .../widget/editor/NavItemDefaultEditor.java        |    50 -
 .../widget/editor/NavItemDefaultEditorView.css     |    85 -
 .../widget/editor/NavItemDefaultEditorView.html    |    32 -
 .../widget/editor/NavItemDefaultEditorView.java    |   304 -
 .../navigation/widget/editor/NavItemEditor.java    |   926 --
 .../widget/editor/NavItemEditorSettings.java       |   253 -
 .../widget/editor/NavItemEditorView.java           |    70 -
 .../widget/editor/NavRootNodeEditor.java           |    62 -
 .../widget/editor/NavRootNodeEditorView.css        |    85 -
 .../widget/editor/NavRootNodeEditorView.html       |    32 -
 .../widget/editor/NavRootNodeEditorView.java       |   303 -
 .../navigation/widget/editor/NavTreeEditor.java    |   202 -
 .../navigation/widget/editor/NavTreeEditorView.css |    13 -
 .../widget/editor/NavTreeEditorView.html           |    11 -
 .../widget/editor/NavTreeEditorView.java           |   167 -
 .../widget/editor/TargetPerspectiveEditor.java     |   179 -
 .../widget/editor/TargetPerspectiveEditorView.css  |    15 -
 .../widget/editor/TargetPerspectiveEditorView.html |    19 -
 .../widget/editor/TargetPerspectiveEditorView.java |   127 -
 .../navigation/NavComponentConfigModalTest.java    |   145 -
 .../plugin/PerspectivePluginManagerImplTest.java   |   147 -
 .../widget/editor/NavItemEditorTest.java           |   370 -
 .../widget/editor/NavTreeEditorTest.java           |   440 -
 .../widget/editor/TargetPerspectiveEditorTest.java |   115 -
 .../renderer/client/metric/MetricDisplayer.java    |    55 +-
 .../client/selector/SelectorSliderDisplayer.java   |     2 +-
 .../renderer/client/table/TableDisplayer.java      |     6 +-
 .../renderer/client/table/TableDisplayerTest.java  |    13 +-
 .../echarts/client/EChartsAbstractDisplayer.java   |     9 +
 .../echarts/client/EChartsDisplayerView.java       |    31 +-
 .../client/EChartsResizeHandlerRegister.java       |    50 +
 .../dashbuilder-client/dashbuilder-widgets/pom.xml |   161 -
 .../common/ClientRuntimeErrorPopupPresenter.java   |    46 -
 .../client/widgets/common/DataSetEditorPlugin.java |    35 -
 .../editor/DataSetDefColumnsFilterEditor.java      |   181 -
 .../editor/DataSetDefColumnsFilterEditorView.java  |    70 -
 .../DataSetDefColumnsFilterEditorView.ui.xml       |    41 -
 .../dataset/editor/DataSetDefFilterEditor.java     |   103 -
 .../dataset/editor/DataSetDefFilterEditorView.java |    42 -
 .../editor/DataSetDefFilterEditorView.ui.xml       |     7 -
 .../dataset/editor/DataSetDefPreviewTable.java     |   170 -
 .../dataset/editor/DataSetDefPreviewTableView.java |    57 -
 .../editor/DataSetDefPreviewTableView.ui.xml       |    16 -
 .../editor/DataSetDefProviderTypeEditor.java       |   221 -
 .../editor/DataSetDefProviderTypeEditorView.java   |    41 -
 .../editor/DataSetDefProviderTypeEditorView.ui.xml |    25 -
 .../widgets/dataset/editor/DataSetEditor.java      |   413 -
 .../widgets/dataset/editor/DataSetEditorView.java  |   215 -
 .../dataset/editor/DataSetEditorView.ui.xml        |   117 -
 .../DataSetDefBackendCacheAttributesEditor.java    |   154 -
 .../DataSetDefBasicAttributesEditor.java           |    89 -
 .../DataSetDefBasicAttributesEditorView.java       |    44 -
 .../DataSetDefBasicAttributesEditorView.ui.xml     |    57 -
 .../DataSetDefCacheAttributesEditorView.java       |    29 -
 .../DataSetDefCacheAttributesEditorViewImpl.java   |    94 -
 .../DataSetDefCacheAttributesEditorViewImpl.ui.xml |    48 -
 .../DataSetDefClientCacheAttributesEditor.java     |   154 -
 .../DataSetDefRefreshAttributesEditor.java         |   136 -
 .../DataSetDefRefreshAttributesEditorView.java     |    75 -
 .../DataSetDefRefreshAttributesEditorView.ui.xml   |    49 -
 .../DataSetDefRefreshIntervalEditor.java           |   123 -
 .../DataSetDefRefreshIntervalEditorView.java       |    97 -
 .../DataSetDefRefreshIntervalEditorView.ui.xml     |    22 -
 .../bean/BeanDataSetDefAttributesEditor.java       |    88 -
 .../bean/BeanDataSetDefAttributesEditorView.java   |    45 -
 .../bean/BeanDataSetDefAttributesEditorView.ui.xml |    64 -
 .../dataset/editor/bean/BeanDataSetEditor.java     |    87 -
 .../dataset/editor/column/ColumnListEditor.java    |   370 -
 .../editor/column/ColumnListEditorView.java        |    82 -
 .../editor/column/ColumnListEditorView.ui.xml      |     9 -
 .../dataset/editor/column/ColumnTypeEditor.java    |   218 -
 .../dataset/editor/column/DataColumnDefEditor.java |   114 -
 .../editor/column/DataColumnDefEditorView.java     |    44 -
 .../editor/column/DataColumnDefEditorView.ui.xml   |    31 -
 .../editor/column/DataSetDefColumnsEditor.java     |   114 -
 .../editor/csv/CSVDataSetDefAttributesEditor.java  |   233 -
 .../csv/CSVDataSetDefAttributesEditorView.java     |    99 -
 .../csv/CSVDataSetDefAttributesEditorView.ui.xml   |   160 -
 .../dataset/editor/csv/CSVDataSetEditor.java       |   121 -
 .../driver/BeanDataSetDefAttributesDriver.java     |    13 -
 .../editor/driver/BeanDataSetDefDriver.java        |    13 -
 .../driver/CSVDataSetDefAttributesDriver.java      |    13 -
 .../dataset/editor/driver/CSVDataSetDefDriver.java |    13 -
 .../dataset/editor/driver/DataColumnDefDriver.java |    13 -
 .../driver/DataSetDefBasicAttributesDriver.java    |    13 -
 .../driver/DataSetDefProviderTypeDriver.java       |    13 -
 .../editor/driver/DataSetEditorDriverFactory.java  |   104 -
 .../driver/ExternalDataSetDefAttributesDriver.java |    12 -
 .../editor/driver/ExternalDataSetDefDriver.java    |    12 -
 .../driver/KafkaDataSetDefAttributesDriver.java    |    27 -
 .../editor/driver/KafkaDataSetDefDriver.java       |    27 -
 .../PrometheusDataSetDefAttributesDriver.java      |    27 -
 .../editor/driver/PrometheusDataSetDefDriver.java  |    27 -
 .../driver/RemoteDataSetDefAttributesDriver.java   |    28 -
 .../editor/driver/RemoteDataSetDefDriver.java      |    28 -
 .../driver/SQLDataSetDefAttributesDriver.java      |    13 -
 .../dataset/editor/driver/SQLDataSetDefDriver.java |    13 -
 .../ExternalDataSetDefAttributesEditor.java        |   103 -
 .../ExternalDataSetDefAttributesEditorView.java    |    40 -
 .../ExternalDataSetDefAttributesEditorView.ui.xml  |    48 -
 .../editor/external/ExternalDataSetEditor.java     |    81 -
 .../kafka/KafkaDataSetDefAttributesEditor.java     |   225 -
 .../kafka/KafkaDataSetDefAttributesEditorView.java |   129 -
 .../KafkaDataSetDefAttributesEditorView.ui.xml     |   206 -
 .../dataset/editor/kafka/KafkaDataSetEditor.java   |   118 -
 .../editor/kafka/MetricsTargetEditorAdapter.java   |    71 -
 .../PrometheusDataSetDefAttributesEditor.java      |   114 -
 .../PrometheusDataSetDefAttributesEditorView.java  |    59 -
 ...PrometheusDataSetDefAttributesEditorView.ui.xml |    87 -
 .../editor/prometheus/PrometheusDataSetEditor.java |    86 -
 .../RemoteDataSetDefAttributesEditorImpl.java      |   177 -
 .../RemoteDataSetDefAttributesEditorView.java      |    73 -
 .../RemoteDataSetDefAttributesEditorView.ui.xml    |    95 -
 .../dataset/editor/remote/RemoteDataSetEditor.java |   106 -
 .../remote/RemoteDataSetEditorDriverFactory.java   |    44 -
 .../editor/remote/RemoteDataSetEditorPlugin.java   |    65 -
 .../editor/sql/SQLDataSetDefAttributesEditor.java  |   188 -
 .../sql/SQLDataSetDefAttributesEditorView.java     |    97 -
 .../sql/SQLDataSetDefAttributesEditorView.ui.xml   |   101 -
 .../dataset/editor/sql/SQLDataSetEditor.java       |   112 -
 .../editor/workflow/DataSetEditorWorkflow.java     |   275 -
 .../workflow/DataSetEditorWorkflowFactory.java     |   138 -
 .../editor/workflow/DataSetEditorWorkflowView.java |    87 -
 .../workflow/DataSetEditorWorkflowView.ui.xml      |    25 -
 .../create/BeanDataSetBasicAttributesWorkflow.java |    64 -
 .../create/CSVDataSetBasicAttributesWorkflow.java  |    87 -
 .../create/DataSetBasicAttributesWorkflow.java     |   139 -
 .../create/DataSetProviderTypeWorkflow.java        |   120 -
 .../ExternalDataSetBasicAttributesWorkflow.java    |    78 -
 .../KafkaDataSetBasicAttributesWorkflow.java       |    76 -
 .../PrometheusDataSetBasicAttributesWorkflow.java  |    76 -
 .../RemoteDataSetBasicAttributesWorkflow.java      |   132 -
 .../create/SQLDataSetBasicAttributesWorkflow.java  |    88 -
 .../workflow/edit/BeanDataSetEditWorkflow.java     |    63 -
 .../workflow/edit/CSVDataSetEditWorkflow.java      |    86 -
 .../editor/workflow/edit/DataSetEditWorkflow.java  |   156 -
 .../workflow/edit/ExternalDataSetEditWorkflow.java |    75 -
 .../workflow/edit/KafkaDataSetEditWorkflow.java    |    75 -
 .../edit/PrometheusDataSetEditWorkflow.java        |    75 -
 .../workflow/edit/RemoteDataSetEditWorkflow.java   |   135 -
 .../workflow/edit/SQLDataSetEditWorkflow.java      |    92 -
 .../widgets/dataset/event/CancelRequestEvent.java  |    21 -
 .../widgets/dataset/event/ColumnsChangedEvent.java |    31 -
 .../event/DataSetDefCreationRequestEvent.java      |    44 -
 .../widgets/dataset/event/EditDataSetEvent.java    |    28 -
 .../client/widgets/dataset/event/ErrorEvent.java   |    55 -
 .../widgets/dataset/event/FilterChangedEvent.java  |    35 -
 .../widgets/dataset/event/SaveRequestEvent.java    |    21 -
 .../widgets/dataset/event/TabChangedEvent.java     |    28 -
 .../dataset/event/TestDataSetRequestEvent.java     |    21 -
 .../widgets/dataset/explorer/DataSetExplorer.java  |   194 -
 .../dataset/explorer/DataSetExplorerView.java      |    78 -
 .../dataset/explorer/DataSetExplorerView.ui.xml    |    42 -
 .../widgets/dataset/explorer/DataSetPanel.java     |   201 -
 .../widgets/dataset/explorer/DataSetPanelView.java |   149 -
 .../dataset/explorer/DataSetPanelView.ui.xml       |    51 -
 .../widgets/dataset/explorer/DataSetSummary.java   |   192 -
 .../dataset/explorer/DataSetSummaryView.java       |   134 -
 .../dataset/explorer/DataSetSummaryView.ui.xml     |    67 -
 .../resources/i18n/DataSetEditorConstants.java     |   197 -
 .../resources/i18n/DataSetExplorerConstants.java   |    58 -
 .../main/resources/META-INF/ErraiApp.properties    |    17 -
 .../src/main/resources/META-INF/beans.xml          |     6 -
 .../org/dashbuilder/CommonWidgets.gwt.xml          |    23 -
 .../i18n/DataSetEditorConstants.properties         |   165 -
 .../i18n/DataSetEditorConstants_de.properties      |   104 -
 .../i18n/DataSetEditorConstants_es.properties      |   119 -
 .../i18n/DataSetEditorConstants_fr.properties      |   119 -
 .../i18n/DataSetEditorConstants_ja.properties      |   119 -
 .../i18n/DataSetEditorConstants_pt_BR.properties   |   104 -
 .../i18n/DataSetEditorConstants_zh_CN.properties   |   104 -
 .../i18n/DataSetExplorerConstants.properties       |    28 -
 .../i18n/DataSetExplorerConstants_de.properties    |    25 -
 .../i18n/DataSetExplorerConstants_es.properties    |    25 -
 .../i18n/DataSetExplorerConstants_fr.properties    |    25 -
 .../i18n/DataSetExplorerConstants_ja.properties    |    25 -
 .../i18n/DataSetExplorerConstants_pt_BR.properties |    25 -
 .../i18n/DataSetExplorerConstants_zh_CN.properties |    25 -
 .../ClientRuntimeErrorPopupPresenterTest.java      |    45 -
 .../widgets/common/CustomDataSetProviderType.java  |    50 -
 .../editor/DataSetDefColumnsFilterEditorTest.java  |   132 -
 .../dataset/editor/DataSetDefFilterEditorTest.java |    81 -
 .../dataset/editor/DataSetDefPreviewTableTest.java |   148 -
 .../editor/DataSetDefProviderTypeEditorTest.java   |   102 -
 .../widgets/dataset/editor/DataSetEditorTest.java  |   380 -
 ...DataSetDefBackendCacheAttributesEditorTest.java |   150 -
 .../DataSetDefBasicAttributesEditorTest.java       |    49 -
 .../DataSetDefClientCacheAttributesEditorTest.java |   150 -
 .../DataSetDefRefreshAttributesEditorTest.java     |   117 -
 .../DataSetDefRefreshIntervalEditorTest.java       |   132 -
 .../bean/BeanDataSetDefAttributesEditorTest.java   |    51 -
 .../dataset/editor/bean/BeanDataSetEditorTest.java |    70 -
 .../editor/column/ColumnListEditorTest.java        |   428 -
 .../editor/column/ColumnTypeEditorTest.java        |   113 -
 .../editor/column/DataColumnDefEditorTest.java     |   101 -
 .../editor/column/DataSetDefColumnsEditorTest.java |   120 -
 .../csv/CSVDataSetDefAttributesEditorTest.java     |   166 -
 .../dataset/editor/csv/CSVDataSetEditorTest.java   |    87 -
 .../sql/SQLDataSetDefAttributesEditorTest.java     |   128 -
 .../dataset/editor/sql/SQLDataSetEditorTest.java   |    72 -
 .../workflow/AbstractDataSetWorkflowTest.java      |    59 -
 .../editor/workflow/DataSetEditorWorkflowTest.java |   302 -
 .../BeanDataSetBasicAttributesWorkflowTest.java    |    89 -
 .../CSVDataSetBasicAttributesWorkflowTest.java     |   125 -
 .../create/DataSetBasicAttributesWorkflowTest.java |   122 -
 .../create/DataSetProviderTypeWorkflowTest.java    |   115 -
 .../SQLDataSetBasicAttributesWorkflowTest.java     |   124 -
 .../workflow/edit/BeanDataSetEditWorkflowTest.java |    83 -
 .../workflow/edit/CSVDataSetEditWorkflowTest.java  |   123 -
 .../workflow/edit/DataSetEditWorkflowTest.java     |   213 -
 .../workflow/edit/SQLDataSetEditWorkflowTest.java  |   123 -
 .../dataset/explorer/DataSetExplorerTest.java      |   231 -
 .../widgets/dataset/explorer/DataSetPanelTest.java |   152 -
 .../dataset/explorer/DataSetSummaryTest.java       |   160 -
 packages/dashbuilder/dashbuilder-client/pom.xml    |     4 -
 .../dashbuilder-project-storage/pom.xml            |    28 -
 .../project/storage/ProjectStorageServices.java    |    84 -
 .../project/storage/annotations/ProjectUpdate.java |    32 -
 .../project/storage/event/ProjectUpdated.java      |    25 -
 .../storage/impl/ProjectStorageServicesImpl.java   |   330 -
 .../impl/ProjectStorageUpdateInterceptor.java      |    42 -
 .../src/main/resources/META-INF/beans.xml          |     6 -
 .../storage/ProjectStorageServicesTest.java        |    37 -
 .../impl/ProjectStorageServicesImplTest.java       |   223 -
 ...g.uberfire.java.nio.file.spi.FileSystemProvider |    18 -
 .../src/test/resources/empty.zip                   |   Bin 22 -> 0 bytes
 .../src/test/resources/import.zip                  |   Bin 23387 -> 0 bytes
 .../dashbuilder-runtime-app/README.md              |    30 -
 .../dashbuilder-runtime-app/pom.xml                |   499 -
 .../src/main/docker/Dockerfile.fast-jar            |    54 -
 .../src/main/docker/Dockerfile.jvm                 |    51 -
 .../src/main/docker/Dockerfile.native              |    27 -
 .../backend/DataSetContentListener.java            |   165 -
 .../backend/ExternalComponentsContentListener.java |    55 -
 .../dashbuilder/backend/RuntimeModelLoader.java    |   101 -
 .../backend/RuntimeModelWatcherServiceManager.java |   169 -
 .../org/dashbuilder/backend/RuntimeOptions.java    |   239 -
 .../dashbuilder/backend/ServerSideProducers.java   |    35 -
 .../backend/channel/RuntimeChannel.java            |    94 -
 .../dashbuilder/backend/health/HealthService.java  |    51 -
 .../backend/helper/PartitionHelper.java            |    40 -
 .../backend/model/RuntimeModelFileInfo.java        |    41 -
 .../navigation/RuntimeNavigationBuilder.java       |   188 -
 .../remote/services/RuntimeModelServiceImpl.java   |   128 -
 .../resources/ComponentFunctionResource.java       |    62 -
 .../backend/resources/DataSetResource.java         |    91 -
 .../backend/resources/FileUploadModel.java         |    38 -
 .../backend/resources/RuntimeJaxApp.java           |    25 -
 .../backend/resources/RuntimeModelResource.java    |    59 -
 .../backend/resources/UploadResourceImpl.java      |   156 -
 .../resources/api/DashbuilderRuntimeResource.java  |    96 -
 .../resources/marshalling/DataSetLookupReader.java |    57 -
 .../resources/marshalling/DataSetMetadaWriter.java |    60 -
 .../resources/marshalling/DataSetWriter.java       |    62 -
 .../resources/marshalling/RuntimeModelWriter.java  |    56 -
 .../marshalling/RuntimeServiceResponseWriter.java  |    56 -
 .../backend/services/RuntimeInfoService.java       |    45 -
 .../services/dataset/DataSetServicesProducer.java  |   126 -
 .../services/dataset/RuntimeCSVFileStorage.java    |    78 -
 .../provider/RuntimeBeanDataSetProvider.java       |    78 -
 .../provider/RuntimeDataSetProviderRegistry.java   |    89 -
 .../provider/RuntimeSQLDataSourceLocator.java      |    61 -
 .../services/dataset/sql/SQLDataSourceLoader.java  |    98 -
 .../services/impl/ExternalImportServiceImpl.java   |   117 -
 .../services/impl/ImportValidationServiceImpl.java |    69 -
 .../services/impl/RuntimeInfoServiceImpl.java      |    59 -
 .../services/impl/RuntimeModelParserImpl.java      |   270 -
 .../services/impl/RuntimeModelRegistryImpl.java    |   197 -
 .../src/main/resources/META-INF/web.xml            |    22 -
 .../src/main/resources/application.properties      |     3 -
 .../backend/DataSetContentListenerTest.java        |    96 -
 .../backend/RuntimeModelLoaderTest.java            |   129 -
 .../backend/helper/PartitionHelperTest.java        |    43 -
 .../navigation/RuntimeNavigationBuilderTest.java   |   182 -
 .../provider/RuntimeSQLDataSourceLocatorTest.java  |    94 -
 .../impl/ImportValidationServiceImplTest.java      |    46 -
 .../services/impl/RuntimeInfoServiceImplTest.java  |    92 -
 .../services/impl/RuntimeModelParserImplTest.java  |   222 -
 .../impl/RuntimeModelRegistryImplTest.java         |   284 -
 .../src/test/resources/ds.csv                      |   193 -
 .../src/test/resources/ds.dset                     |    29 -
 .../src/test/resources/empty.zip                   |   Bin 22 -> 0 bytes
 .../src/test/resources/not_valid.zip               |   Bin 878 -> 0 bytes
 .../src/test/resources/valid_import.zip            |   Bin 6753 -> 0 bytes
 .../dashbuilder-runtime-client/pom.xml             |    60 -
 .../dashbuilder/client/RuntimeClientLoader.java    |   178 +-
 .../org/dashbuilder/client/RuntimeEntryPoint.java  |     7 +-
 .../client/RuntimeModelBackendAppLoader.java       |   138 -
 .../client/RuntimeModelContentListener.java        |     2 +-
 .../client/channel/RuntimeChannelClient.java       |    64 -
 .../org/dashbuilder/client/external/CSVParser.java |    96 +-
 .../external/ExternalDataSetClientProvider.java    |     7 +-
 .../dashbuilder/client/external/MetricsParser.java |    10 +-
 .../client/external/SupportedMimeType.java         |     6 +-
 .../ClientDataSetMetadataJSONMarshaller.java       |    16 +-
 .../org/dashbuilder/client/navbar/AppNavBar.java   |    49 -
 .../client/navbar/GoToDashboardMenuBuilder.java    |    62 -
 .../client/navbar/MenuBuilderHelper.java           |    54 -
 .../dashbuilder/client/navbar/NavBarHelper.java    |   114 -
 .../dashbuilder/client/navbar/RuntimeNavBrand.java |    41 -
 .../perspective/ContentErrorPerspective.java       |     6 +-
 .../perspective/DashboardsListPerspective.java     |     4 +-
 .../client/perspective/EmptyPerspective.java       |     4 +-
 .../client/perspective/NotFoundPerspective.java    |     6 +-
 .../client/perspective/RouterPerspective.java      |     7 +-
 .../client/perspective/RuntimePerspective.java     |     6 +-
 .../client/perspective/SamplesPerspective.java     |     4 +-
 .../RuntimePerspectiveEditorActivity.java          |     4 +-
 .../plugins/RuntimePerspectivePluginManager.java   |    47 +-
 .../dashbuilder/client/screens/RouterScreen.java   |    13 +-
 .../dashbuilder/client/screens/RuntimeScreen.java  |     7 -
 .../RuntimeBackendComponentFunctionService.java    |   104 -
 .../services/RuntimeDataSetClientServices.java     |    11 -
 .../dummy/RuntimeRendererSettingsService.java      |    41 -
 .../client/setup/RuntimeClientMode.java            |    10 +-
 .../client/setup/RuntimeClientSetup.java           |     6 +-
 .../main/resources/META-INF/ErraiApp.properties    |     7 -
 .../org/dashbuilder/DashbuilderRuntime.gwt.xml     |     2 -
 .../src/main/webapp/setup.js                       |     5 +-
 .../client/RuntimeClientLoaderTest.java            |   176 -
 .../dashbuilder/client/external/CSVParserTest.java |   105 +-
 .../client/screens/RouterScreenTest.java           |     4 -
 .../java/org/dashbuilder/shared/event/SSEType.java |    27 -
 .../marshalling/LayoutTemplateJSONMarshaller.java  |    19 +-
 .../dashbuilder/shared/model/DashboardInfo.java    |    44 -
 .../shared/model/DashbuilderRuntimeInfo.java       |    51 -
 .../shared/model/ImportDefinitions.java            |    41 -
 .../shared/service/ExternalImportService.java      |    38 -
 .../shared/service/ImportValidationService.java    |    35 -
 .../shared/service/RuntimeModelParser.java         |    38 -
 .../shared/service/RuntimeModelRegistry.java       |   104 -
 .../shared/service/RuntimeModelService.java        |    51 -
 .../shared/service/RuntimeModelRegistryTest.java   |   117 -
 .../dashbuilder/dashbuilder-runtime-parent/pom.xml |     1 -
 .../org/dashbuilder/displayer/ColumnSettings.java  |     2 +-
 .../displayer/DisplayerAttributeDef.java           |   161 +-
 .../external/ExternalComponentMessageHelper.java   |    70 -
 .../displayer/external/FunctionCallRequest.java    |    33 -
 .../displayer/external/FunctionResponse.java       |    44 -
 .../displayer/external/FunctionResultType.java     |    37 -
 .../impl/AbstractDisplayerSettingsBuilder.java     |     9 +-
 .../json/DisplayerSettingsJSONMarshaller.java      |    11 +-
 .../org/dashbuilder/renderer/RendererSettings.java |    47 -
 .../ExternalComponentMessageHelperTest.java        |    13 -
 .../dashbuilder-shared/dashbuilder-dsl/pom.xml     |    72 -
 .../component/AbstractComponentBuilder.java        |    49 -
 .../component/AllProcessesHeatmapBuilder.java      |    35 -
 .../dsl/factory/component/ComponentFactory.java    |    75 -
 .../dsl/factory/component/DisplayerBuilder.java    |    55 -
 .../component/ExternalComponentBuilder.java        |    48 -
 .../component/ExternalDisplayerBuilder.java        |    38 -
 .../factory/component/HtmlComponentBuilder.java    |    38 -
 .../dsl/factory/component/LogoBuilder.java         |    50 -
 .../factory/component/ProcessHeatmapBuilder.java   |    41 -
 .../dsl/factory/dashboard/DashboardBuilder.java    |    67 -
 .../dsl/factory/dashboard/DashboardFactory.java    |    76 -
 .../dsl/factory/navigation/NavigationBuilder.java  |    45 -
 .../dsl/factory/navigation/NavigationFactory.java  |    47 -
 .../factory/navigation/NavigationGroupBuilder.java |    61 -
 .../factory/navigation/NavigationItemBuilder.java  |    50 -
 .../dsl/factory/page/AbstractLayoutBuilder.java    |    36 -
 .../dsl/factory/page/ColumnBuilder.java            |    74 -
 .../dashbuilder/dsl/factory/page/PageBuilder.java  |    66 -
 .../dashbuilder/dsl/factory/page/PageFactory.java  |   125 -
 .../dashbuilder/dsl/factory/page/RowBuilder.java   |    69 -
 .../dashbuilder/dsl/helper/ComponentsHelper.java   |   115 -
 .../java/org/dashbuilder/dsl/model/Column.java     |    36 -
 .../java/org/dashbuilder/dsl/model/Component.java  |    36 -
 .../java/org/dashbuilder/dsl/model/Dashboard.java  |    58 -
 .../java/org/dashbuilder/dsl/model/Navigation.java |    36 -
 .../org/dashbuilder/dsl/model/NavigationGroup.java |    37 -
 .../org/dashbuilder/dsl/model/NavigationItem.java  |    36 -
 .../main/java/org/dashbuilder/dsl/model/Page.java  |    36 -
 .../main/java/org/dashbuilder/dsl/model/Row.java   |    36 -
 .../dsl/serialization/DashboardExporter.java       |   117 -
 .../dsl/serialization/DashboardSerializer.java     |    42 -
 .../serialization/impl/DashboardZipSerializer.java |   279 -
 .../impl/InternalDataSetProviderRegistry.java      |    70 -
 .../dsl/validation/DashboardValidator.java         |    37 -
 .../dsl/validation/DashboardValidatorImpl.java     |   212 -
 .../dsl/validation/ValidationResult.java           |    60 -
 .../factory/component/ComponentFactoryTest.java    |    73 -
 .../factory/component/DisplayerBuilderTest.java    |    67 -
 .../dsl/factory/page/ComponentBuilderTest.java     |    43 -
 .../dsl/factory/page/PageBuilderTest.java          |    50 -
 .../dsl/factory/page/RowBuilderTest.java           |    45 -
 .../dsl/serialization/DashboardExporterTest.java   |    36 -
 .../impl/DashboardZipSerializerTest.java           |   150 -
 .../dsl/validation/DashboardValidatorImplTest.java |   151 -
 .../src/test/resources/components/comp1/index.html |    16 -
 .../src/test/resources/components/comp1/index.js   |    18 -
 .../test/resources/components/comp1/manifest.json  |     3 -
 .../resources/data/un_world_pop_medium_variant.csv |   152 -
 .../dashbuilder-kie-server-api/pom.xml             |    46 -
 .../kieserver/ConsoleDataSetLookup.java            |    54 -
 .../kieserver/KieServerConnectionInfo.java         |    69 -
 .../kieserver/KieServerConnectionInfoProvider.java |    35 -
 .../dashbuilder/kieserver/RemoteDataSetDef.java    |   138 -
 .../kieserver/RemoteDataSetDefValidation.java      |    20 -
 .../kieserver/RemoteDefJSONMarshaller.java         |    81 -
 .../RuntimeKieServerDataSetProviderType.java       |    62 -
 .../main/resources/META-INF/ErraiApp.properties    |    17 -
 .../dashbuilder/DashbuilderKieServerAPI.gwt.xml    |    18 -
 .../dashbuilder-navigation-api/pom.xml             |     5 -
 .../event/PerspectivePluginsChangedEvent.java      |    23 -
 .../navigation/service/NavigationServices.java     |    30 -
 .../service/PerspectivePluginServices.java         |    45 -
 .../navigation/workbench/NavWorkbenchCtx.java      |     4 +-
 .../dashbuilder-services-api/pom.xml               |     5 -
 .../dataset/service/DataSetDefVfsServices.java     |    35 -
 .../dataset/service/DataSetExportServices.java     |    55 -
 .../dataset/service/SQLProviderServices.java       |    33 -
 .../service/BackendComponentFunctionService.java   |    34 -
 .../external/service/ComponentAssetProvider.java   |    25 -
 .../external/service/ComponentLoader.java          |    44 -
 .../external/service/ComponentService.java         |    36 -
 .../dashbuilder/perspectives/PerspectiveIds.java   |    31 -
 .../renderer/service/RendererSettingsService.java  |    19 -
 .../transfer/DataTransferExportModel.java          |    86 -
 .../dashbuilder/transfer/DataTransferServices.java |    43 -
 .../java/org/dashbuilder/transfer/ExportInfo.java  |    60 -
 .../transfer/ExportModelValidationService.java     |    40 -
 .../dashbuilder-validations/README.md              |    13 -
 .../dashbuilder-validations/pom.xml                |    99 -
 .../validations/DataSetDefValidator.java           |    54 -
 .../validations/DataSetValidatorProvider.java      |    93 -
 .../dataset/AbstractDataSetDefValidator.java       |    87 -
 .../dataset/BeanDataSetDefValidator.java           |    68 -
 .../dataset/CSVDataSetDefValidator.java            |    69 -
 .../dataset/ExternalDataSetDefValidator.java       |    63 -
 .../dataset/KafkaDataSetDefValidator.java          |    63 -
 .../dataset/PrometheusDataSetDefValidator.java     |    59 -
 .../dataset/RemoteDataSetDefValidator.java         |    76 -
 .../dataset/SQLDataSetDefValidator.java            |    76 -
 .../main/resources/META-INF/ErraiApp.properties    |    19 -
 .../src/main/resources/META-INF/beans.xml          |     6 -
 .../org/dashbuilder/CommonValidations.gwt.xml      |    33 -
 .../dataset/AbstractValidationTest.java            |    47 -
 .../dataset/BeanDataSetDefValidatorTest.java       |    97 -
 .../dataset/CSVDataSetDefValidatorTest.java        |   132 -
 .../dataset/KafkaDataSetDefValidatorTest.java      |    47 -
 .../dataset/PrometheusDataSetDefValidatorTest.java |    47 -
 .../dataset/SQLDataSetDefValidatorTest.java        |   132 -
 packages/dashbuilder/dashbuilder-shared/pom.xml    |     3 -
 .../dashbuilder/dataprovider/BeanProviderType.java |    41 -
 .../dashbuilder/dataprovider/CSVProviderType.java  |    41 -
 .../dataprovider/DataSetProviderType.java          |    10 -
 .../dataprovider/KafkaProviderType.java            |    41 -
 .../dataprovider/PrometheusProviderType.java       |    41 -
 .../dashbuilder/dataprovider/SQLProviderType.java  |    41 -
 .../org/dashbuilder/dataset/DataSetFactory.java    |    44 +-
 .../dashbuilder/dataset/def/BeanDataSetDef.java    |   113 -
 .../dataset/def/BeanDataSetDefBuilder.java         |    46 -
 .../org/dashbuilder/dataset/def/CSVDataSetDef.java |   228 -
 .../dataset/def/CSVDataSetDefBuilder.java          |   120 -
 .../dashbuilder/dataset/def/DataSetDefFactory.java |    32 +-
 .../dashbuilder/dataset/def/KafkaDataSetDef.java   |   207 -
 .../dataset/def/KafkaDataSetDefBuilder.java        |    96 -
 .../dataset/def/PrometheusDataSetDef.java          |   134 -
 .../dataset/def/PrometheusDataSetDefBuilder.java   |    48 -
 .../org/dashbuilder/dataset/def/SQLDataSetDef.java |   176 -
 .../dataset/def/SQLDataSetDefBuilder.java          |    70 -
 .../dashbuilder/dataset/def/SQLDataSourceDef.java  |    50 -
 .../dataset/impl/BeanDataSetDefBuilderImpl.java    |    37 -
 .../dataset/impl/CSVDataSetDefBuilderImpl.java     |    79 -
 .../dataset/impl/KafkaDataSetDefBuilderImpl.java   |    78 -
 .../impl/PrometheusDataSetDefBuilderImpl.java      |    41 -
 .../dataset/impl/SQLDataSetDefBuilderImpl.java     |    54 -
 .../dataset/json/BeanDefJSONMarshaller.java        |    87 -
 .../dataset/json/CSVDefJSONMarshaller.java         |   108 -
 .../dataset/json/DataSetDefJSONMarshaller.java     |    61 +-
 .../dataset/json/ExternalDataSetJSONParser.java    |     7 +-
 .../dataset/json/KafkaDefJSONMarshaller.java       |    63 -
 .../dataset/json/PrometheusDefJSONMarshaller.java  |    62 -
 .../dataset/json/SQLDefJSONMarshaller.java         |    75 -
 .../groups/BeanDataSetDefValidation.java           |     7 -
 .../groups/CSVDataSetDefFilePathValidation.java    |     7 -
 .../groups/CSVDataSetDefFileURLValidation.java     |     7 -
 .../validation/groups/CSVDataSetDefValidation.java |     7 -
 .../groups/KafkaDataSetDefValidation.java          |    22 -
 .../groups/PrometheusDataSetDefValidation.java     |    22 -
 .../groups/SQLDataSetDefDbSQLValidation.java       |     7 -
 .../groups/SQLDataSetDefDbTableValidation.java     |     7 -
 .../validation/groups/SQLDataSetDefValidation.java |     7 -
 .../main/resources/META-INF/ErraiApp.properties    |    11 -
 .../org/dashbuilder/dataset/DataSetDefTest.java    |    56 -
 .../dataset/json/DataSetDefJsonTest.java           |   189 +-
 .../json/DataSetMetadataJSONMarshallerTest.java    |   115 -
 .../src/main/java/org/dashbuilder/DataSetCore.java |     5 -
 .../main/java/org/dashbuilder/DataSetCoreImpl.java |    15 -
 .../dataprovider/BeanDataSetProvider.java          |   135 -
 .../dashbuilder/dataset/DataSetDefDeployer.java    |    39 +-
 .../dataprovider/BeanDataSetGeneratorTest.java     |   128 -
 .../dataset/DataSetDefDeployerTest.java            |    70 -
 .../dataset/DataSetDefRegistryTest.java            |    27 -
 .../kie-soup-dataset/kie-soup-dataset-csv/pom.xml  |    81 -
 .../dataprovider/csv/CSVDataSetProvider.java       |   146 -
 .../dataprovider/csv/CSVFileStorage.java           |    52 -
 .../dashbuilder/dataprovider/csv/CSVParser.java    |   225 -
 .../backend/csv/CSVDataSetBasicTest.java           |   108 -
 .../backend/csv/CSVDataSetDefJSONTest.java         |    75 -
 .../dataprovider/csv/CSVParserTest.java            |    99 -
 .../src/test/resources/expenseReports.csv          |    51 -
 .../src/test/resources/expenseReports.dset         |    21 -
 .../src/test/resources/expenseReports_trimmed.dset |    20 -
 .../src/test/resources/worldPopulation.csv         |   126 -
 .../src/test/resources/worldPopulation.dset        |    13 -
 .../kie-soup-dataset-kafka/pom.xml                 |    71 -
 .../dataprovider/kafka/KafkaDataSetProvider.java   |   198 -
 .../dataprovider/kafka/KafkaMetricsProvider.java   |    99 -
 .../kafka/mbean/JMXRMIConnectorProvider.java       |    37 -
 .../dataprovider/kafka/mbean/MBeanDefinitions.java |    43 -
 .../dataprovider/kafka/mbean/MBeanNameFactory.java |    56 -
 .../kafka/mbean/MBeanServerConnectionProvider.java |    65 -
 .../kafka/mbean/ObjectNameBuilder.java             |   129 -
 .../kafka/mbean/ObjectNamePrototype.java           |    61 -
 .../kafka/metrics/KafkaMetricCollector.java        |    34 -
 .../kafka/metrics/MBeanMetricCollector.java        |   133 -
 .../kafka/metrics/group/BrokerMetricsGroup.java    |   120 -
 .../kafka/metrics/group/ConsumerMetricsGroup.java  |    71 -
 .../kafka/metrics/group/MetricsCollectorGroup.java |    42 -
 .../group/MetricsCollectorGroupFactory.java        |    51 -
 .../kafka/metrics/group/ProducerMetricsGroup.java  |    65 -
 .../dataprovider/kafka/model/KafkaMetric.java      |    69 -
 .../kafka/model/KafkaMetricsRequest.java           |   137 -
 .../kafka/KafkaDataSetProviderTest.java            |    91 -
 .../kafka/KafkaMetricsProviderTest.java            |    90 -
 .../kafka/mbean/ObjectNameBuilderTest.java         |   112 -
 .../kie-soup-dataset-prometheus/pom.xml            |    76 -
 .../prometheus/PrometheusDataSetProvider.java      |   161 -
 .../dataprovider/prometheus/client/HttpClient.java |    64 -
 .../prometheus/client/MetricHelper.java            |    42 -
 .../prometheus/client/PrometheusClient.java        |   115 -
 .../client/PrometheusCredentialProvider.java       |    45 -
 .../prometheus/client/QueryResponse.java           |    74 -
 .../prometheus/client/QueryResponseBuilder.java    |    73 -
 .../prometheus/client/QueryResponseParser.java     |   147 -
 .../dataprovider/prometheus/client/Result.java     |    58 -
 .../dataprovider/prometheus/client/ResultType.java |    29 -
 .../dataprovider/prometheus/client/Status.java     |    27 -
 .../dataprovider/prometheus/client/Value.java      |    52 -
 .../prometheus/PrometheusDataSetProviderTest.java  |   100 -
 .../prometheus/client/PrometheusClientTest.java    |    75 -
 .../prometheus/client/QueryResponseParserTest.java |   132 -
 .../kie-soup-dataset-sql-tests/README.md           |    19 -
 .../kie-soup-dataset-sql-tests/pom.xml             |   172 -
 .../test/filtered-resources/datasource.properties  |    18 -
 .../dataprovider/sql/SQLDatasetTestSettings.java   |   107 -
 .../dataprovider/sql/util/DataSourceFactory.java   |    99 -
 .../dataprovider/sql/util/DatabaseProvider.java    |    49 -
 .../sql/util/PoolingDataSourceFactory.java         |   172 -
 .../sql/util/PoolingDataSourceWrapper.java         |    25 -
 .../sql/util/PoolingDataSourceWrapperImpl.java     |   235 -
 ...shbuilder.dataprovider.sql.DatabaseTestSettings |     1 -
 .../src/test/resources/testdb-h2.properties        |     3 -
 .../kie-soup-dataset/kie-soup-dataset-sql/pom.xml  |   117 -
 .../dashbuilder/dataprovider/sql/JDBCUtils.java    |   345 -
 .../dataprovider/sql/ResultSetConsumer.java        |    31 -
 .../dataprovider/sql/ResultSetHandler.java         |    44 -
 .../dataprovider/sql/SQLDataSetProvider.java       |  1236 --
 .../dataprovider/sql/SQLDataSourceLocator.java     |    44 -
 .../dashbuilder/dataprovider/sql/SQLFactory.java   |    90 -
 .../dataprovider/sql/dialect/DB2Dialect.java       |    91 -
 .../dataprovider/sql/dialect/DefaultDialect.java   |  1013 --
 .../dataprovider/sql/dialect/Dialect.java          |   168 -
 .../dataprovider/sql/dialect/H2Dialect.java        |    20 -
 .../dataprovider/sql/dialect/MonetDBDialect.java   |    58 -
 .../dataprovider/sql/dialect/MySQLDialect.java     |    91 -
 .../dataprovider/sql/dialect/OracleDialect.java    |   115 -
 .../sql/dialect/OracleLegacyDialect.java           |    57 -
 .../dataprovider/sql/dialect/PostgresDialect.java  |    74 -
 .../dataprovider/sql/dialect/SQLServerDialect.java |   160 -
 .../dataprovider/sql/dialect/SybaseASEDialect.java |   116 -
 .../dashbuilder/dataprovider/sql/model/Column.java |   182 -
 .../dataprovider/sql/model/Condition.java          |    33 -
 .../dataprovider/sql/model/CoreCondition.java      |    43 -
 .../dataprovider/sql/model/CreateTable.java        |    71 -
 .../dashbuilder/dataprovider/sql/model/Delete.java |    69 -
 .../dataprovider/sql/model/DropTable.java          |    45 -
 .../dataprovider/sql/model/DynamicDateColumn.java  |    32 -
 .../dataprovider/sql/model/FixedDateColumn.java    |    32 -
 .../dataprovider/sql/model/FunctionColumn.java     |    45 -
 .../dashbuilder/dataprovider/sql/model/Insert.java |    67 -
 .../dataprovider/sql/model/LogicalCondition.java   |    44 -
 .../dataprovider/sql/model/SQLStatement.java       |    87 -
 .../dashbuilder/dataprovider/sql/model/Select.java |   200 -
 .../dataprovider/sql/model/SimpleColumn.java       |    42 -
 .../dataprovider/sql/model/SortColumn.java         |    38 -
 .../dashbuilder/dataprovider/sql/model/Table.java  |    47 -
 .../dataprovider/sql/DatabaseTestSettings.java     |   141 -
 .../sql/DatabaseTestSettingsProvider.java          |    36 -
 .../dataprovider/sql/JDBCUtilsTest.java            |   158 -
 .../dataprovider/sql/SQLCloseResourcesTest.java    |    97 -
 .../dataprovider/sql/SQLColumnsTypeTest.java       |   112 -
 .../dataprovider/sql/SQLDataSetCacheTest.java      |    80 -
 .../dataprovider/sql/SQLDataSetDefTest.java        |   209 -
 .../sql/SQLDataSetMetadataLimitTest.java           |   208 -
 .../dataprovider/sql/SQLDataSetMetadataTest.java   |   111 -
 .../dataprovider/sql/SQLDataSetTestBase.java       |   159 -
 .../dataprovider/sql/SQLDataSetTrimTest.java       |   136 -
 .../dataprovider/sql/SQLInjectionAttacksTest.java  |   100 -
 .../sql/SQLQueryDataSetLookupTest.java             |    24 -
 .../sql/SQLTableDataSetLookupTest.java             |   338 -
 .../dataprovider/sql/SQLTableGroupByTest.java      |    84 -
 .../dashbuilder/dataprovider/sql/SQLTestSuite.java |    49 -
 .../dataprovider/sql/SelectStatementTest.java      |    70 -
 .../src/test/resources/expenseReports.dset         |    19 -
 .../test/resources/expenseReports_allcolumns.dset  |     7 -
 .../test/resources/expenseReports_columnalias.dset |     7 -
 .../test/resources/expenseReports_columnset.dset   |    13 -
 .../test/resources/expenseReports_filtered.dset    |    17 -
 .../test/resources/expenseReports_noncached.dset   |     7 -
 .../src/test/resources/expenseReports_query.dset   |    19 -
 .../src/test/resources/expenseReports_sql.dset     |     7 -
 .../src/test/resources/expenseReports_static.dset  |     8 -
 .../src/test/resources/expense_reports_ddl.sql     |    61 -
 .../src/test/resources/testdb-h2mem.properties     |     1 -
 packages/dashbuilder/kie-soup-dataset/pom.xml      |     5 -
 packages/dashbuilder/package.json                  |     9 +-
 packages/dashbuilder/pom.xml                       |     5 +-
 .../dmn-dev-deployment-base-image-env/env/index.js |    11 +-
 .../dmn-dev-deployment-base-image/Containerfile    |     7 +-
 packages/dmn-dev-deployment-base-image/README.md   |    77 +
 .../dmn-dev-deployment-base-image/env/index.js     |    15 +-
 .../dmn-dev-deployment-base-image/package.json     |    16 +-
 .../scripts/createTestImage.js                     |   317 +
 .../dmn-dev-deployment-form-webapp/package.json    |     1 +
 .../src/DmnDevDeploymentFormWebAppDataApi.tsx      |     4 +-
 .../src/DmnDevDeploymentRuntimeApi.tsx             |     2 +-
 .../src/DmnFormPage.tsx                            |     6 +-
 .../dmn-dev-deployment-form-webapp/src/Routes.tsx  |    10 +-
 .../static/index.html                              |     2 +-
 .../webpack.config.js                              |     1 -
 packages/dmn-language-service/src/index.ts         |     4 +-
 .../src/embedded/embedded/EmbeddedEditor.tsx       |    22 +-
 .../tests/embedded/stateControl/Hooks.test.ts      |     1 +
 packages/eslint/eslint.js                          |    13 +-
 packages/extended-services-api/env/index.js        |    24 +
 packages/extended-services-api/jest.config.js      |    34 +
 packages/extended-services-api/package.json        |    42 +
 packages/extended-services-api/src/dmnResult.ts    |    49 +
 packages/extended-services-api/src/index.ts        |    19 +
 packages/extended-services-api/src/jsonSchema.ts   |    54 +
 packages/extended-services-api/src/payload.ts      |    26 +
 packages/extended-services-api/src/validate.ts     |    27 +
 packages/extended-services-api/tsconfig.json       |    12 +
 packages/extended-services/pkg/server.go           |     2 +
 .../showcase/static/index.html                     |     8 +-
 packages/feel-input-component/src/FeelConfigs.ts   |   228 +
 packages/feel-input-component/src/FeelInput.tsx    |   189 +
 .../src/FeelInput/FeelInput.tsx                    |    92 -
 .../feel-input-component/src/FeelInput/index.ts    |    17 -
 .../feel-input-component/src/Monaco/FeelConfigs.ts |   167 -
 .../src/Monaco/FeelEditorService.ts                |   187 -
 .../src/Monaco/FeelInitializer.ts                  |    64 -
 packages/feel-input-component/src/Monaco/index.ts  |    19 -
 packages/feel-input-component/src/index.tsx        |     2 +-
 .../tests/FeelInput/FeelInput.test.tsx             |    45 -
 .../__snapshots__/FeelInput.test.tsx.snap          |    23 -
 .../tests/Monaco/FeelConfigs.test.ts               |   103 -
 .../tests/Monaco/FeelEditorService.test.ts         |   103 -
 .../tests/Monaco/FeelInitializer.test.ts           |    84 -
 .../tests/__mocks__/monacoMock.js                  |    57 -
 .../tests/__mocks__/styleMock.js                   |    17 -
 packages/form-dmn/package.json                     |     1 +
 packages/form-dmn/src/DmnForm.tsx                  |    47 +-
 packages/form-dmn/src/DmnFormResult.tsx            |    69 +-
 packages/form-dmn/src/DmnValidator.ts              |    12 +-
 .../form-dmn/src/uniforms/DmnAutoFieldProvider.tsx |     4 +-
 .../src/uniforms/DmnFormJsonSchemaBridge.ts        |    20 +-
 packages/form-dmn/tests/DmnForm.test.tsx           |     5 +-
 packages/form-dmn/tests/DmnFormResult.test.tsx     |    15 +-
 packages/form-dmn/tests/DmnValidator.test.ts       |    31 +-
 .../tests/__snapshots__/DmnForm.test.tsx.snap      |    21 +
 packages/form/src/FormComponent.tsx                |     6 +-
 packages/form/src/FormHook.tsx                     |   146 +-
 packages/form/src/uniforms/FormJsonSchemaBridge.ts |    12 -
 packages/git-cors-proxy-image/Containerfile        |     2 +-
 packages/git-cors-proxy-image/package.json         |     1 +
 packages/keyboard-shortcuts/src/channel/Hooks.tsx  |    83 -
 packages/keyboard-shortcuts/src/channel/index.ts   |    17 -
 .../tests/channel/Hooks.test.tsx                   |    91 -
 .../Containerfile                                  |     2 +-
 .../package.json                                   |     1 +
 packages/kie-sandbox-image/Containerfile           |     2 +-
 packages/kie-sandbox-image/Dockerfile              |     1 -
 packages/kie-sandbox-image/README.md               |    73 +-
 packages/kie-sandbox-image/package.json            |     2 +-
 packages/kn-plugin-workflow/go.mod                 |     6 +-
 packages/kn-plugin-workflow/go.sum                 |    17 +-
 .../kn-plugin-workflow/pkg/command/build_test.go   |     8 +-
 packages/kn-plugin-workflow/pkg/command/create.go  |    40 +-
 .../kn-plugin-workflow/pkg/command/create_test.go  |   100 +
 .../pkg/command/create_workflow.go                 |     6 +-
 .../pkg/command/create_workflow_test.go            |    41 +
 packages/kn-plugin-workflow/pkg/command/deploy.go  |    33 +-
 .../kn-plugin-workflow/pkg/command/deploy_test.go  |    96 +
 packages/kn-plugin-workflow/pkg/common/afero.go    |    24 +
 packages/kn-plugin-workflow/pkg/common/checks.go   |    20 +-
 .../kn-plugin-workflow/pkg/common/test_helper.go   |    44 +
 packages/{openshift => kubernetes-bridge}/LICENSE  |     0
 .../{openshift => kubernetes-bridge}/env/index.js  |     0
 .../jest.config.js                                 |     0
 packages/kubernetes-bridge/package.json            |    46 +
 .../src/fetch/FetchConstants.ts                    |     0
 .../src/fetch/ResourceFetch.ts                     |     0
 .../kubernetes-bridge/src/fetch/ResourceFetcher.ts |    71 +
 packages/kubernetes-bridge/src/fetch/index.ts      |    19 +
 packages/kubernetes-bridge/src/resources/common.ts |    94 +
 packages/kubernetes-bridge/src/resources/index.ts  |    20 +
 .../src/resources/knative/KafkaSource.ts           |   167 +
 .../src/resources/knative/KnativeService.ts        |   172 +
 .../kubernetes-bridge/src/resources/knative/api.ts |    30 +
 .../src/resources/knative/index.ts                 |    19 +
 .../src/resources/kubernetes/Deployment.ts         |   180 +
 .../src/resources/kubernetes/Ingress.ts            |   127 +
 .../src/resources/kubernetes/Namespace.ts          |    33 +
 .../src/resources/kubernetes/Secret.ts             |    85 +
 .../kubernetes/SelfSubjectAccessReview.ts          |    69 +
 .../src/resources/kubernetes/Service.ts            |   108 +
 .../src/resources/kubernetes/api.ts                |    23 +
 .../src/resources/kubernetes/index.ts              |    21 +
 .../src/resources/openshift/Build.ts               |    40 +
 .../src/resources/openshift/BuildConfig.ts         |   156 +
 .../src/resources/openshift/ImageStream.ts         |    96 +
 .../src/resources/openshift/Project.ts             |    32 +
 .../src/resources/openshift/Route.ts               |   132 +
 .../src/resources/openshift/api.ts                 |    29 +
 .../src/resources/openshift/index.ts               |    22 +
 .../src/service/KubernetesConnection.ts            |    51 +
 .../src/service/KubernetesService.ts               |   130 +
 .../src/service/OpenShiftConstants.ts              |     0
 .../src/service/OpenShiftService.ts                |   113 +
 packages/kubernetes-bridge/src/service/index.ts    |    20 +
 .../src/service/support/KnativeSupportService.ts   |    34 +
 .../kubernetes-bridge/src/service/support/index.ts |    17 +
 .../tests/jest.setup.ts                            |     0
 .../{openshift => kubernetes-bridge}/tsconfig.json |     0
 packages/online-editor/build/defaultEnvJson.ts     |    45 +-
 packages/online-editor/env/index.js                |     9 +-
 .../online-editor/it-tests/e2e/TrySample.cy.ts     |     4 +-
 packages/online-editor/package.json                |     6 +-
 packages/online-editor/src/App.tsx                 |     6 +-
 .../online-editor/src/accounts/AccountsContext.tsx |    22 +
 .../online-editor/src/accounts/AccountsIcon.tsx    |     9 +
 .../kubernetes/ConnectToKubernetesSection.tsx      |   160 +
 .../kubernetes/ConnectToKubernetesSimple.tsx       |   345 +
 .../ConnectToLocalKubernetesClusterWizard.tsx      |   687 +
 .../kubernetes/KubernetesInstanceStatus.tsx        |    22 +
 .../accounts/openshift/ConnecToOpenShiftSimple.tsx |    24 +-
 ...tToDeveloperSandboxForRedHatOpenShiftWizard.tsx |   101 +-
 .../openshift/ConnectToOpenShiftSection.tsx        |    14 +-
 .../src/authProviders/AuthProvidersApi.ts          |    14 +-
 .../src/authProviders/AuthProvidersGallery.tsx     |    10 +
 .../src/authSessions/AuthSessionApi.ts             |    14 +-
 .../src/authSessions/AuthSessionLabel.tsx          |     2 +-
 .../src/authSessions/AuthSessionSelect.tsx         |     5 +-
 .../src/authSessions/AuthSessionsContext.tsx       |    25 +-
 .../src/authSessions/AuthSessionsList.tsx          |    27 +-
 .../src/authSessions/CompatibleAuthSessions.ts     |    26 +
 .../DevDeploymentsConfirmDeleteModal.tsx           |     8 +-
 .../DevDeploymentsConfirmDeployModal.tsx           |     2 +-
 .../src/devDeployments/DevDeploymentsContext.tsx   |    12 +-
 .../DevDeploymentsContextProvider.tsx              |    61 +-
 .../DevDeploymentsDeployDropdownItems.tsx          |    25 +-
 .../src/devDeployments/DevDeploymentsDropdown.tsx  |    51 +-
 .../devDeployments/DevDeploymentsDropdownItem.tsx  |    14 +-
 .../services/KieSandboxKubernetesService.ts        |   319 +
 .../openshift/KieSandboxOpenShiftService.ts        |   175 +
 .../src/devDeployments/services/types.ts           |    43 +
 .../src/dmnRunner/DmnRunnerContext.tsx             |    68 +
 .../src/dmnRunner/DmnRunnerContextProvider.tsx     |   789 ++
 .../src/dmnRunner/DmnRunnerDockToggle.tsx          |    68 +
 .../src/dmnRunner/DmnRunnerDrawer.tsx              |    38 +
 .../src/dmnRunner/DmnRunnerDrawerPanelContent.tsx  |   380 +
 .../src/dmnRunner/DmnRunnerLoading.tsx             |    44 +
 .../DmnRunner => dmnRunner}/DmnRunnerStatus.ts     |     0
 .../online-editor/src/dmnRunner/DmnRunnerTable.css |    27 +
 .../online-editor/src/dmnRunner/DmnRunnerTable.tsx |   354 +
 .../online-editor/src/dmnRunner/DmnRunnerTypes.ts  |    68 +
 .../DmnRunnerInputsDispatchContext.tsx             |    33 -
 .../DmnRunnerInputsDispatchContextProvider.tsx     |    94 -
 .../src/dmnRunnerInputs/DmnRunnerInputsHook.tsx    |   161 -
 .../src/dmnRunnerInputs/DmnRunnerInputsService.tsx |    45 -
 .../DmnRunnerPersistenceDispatchContext.tsx        |    40 +
 ...DmnRunnerPersistenceDispatchContextProvider.tsx |   177 +
 .../DmnRunnerPersistenceHook.tsx                   |    82 +
 .../DmnRunnerPersistenceService.tsx                |    65 +
 .../DmnRunnerPersistenceTypes.ts                   |    64 +
 .../src/editor/DmnRunner/DmnRunnerContext.tsx      |    52 -
 .../src/editor/DmnRunner/DmnRunnerDockToggle.tsx   |    59 -
 .../src/editor/DmnRunner/DmnRunnerDrawer.tsx       |    45 -
 .../DmnRunner/DmnRunnerDrawerPanelContent.tsx      |   485 -
 .../src/editor/DmnRunner/DmnRunnerLoading.tsx      |    44 -
 .../src/editor/DmnRunner/DmnRunnerProvider.tsx     |   158 -
 .../src/editor/DmnRunner/DmnRunnerTable.tsx        |   383 -
 packages/online-editor/src/editor/EditorPage.tsx   |   117 +-
 .../src/editor/EditorPageDockContextProvider.tsx   |   234 +
 .../src/editor/EditorPageDockDrawer.tsx            |   189 +-
 .../src/editor/EditorPageDockToggleItem.tsx        |     9 +-
 .../KieSandboxExtendedServicesButtons.tsx          |    68 +-
 .../KieSandboxExtendedServicesDropdownGroup.tsx    |     9 +-
 .../NotificationsPanel/NotificationsPanel.tsx      |     2 +-
 .../NotificationsPanelDockToggle.tsx               |    34 +-
 .../NotificationsPanelTabContent.tsx               |   183 +-
 .../src/editor/Toolbar/EditorToolbar.tsx           |     3 -
 packages/online-editor/src/editor/Validation.tsx   |    37 +-
 packages/online-editor/src/env/EnvJson.ts          |     3 +
 .../envelopeLocator/EditorEnvelopeLocatorApi.ts    |    28 +
 .../EditorEnvelopeLocatorFactory.ts                |    41 +-
 .../hooks/EditorEnvelopeLocatorContext.tsx         |    16 +-
 packages/online-editor/src/home/HomePage.tsx       |    33 +-
 packages/online-editor/src/i18n/OnlineI18n.ts      |    62 +-
 packages/online-editor/src/i18n/locales/en.ts      |    69 +-
 .../KieSandboxExtendedServicesClient.ts            |    42 +-
 packages/online-editor/src/navigation/Routes.ts    |     7 +-
 .../src/openshift/KieSandboxOpenShiftService.ts    |   253 -
 .../src/pageTemplate/OnlineEditorPage.tsx          |    49 +-
 ...ontextProviderWithCustomCommitMessagesModal.tsx |     1 +
 .../src/workspace/worker/sharedWorker.ts           |    18 +-
 .../kie-sandbox-dev-deployments-resources.yaml     |   133 +
 .../static/kubernetes/kind-cluster-config.yaml     |    23 +
 packages/online-editor/static/resources/style.css  |    27 +-
 packages/online-editor/webpack.config.ts           |    27 +-
 packages/openshift/package.json                    |    41 -
 packages/openshift/src/api/ApiConstants.ts         |    58 -
 packages/openshift/src/api/knative/KafkaSource.ts  |    58 -
 .../openshift/src/api/knative/KnativeService.ts    |    94 -
 packages/openshift/src/api/kubernetes/Build.ts     |    29 -
 .../openshift/src/api/kubernetes/BuildConfig.ts    |    79 -
 .../openshift/src/api/kubernetes/Deployment.ts     |   100 -
 .../openshift/src/api/kubernetes/ImageStream.ts    |    55 -
 packages/openshift/src/api/kubernetes/Project.ts   |    29 -
 packages/openshift/src/api/kubernetes/Route.ts     |    71 -
 packages/openshift/src/api/kubernetes/Secret.ts    |    56 -
 packages/openshift/src/api/kubernetes/Service.ts   |    71 -
 packages/openshift/src/api/types.ts                |   300 -
 packages/openshift/src/fetch/ResourceFetcher.ts    |    64 -
 packages/openshift/src/service/KnativeService.ts   |    35 -
 .../openshift/src/service/KubernetesService.ts     |    74 -
 .../openshift/src/service/OpenShiftConnection.ts   |    44 -
 packages/openshift/src/service/OpenShiftService.ts |    73 -
 packages/openshift/src/service/types.ts            |    30 -
 .../openshift/src/template/ResourceTemplates.ts    |   314 -
 .../openshift/src/template/TemplateConstants.ts    |    45 -
 packages/openshift/src/template/types.ts           |    52 -
 .../it-tests/e2e/CreateNewFile.cy.ts               |     8 +-
 .../it-tests/e2e/Expression.cy.ts                  |    76 +
 .../it-tests/e2e/UploadFiles.cy.ts                 |     8 +-
 .../fixtures/expression/expression.sw.json         |    35 +
 .../fixtures/expression/expression.sw.yaml         |    22 +
 .../it-tests/support/commands.ts                   |    21 +
 packages/serverless-logic-web-tools/package.json   |     2 +-
 packages/serverless-logic-web-tools/src/App.tsx    |     6 +-
 .../EditorEnvelopeLocatorFactory.ts                |     6 +-
 .../KieSandboxExtendedServicesModal.tsx            |     2 +-
 .../src/openshift/OpenShiftContextProvider.tsx     |    10 +-
 .../src/openshift/OpenShiftPipeline.ts             |     2 +-
 .../deploy/strategies/KogitoProjectDeployment.ts   |     4 +-
 .../src/openshift/deploy/types.ts                  |     6 +-
 .../dropdown/OpenShiftDeploymentDropdownItem.tsx   |    15 +-
 .../src/openshift/hooks/useOpenApi.ts              |     4 +-
 .../openshift/pipelines/KnativeBuilderPipeline.ts  |    37 +-
 .../pipelines/KnativeDeploymentLoaderPipeline.ts   |    27 +-
 .../src/settings/SettingsContext.tsx               |     8 +-
 .../featurePreview/FeaturePreviewSettings.tsx      |     2 +-
 .../src/settings/openshift/OpenShiftSettings.tsx   |     4 +-
 .../settings/openshift/OpenShiftSettingsConfig.tsx |     8 +-
 .../openshift/OpenShiftSettingsSimpleConfig.tsx    |    27 +-
 .../editor/ServerlessWorkflowCombinedEditor.tsx    |    11 +-
 .../appformer-bom/pom.xml                          |    33 +-
 .../kie-wb-common-bom/pom.xml                      |     6 -
 .../client/widgets/editor/StunnerEditor.java       |    42 +-
 .../client/widgets/editor/StunnerEditorTest.java   |    28 +-
 .../definition/service/DefinitionSetService.java   |    47 -
 .../stunner/core/api/JsDefinitionManager.java      |   117 +
 .../core/definition/DefinitionSetProxy.java        |    26 -
 .../core/definition/DefinitionSetResourceType.java |    24 -
 .../adapter/AbstractDefinitionSetRuleAdapter.java  |    25 -
 .../adapter/DefinitionAdapterWrapper.java          |    92 -
 .../core/definition/adapter/DefinitionId.java      |     5 +
 .../adapter/DefinitionSetAdapterWrapper.java       |    81 -
 .../definition/adapter/PropertyAdapterWrapper.java |    62 -
 .../adapter/binding/DefinitionAdapterBindings.java |    20 -
 .../definition/jsadapter/EmptyJsMorhAdapter.java   |    59 +
 .../definition/jsadapter/JsDefinitionAdapter.java  |   142 +
 .../definition/jsadapter/JsDefinitionProperty.java |    36 +
 .../jsadapter/JsDefinitionSetAdapter.java          |   105 +
 .../definition/jsadapter/JsPropertyAdapter.java    |    69 +
 .../core/definition/jsadapter/JsRuleAdapter.java   |    61 +
 .../definition/property/PropertyMetaTypes.java     |    20 +-
 .../factory/definition/JsDefinitionFactory.java    |    37 +
 .../core/i18n/StunnerTranslationService.java       |     2 +
 .../core/rule/context/EdgeCardinalityContext.java  |     3 +
 .../stunner/core/rule/ext/RuleExtension.java       |     9 +-
 .../adapter/DefinitionAdapterWrapperTest.java      |   198 -
 .../binding/DefinitionAdapterBindingsTest.java     |     8 -
 .../core/client/api/ClientDefinitionManager.java   |     8 -
 .../stunner/core/client/api/DomainInitializer.java |   162 +
 .../stunner/core/client/api/JsStunnerEditor.java   |    11 +
 .../stunner/core/client/api/JsStunnerSession.java  |   122 +
 .../common/stunner/core/client/api/JsWindow.java   |    15 +
 .../client/canvas/command/ResizeNodeCommand.java   |    69 -
 .../registry/impl/ClientRegistryFactoryImpl.java   |     4 +
 .../stunner/core/client/util/WindowJSType.java     |    34 -
 .../stunner/core/TestingGraphMockHandler.java      |     4 +-
 .../core/client/api/DomainInitializerTest.java     |   323 +
 .../canvas/command/ResizeNodeCommandTest.java      |    35 +-
 .../core/api/AbstractDefinitionManager.java        |     5 -
 .../AbstractDefinitionSetResourceType.java         |    37 -
 .../stunner/core/diagram/AbstractDiagram.java      |    11 +-
 .../common/stunner/core/diagram/DiagramImpl.java   |    13 +-
 .../core/factory/impl/BindableDiagramFactory.java  |    40 -
 .../stunner/core/factory/impl/NodeFactoryImpl.java |     4 +-
 .../stunner/core/graph/impl/AbstractElement.java   |     2 +
 .../common/stunner/core/graph/impl/EdgeImpl.java   |     5 +-
 .../common/stunner/core/graph/impl/GraphImpl.java  |    15 +-
 .../common/stunner/core/graph/impl/NodeImpl.java   |    28 +-
 .../core/i18n/AbstractTranslationService.java      |     1 -
 .../registry/impl/AbstractRegistryFactory.java     |     2 +-
 .../common/stunner/core/rule/EmptyRuleSet.java     |     4 +-
 .../common/stunner/core/rule/RuleSetImpl.java      |    16 +-
 .../common/stunner/core/rule/impl/CanConnect.java  |    38 +-
 .../common/stunner/core/rule/impl/CanContain.java  |    22 +-
 .../common/stunner/core/rule/impl/CanDock.java     |    22 +-
 .../stunner/core/rule/impl/EdgeOccurrences.java    |    32 +-
 .../common/stunner/core/rule/impl/Occurrences.java |    25 +-
 .../common/stunner/core/util/DefinitionUtils.java  |    35 +-
 .../stunner/core/TestingGraphMockHandler.java      |     4 +-
 .../binding/BindableDefinitionAdapterImplTest.java |     9 -
 .../core/factory/impl/NodeFactoryImplTest.java     |     4 +-
 .../stunner/core/graph/util/GraphUtilsTest.java    |     4 +-
 .../kie-wb-common-stunner-processors/pom.xml       |    82 -
 .../core/processors/AbstractAdapterGenerator.java  |   115 -
 .../AbstractBindableAdapterGenerator.java          |    53 -
 .../stunner/core/processors/GeneratorUtils.java    |   281 -
 .../stunner/core/processors/MainProcessor.java     |  1244 --
 .../stunner/core/processors/ProcessingContext.java |   117 -
 .../ProcessingDefinitionAnnotations.java           |    82 -
 .../ProcessingDefinitionSetAnnotations.java        |    61 -
 .../stunner/core/processors/ProcessingElement.java |    37 -
 .../core/processors/ProcessingElementList.java     |    39 -
 .../core/processors/ProcessingElementMap.java      |    39 -
 .../stunner/core/processors/ProcessingEntity.java  |    37 -
 .../core/processors/ProcessingMorphProperty.java   |    44 -
 .../processors/ProcessingMorphingAnnotations.java  |    41 -
 .../processors/ProcessingPropertyAnnotations.java  |    29 -
 .../stunner/core/processors/ProcessingRule.java    |    53 -
 .../BindableDefinitionAdapterGenerator.java        |    95 -
 .../processors/definition/TypeConstructor.java     |    30 -
 .../BindableDefinitionSetAdapterGenerator.java     |    76 -
 .../definitionset/DefinitionSetProxyGenerator.java |    69 -
 .../processors/factory/ModelFactoryGenerator.java  |    58 -
 .../processors/morph/MorphDefinitionGenerator.java |    66 -
 .../morph/MorphDefinitionProviderGenerator.java    |    60 -
 .../morph/MorphPropertyDefinitionGenerator.java    |    70 -
 .../property/BindablePropertyAdapterGenerator.java |    55 -
 .../BindableDefinitionSetRuleAdapterGenerator.java |    77 -
 .../processors/rule/CardinalityRuleGenerator.java  |   108 -
 .../processors/rule/ConnectionRuleGenerator.java   |   115 -
 .../processors/rule/ContainmentRuleGenerator.java  |   108 -
 .../core/processors/rule/DockingRuleGenerator.java |   108 -
 .../rule/EdgeCardinalityRuleGenerator.java         |   121 -
 .../processors/rule/ExtensionRuleGenerator.java    |   162 -
 .../services/javax.annotation.processing.Processor |     1 -
 .../templates/BindableDefinitionAdapter.ftl        |    63 -
 .../templates/BindableDefinitionSetAdapter.ftl     |    47 -
 .../definitionset/templates/DefinitionSetProxy.ftl |    38 -
 .../processors/factory/templates/ModelFactory.ftl  |    61 -
 .../processors/morph/templates/MorphDefinition.ftl |    53 -
 .../morph/templates/MorphDefinitionProvider.ftl    |    46 -
 .../morph/templates/MorphPropertyDefinition.ftl    |    84 -
 .../property/templates/BindablePropertyAdapter.ftl |    48 -
 .../templates/BindableDefinitionSetRuleAdapter.ftl |    67 -
 .../processors/rule/templates/CardinalityRule.ftl  |     1 -
 .../processors/rule/templates/ConnectionRule.ftl   |     8 -
 .../processors/rule/templates/ContainmentRule.ftl  |     7 -
 .../core/processors/rule/templates/DockingRule.ftl |     7 -
 .../rule/templates/EdgeCardinalityRule.ftl         |     2 -
 .../processors/rule/templates/RuleExtension.ftl    |     1 -
 .../kie-wb-common-stunner-core/pom.xml             |     1 -
 .../src/main/java/javax/annotation/Generated.java  |    18 +
 .../core/shape/wires/types/JsWiresShape.java       |   107 +-
 .../com/ait/lienzo/client/core/types/JsCanvas.java |   165 +-
 .../client/core/types/JsCanvasAnimations.java      |     4 +
 .../lienzo/client/core/types/JsCanvasLogger.java   |     5 +-
 .../client/core/types/JsCanvasNodeLister.java      |     6 +-
 .../core/shape/wires/types/JsWiresShapeTest.java   |   182 +-
 .../ait/lienzo/client/core/types/JsCanvasTest.java |    10 +-
 .../serverless-workflow-diagram-editor/pom.xml     |     6 +
 .../sw-editor/sw-editor-api/pom.xml                |    21 +-
 .../workbench/common/stunner/sw/Definitions.java   |   107 -
 .../common/stunner/sw/SWDefinitionSet.java         |    80 +
 .../common/stunner/sw/SWDomainInitializer.java     |   227 +
 .../common/stunner/sw/autolayout/AutoLayout.java   |  1355 +-
 .../stunner/sw/definition/ActionDataFilters.java   |     8 +-
 .../stunner/sw/definition/ActionEventRef.java      |    10 +-
 .../common/stunner/sw/definition/ActionNode.java   |    93 +-
 .../stunner/sw/definition/ActionTransition.java    |    41 +-
 .../stunner/sw/definition/ActionsContainer.java    |    31 -
 .../stunner/sw/definition/CallEventAction.java     |     2 +-
 .../stunner/sw/definition/CallFunctionAction.java  |     6 -
 .../stunner/sw/definition/CallSubflowAction.java   |     6 -
 .../stunner/sw/definition/CallbackState.java       |    35 +-
 .../sw/definition/CompensationTransition.java      |    61 +-
 .../common/stunner/sw/definition/ContinueAs.java   |    13 +-
 .../common/stunner/sw/definition/Correlation.java  |     5 +-
 .../common/stunner/sw/definition/Data.java         |     3 +-
 .../sw/definition/DataConditionTransition.java     |    83 +-
 .../sw/definition/DefaultConditionTransition.java  |    54 +-
 .../common/stunner/sw/definition/End.java          |    33 +-
 .../common/stunner/sw/definition/Error.java        |    10 +-
 .../stunner/sw/definition/ErrorTransition.java     |    59 +-
 .../common/stunner/sw/definition/Event.java        |    36 +-
 .../sw/definition/EventConditionTransition.java    |    82 +-
 .../stunner/sw/definition/EventDataFilter.java     |     8 +-
 .../common/stunner/sw/definition/EventRef.java     |    36 +-
 .../common/stunner/sw/definition/EventState.java   |    28 +-
 .../common/stunner/sw/definition/EventTimeout.java |    10 +-
 .../common/stunner/sw/definition/ForEachState.java |    23 +-
 .../common/stunner/sw/definition/Function.java     |    10 +-
 .../common/stunner/sw/definition/FunctionRef.java  |    23 +-
 .../common/stunner/sw/definition/GWTMetadata.java  |    53 +
 .../common/stunner/sw/definition/InjectState.java  |    39 +-
 .../common/stunner/sw/definition/Metadata.java     |    49 +-
 .../common/stunner/sw/definition/ModelUtils.java   |     7 +-
 .../common/stunner/sw/definition/OnEvent.java      |    37 +-
 .../stunner/sw/definition/OperationState.java      |    33 +-
 .../stunner/sw/definition/ParallelState.java       |    26 +-
 .../stunner/sw/definition/ParallelStateBranch.java |    21 +-
 .../stunner/sw/definition/ProducedEvent.java       |     5 +-
 .../common/stunner/sw/definition/Retry.java        |     8 +-
 .../common/stunner/sw/definition/Schedule.java     |    10 +-
 .../common/stunner/sw/definition/Sleep.java        |     5 +-
 .../common/stunner/sw/definition/SleepState.java   |    20 +-
 .../common/stunner/sw/definition/Start.java        |    38 +-
 .../stunner/sw/definition/StartDefinition.java     |    14 +-
 .../stunner/sw/definition/StartTransition.java     |    49 +-
 .../common/stunner/sw/definition/State.java        |   106 +-
 .../stunner/sw/definition/StateDataFilter.java     |     5 +-
 .../common/stunner/sw/definition/StateEnd.java     |    19 +-
 .../stunner/sw/definition/StateTransition.java     |     7 +-
 .../common/stunner/sw/definition/SubFlowRef.java   |    20 +-
 .../common/stunner/sw/definition/SwitchState.java  |    44 +-
 .../common/stunner/sw/definition/Timeout.java      |    29 +-
 .../common/stunner/sw/definition/Transition.java   |    44 +-
 .../common/stunner/sw/definition/Workflow.java     |   141 +-
 .../stunner/sw/definition/WorkflowExecTimeout.java |    10 +-
 .../stunner/sw/definition/WorkflowTimeouts.java    |    12 +-
 .../ArgumentsValueHolderJsonbTypeSerializer.java   |    57 -
 .../ConstantsValueHolderJsonbTypeSerializer.java   |    24 -
 .../custom/ContinueAsJsonbTypeDeserializer.java    |    43 -
 .../custom/ContinueAsJsonbTypeSerializer.java      |    40 -
 .../definition/custom/ErrorJsonDeserializer.java   |    45 -
 .../sw/definition/custom/ErrorJsonSerializer.java  |    42 -
 .../custom/EventJsonbTypeDeserializer.java         |    46 -
 .../custom/EventJsonbTypeSerializer.java           |    43 -
 .../custom/FunctionRefJsonDeserializer.java        |    43 -
 .../custom/FunctionRefJsonSerializer.java          |    40 -
 .../custom/ScheduleJsonbTypeDeserializer.java      |    42 -
 .../custom/ScheduleJsonbTypeSerializer.java        |    41 -
 .../StartDefinitionJsonbTypeDeserializer.java      |    43 -
 .../custom/StartDefinitionJsonbTypeSerializer.java |    41 -
 .../StateEndDefinitionJsonbTypeDeserializer.java   |    45 -
 .../StateEndDefinitionJsonbTypeSerializer.java     |    38 -
 .../definition/custom/StateJsonDeserializer.java   |    55 -
 .../sw/definition/custom/StateJsonSerializer.java  |    65 -
 ...eTransitionDefinitionJsonbTypeDeserializer.java |    43 -
 ...ateTransitionDefinitionJsonbTypeSerializer.java |    40 -
 .../custom/SubFlowRefJsonDeserializer.java         |    43 -
 .../custom/SubFlowRefJsonSerializer.java           |    40 -
 .../SubflowExecutionTypeJsonbTypeDeserializer.java |    23 -
 .../SubflowExecutionTypeJsonbTypeSerializer.java   |    16 -
 .../custom/ValueHolderJsonbTypeDeserializer.java   |    52 -
 .../custom/ValueHolderJsonbTypeSerializer.java     |   107 -
 .../WorkflowExecTimeoutJsonDeserializer.java       |    43 -
 .../custom/WorkflowExecTimeoutJsonSerializer.java  |    40 -
 .../custom/WorkflowFunctionsJsonDeserializer.java  |    46 -
 .../custom/WorkflowFunctionsJsonSerializer.java    |    43 -
 .../custom/WorkflowTimeoutsJsonDeserializer.java   |    43 -
 .../custom/WorkflowTimeoutsJsonSerializer.java     |    40 -
 .../custom/json/ContinueAsJsonbTypeSerializer.java |    70 +
 .../custom/json/ErrorJsonSerializer.java           |    72 +
 .../custom/json/EventJsonbTypeSerializer.java      |    73 +
 .../custom/json/FunctionRefJsonSerializer.java     |    70 +
 .../custom/json/MetadataJsonSerializer.java        |    74 +
 .../custom/json/ScheduleJsonbTypeSerializer.java   |    67 +
 .../json/StartDefinitionJsonbTypeSerializer.java   |    73 +
 .../StateEndDefinitionJsonbTypeSerializer.java     |    74 +
 .../custom/json/StateJsonSerializer.java           |   111 +
 ...ateTransitionDefinitionJsonbTypeSerializer.java |    70 +
 .../StringOrValueHolderJsonbTypeSerializer.java    |    69 +
 .../custom/json/SubFlowRefJsonSerializer.java      |    70 +
 .../SubflowExecutionTypeJsonbTypeSerializer.java   |    56 +
 .../json/ValueHolderJsonbTypeSerializer.java       |   141 +
 .../json/WorkflowExecTimeoutJsonSerializer.java    |    71 +
 .../json/WorkflowFunctionsJsonSerializer.java      |    74 +
 .../json/WorkflowTimeoutsJsonSerializer.java       |    70 +
 .../custom/yaml/ContinueAsYamlTypeSerializer.java  |    81 +
 .../custom/yaml/ErrorYamlSerializer.java           |    86 +
 .../custom/yaml/EventYamlTypeSerializer.java       |    78 +
 .../custom/yaml/FunctionRefYamlSerializer.java     |    79 +
 .../custom/yaml/MetadataYamlSerializer.java        |   118 +
 .../yaml/NumCompletedYamlTypeSerializer.java       |    81 +
 .../custom/yaml/ScheduleYamlTypeSerializer.java    |    81 +
 .../yaml/StartDefinitionYamlTypeSerializer.java    |    64 +
 .../yaml/StateEndDefinitionYamlTypeSerializer.java |    57 +
 ...tateTransitionDefinitionYamlTypeSerializer.java |    63 +
 .../custom/yaml/StateYamlSerializer.java           |   137 +
 .../StringOrValueHolderYamlTypeSerializer.java     |    77 +
 .../custom/yaml/SubFlowRefYamlSerializer.java      |    63 +
 .../SubflowExecutionTypeYamlTypeSerializer.java    |    53 +
 .../custom/yaml/ValueHolderYamlTypeSerializer.java |   178 +
 .../yaml/WorkflowExecTimeoutYamlSerializer.java    |    60 +
 .../yaml/WorkflowFunctionsYamlSerializer.java      |    72 +
 .../yaml/WorkflowTimeoutsYamlSerializer.java       |    70 +
 .../common/stunner/sw/factory/DiagramFactory.java  |    49 -
 .../common/stunner/sw/marshall/BuilderContext.java |     3 +-
 .../stunner/sw/marshall/DefinitionTypeUtils.java   |    15 +-
 .../common/stunner/sw/marshall/DocType.java        |    21 +
 .../common/stunner/sw/marshall/Marshaller.java     |    54 +-
 .../stunner/sw/marshall/MarshallerUtils.java       |    72 +-
 .../common/stunner/sw/marshall/Parser.java         |     2 +-
 .../common/stunner/sw/marshall/yaml/Yaml.java      |    67 +
 .../common/stunner/sw/marshall/yaml/bundle.js      |  4177 +++++++
 .../stunner/sw/resources/i18n/SWConstants.java     |    14 +
 .../common/stunner/sw/SWEditorApi.gwt.xml          |     8 +-
 .../sw/resources/i18n/SWConstants.properties       |   301 +-
 .../sw/marshall/StartTransitionEndObjectsTest.java |     3 +-
 .../common/stunner/sw/client/ShapeSet.java         |     4 +-
 .../sw/client/shapes/CallbackStateShape.java       |    29 +-
 .../stunner/sw/client/shapes/EventStateShape.java  |     9 +-
 .../sw/client/shapes/ForEachStateShape.java        |     7 +-
 .../sw/client/shapes/HasEventAndDataFilter.java    |    38 +
 .../sw/client/shapes/OperationStateShape.java      |     7 +-
 .../sw/client/shapes/ParallelStateShape.java       |     7 +-
 .../stunner/sw/client/shapes/SwitchStateShape.java |     7 +-
 .../stunner/sw/client/shapes/TransitionShape.java  |     6 +-
 .../stunner/sw/client/shapes/icons/IconPath.java   |     1 +
 .../sw/client/shapes/icons/IconPosition.java       |     1 +
 .../client/shapes/HasEventAndDataFilterTest.java   |   103 +
 .../sw-editor/sw-editor-kogito-app/README.md       |    22 -
 .../sw-editor/sw-editor-kogito-app/pom.xml         |    15 +-
 .../stunner/sw/client/editor/DiagramEditor.java    |   161 +-
 .../sw/client/editor/DiagramEditorActivity.java    |    10 +
 .../sw/client/services/ClientDiagramService.java   |    30 +-
 .../sw/client/services/IncrementalMarshaller.java  |     3 +-
 .../sw-editor-kogito-app/src/main/webapp/test.html |   483 +-
 .../sw/client/editor/DiagramEditorTest.java        |    39 +-
 .../sw/client/selenium/SWEditorSeleniumBase.java   |    16 +-
 .../selenium/yaml/SWEditorYamlSeleniumIT.java      |   192 +
 .../yaml/AccumulateRoomReadingsExample.sw.yaml     |    48 +
 .../yaml/ApplicantRequestDecisionExample.sw.yaml   |    33 +
 .../yaml/AsyncFunctionInvocationExample.sw.yaml    |    19 +
 .../yaml/AsyncSubFlowInvocationExample.sw.yaml     |    16 +
 .../selenium/yaml/BookLendingExample.sw.yaml       |    88 +
 .../selenium/yaml/CarVitalsCheckExample.sw.yaml    |    34 +
 .../yaml/CheckInboxPeriodicallyExample.sw.yaml     |    31 +
 .../yaml/CustomerCreditCheckExample.sw.yaml        |    52 +
 .../yaml/EventBasedGreetingExample.sw.yaml         |    30 +
 .../EventBasedServiceInvocationExample.sw.yaml     |    29 +
 .../yaml/EventBasedSwitchStateExample.sw.yaml      |    43 +
 .../selenium/yaml/FillGlassOfWaterExample.sw.yaml  |    28 +
 .../yaml/FinalizeCollegeApplicationExample.sw.yaml |    40 +
 .../yaml/HandleCarAuctionBidExample.sw.yaml        |    28 +
 .../client/selenium/yaml/HelloWorldExample.sw.yaml |    12 +
 .../selenium/yaml/JobMonitoringExample.sw.yaml     |    73 +
 .../yaml/MonitorPatientVitalSignsExample.sw.yaml   |    56 +
 .../yaml/NewPatientOnboardingExample.sw.yaml       |    46 +
 .../yaml/NotifyCustomerWorkflowExample.sw.yaml     |    40 +
 .../selenium/yaml/ParallelExecutionExample.sw.yaml |    18 +
 .../yaml/ProcessTransactionsExample.sw.yaml        |    27 +
 .../selenium/yaml/ProvisionOrdersExample.sw.yaml   |    52 +
 .../yaml/PurchaseOrderDeadlineExample.sw.yaml      |    82 +
 .../yaml/SendCloudEventOnProvisionExample.sw.yaml  |    27 +
 .../selenium/yaml/SolveMathProblemsExample.sw.yaml |    23 +
 .../third_party/jakarta-spec/jsonb/api/pom.xml     |    46 +
 .../api/src/main/java/jakarta/json/EmptyArray.java |     0
 .../src/main/java/jakarta/json/EmptyObject.java    |     0
 .../main/java/jakarta/json/GwtIncompatible.java    |    30 +
 .../api/src/main/java/jakarta/json/JsonArray.java  |     0
 .../main/java/jakarta/json/JsonArrayBuilder.java   |     0
 .../src/main/java/jakarta/json/JsonException.java  |     0
 .../api/src/main/java/jakarta/json/JsonNumber.java |     0
 .../api/src/main/java/jakarta/json/JsonObject.java |     0
 .../main/java/jakarta/json/JsonObjectBuilder.java  |     0
 .../api/src/main/java/jakarta/json/JsonReader.java |     0
 .../api/src/main/java/jakarta/json/JsonString.java |     0
 .../src/main/java/jakarta/json/JsonStructure.java  |     0
 .../api/src/main/java/jakarta/json/JsonValue.java  |     0
 .../src/main/java/jakarta/json/JsonValueImpl.java  |     0
 .../main/java/jakarta/json/bind/JsonProvider.java  |     0
 .../api/src/main/java/jakarta/json/bind/Jsonb.java |   285 +
 .../main/java/jakarta/json/bind/JsonbBuilder.java  |     0
 .../main/java/jakarta/json/bind/JsonbConfig.java   |     0
 .../java/jakarta/json/bind/JsonbException.java     |     0
 .../jakarta/json/bind/adapter/JsonbAdapter.java    |     0
 .../json/bind/annotation/JsonbAnnotation.java      |     0
 .../jakarta/json/bind/annotation/JsonbCreator.java |     0
 .../json/bind/annotation/JsonbDateFormat.java      |     0
 .../json/bind/annotation/JsonbNillable.java        |     0
 .../json/bind/annotation/JsonbNumberFormat.java    |     0
 .../json/bind/annotation/JsonbProperty.java        |     0
 .../json/bind/annotation/JsonbPropertyOrder.java   |     0
 .../jakarta/json/bind/annotation/JsonbSubtype.java |     0
 .../json/bind/annotation/JsonbTransient.java       |     0
 .../json/bind/annotation/JsonbTypeAdapter.java     |     0
 .../bind/annotation/JsonbTypeDeserializer.java     |     0
 .../json/bind/annotation/JsonbTypeInfo.java        |     0
 .../json/bind/annotation/JsonbTypeSerializer.java  |     0
 .../json/bind/annotation/JsonbVisibility.java      |     0
 .../json/bind/config/BinaryDataStrategy.java       |     0
 .../json/bind/config/PropertyNamingStrategy.java   |     0
 .../json/bind/config/PropertyOrderStrategy.java    |     0
 .../bind/config/PropertyVisibilityStrategy.java    |     0
 .../bind/serializer/DeserializationContext.java    |     0
 .../json/bind/serializer/JsonbDeserializer.java    |     0
 .../json/bind/serializer/JsonbSerializer.java      |     0
 .../json/bind/serializer/SerializationContext.java |     0
 .../java/jakarta/json/bind/spi/JsonbProvider.java  |     0
 .../java/jakarta/json/stream/JsonGenerator.java    |   482 +
 .../java/jakarta/json/stream/JsonLocation.java     |     0
 .../main/java/jakarta/json/stream/JsonParser.java  |     0
 .../api/src/main/resources/jakarta/JSONB.gwt.xml   |     7 +
 .../third_party/jakarta-spec/jsonb/impl/pom.xml    |    79 +
 .../src/main/java/jakarta/json/JsonNumberImpl.java |     0
 .../java/jakarta/json/JsonObjectDecorator.java     |   177 +
 .../src/main/java/jakarta/json/JsonStringImpl.java |     0
 .../main/java/jakarta/json/JsonValueDecorator.java |   221 +
 .../serializer/JsonDeserializationContext.java     |    56 +
 .../bind/serializer/JsonSerializationContext.java  |    62 +
 .../json/stream/ContextedJsonGenerator.java        |   164 +
 .../jakarta/json/stream/JsonArrayGenerator.java    |   124 +
 .../json/stream/JsonGeneratorDecorator.java        |   217 +
 .../json/stream/JsonNestedObjecGenerator.java      |     0
 .../java/jakarta/json/stream/JsonParserImpl.java   |   110 +
 .../json/stream/JsonbPropertyDeserializer.java     |    26 +
 .../json/stream/JsonbPropertySerializer.java       |    25 +
 .../jakarta/json/stream/gwt/GWTJsonGenerator.java  |     0
 .../json/stream/gwt/GwtArrayJsonGenerator.java     |   251 +
 .../jakarta/json/stream/gwt/JsonArrayImpl.java     |   236 +
 .../json/stream/gwt/JsonObjectBuilderImpl.java     |     0
 .../jakarta/json/stream/gwt/JsonObjectImpl.java    |   232 +
 .../jakarta/json/stream/gwt/JsonValueImpl.java     |     0
 .../jakarta/json/stream/jre/JreJsonGenerator.java  |    39 +
 .../src/main/resources/jakarta/JSONBImpl.gwt.xml   |     8 +
 .../third_party/jakarta-spec/jsonb/pom.xml         |    24 +
 .../third_party/jakarta-spec/pom.xml               |    23 +
 .../third_party/pom.xml                            |     4 +-
 .../third_party/stdlib/pom.xml                     |    69 +
 .../gwt/emul/client/java/io/BufferedReader.java    |   117 +
 .../common/gwt/emul/client/java/io/DataInput.java  |    49 +
 .../gwt/emul/client/java/io/DataInputStream.java   |   146 +
 .../common/gwt/emul/client/java/io/DataOutput.java |    47 +
 .../gwt/emul/client/java/io/DataOutputStream.java  |    98 +
 .../gwt/emul/client/java/io/EOFException.java      |    18 +
 .../common/gwt/emul/client/java/io/File.java       |   333 +
 .../emul/client/java/io/FileNotFoundException.java |    27 +
 .../common/gwt/emul/client/java/io/FileWriter.java |    45 +
 .../gwt/emul/client/java/io/FilenameFilter.java    |    21 +
 .../gwt/emul/client/java/io/InputStreamReader.java |   156 +
 .../common/gwt/emul/client/java/io/Numbers.java    |    64 +
 .../gwt/emul/client/java/io/RandomAccessFile.java  |   342 +
 .../gwt/emul/client/java/io/StringWriter.java      |    37 +
 .../client/java/io/UTFDataFormatException.java     |    27 +
 .../common/gwt/emul/client/java/io/Writer.java     |    77 +
 .../client/java/lang/ClassNotFoundException.java   |    18 +
 .../gwt/emul/client/java/net/InetAddress.java      |    68 +
 .../emul/client/java/net/InetSocketAddress.java    |    43 +
 .../emul/client/java/net/UnknownHostException.java |    26 +
 .../common/gwt/emul/client/java/util/Calendar.java |    66 +
 .../gwt/emul/client/java/util/StringTokenizer.java |    66 +
 .../common/gwt/emul/client/java/util/UUID.java     |   126 +
 .../gwt/emul/client/java/util/regex/Matcher.java   |    60 +
 .../gwt/emul/client/java/util/regex/Pattern.java   |    54 +
 .../java/util/regex/PatternSyntaxException.java    |    18 +
 .../kie/workbench/common/gwt/emul/Stdlib.gwt.xml   |     8 +
 .../third_party/tooling/eo-yaml/CODE_OF_CONDUCT.md |     4 +
 .../third_party/tooling/eo-yaml/CONTRIBUTING.md    |    14 +
 .../third_party/tooling/eo-yaml/LICENSE            |    29 +
 .../third_party/tooling/eo-yaml/LICENSE.header     |    25 +
 .../third_party/tooling/eo-yaml/README.md          |     5 +
 .../third_party/tooling/eo-yaml/checkstyle.xml     |   314 +
 .../third_party/tooling/eo-yaml/pom.xml            |    91 +
 .../java/com/amihaiemil/eoyaml/AllYamlLines.java   |   189 +
 .../main/java/com/amihaiemil/eoyaml/Backwards.java |    76 +
 .../com/amihaiemil/eoyaml/BaseFoldedScalar.java    |    50 +
 .../java/com/amihaiemil/eoyaml/BaseScalar.java     |   114 +
 .../com/amihaiemil/eoyaml/BaseYamlMapping.java     |   146 +
 .../java/com/amihaiemil/eoyaml/BaseYamlNode.java   |   110 +
 .../com/amihaiemil/eoyaml/BaseYamlSequence.java    |   132 +
 .../java/com/amihaiemil/eoyaml/BaseYamlStream.java |   132 +
 .../java/com/amihaiemil/eoyaml/BuiltComment.java   |    67 +
 .../java/com/amihaiemil/eoyaml/BuiltComments.java  |    77 +
 .../main/java/com/amihaiemil/eoyaml/Comment.java   |    51 +
 .../main/java/com/amihaiemil/eoyaml/Comments.java  |    84 +
 .../amihaiemil/eoyaml/CompatibilityWrapper.java    |    72 +
 .../java/com/amihaiemil/eoyaml/Concatenated.java   |    94 +
 .../main/java/com/amihaiemil/eoyaml/Edited.java    |    72 +
 .../com/amihaiemil/eoyaml/EmptyYamlMapping.java    |    70 +
 .../com/amihaiemil/eoyaml/EmptyYamlSequence.java   |    65 +
 .../com/amihaiemil/eoyaml/FirstCommentFound.java   |   154 +
 .../main/java/com/amihaiemil/eoyaml/Follows.java   |    83 +
 .../java/com/amihaiemil/eoyaml/GWTYamlNode.java    |    46 +
 .../com/amihaiemil/eoyaml/GreaterIndentation.java  |   102 +
 .../main/java/com/amihaiemil/eoyaml/Indented.java  |    73 +
 .../java/com/amihaiemil/eoyaml/InlineComment.java  |    66 +
 .../java/com/amihaiemil/eoyaml/JsonYamlDump.java   |    77 +
 .../com/amihaiemil/eoyaml/JsonYamlMapping.java     |    87 +
 .../com/amihaiemil/eoyaml/JsonYamlSequence.java    |    77 +
 .../eoyaml/MutableYamlMappingBuilder.java          |    98 +
 .../eoyaml/MutableYamlSequenceBuilder.java         |    80 +
 .../src/main/java/com/amihaiemil/eoyaml/Node.java  |    53 +
 .../com/amihaiemil/eoyaml/PlainStringScalar.java   |   105 +
 .../java/com/amihaiemil/eoyaml/ReadComment.java    |    84 +
 .../amihaiemil/eoyaml/ReadFoldedBlockScalar.java   |   195 +
 .../amihaiemil/eoyaml/ReadLiteralBlockScalar.java  |   159 +
 .../com/amihaiemil/eoyaml/ReadPlainScalar.java     |   216 +
 .../com/amihaiemil/eoyaml/ReadYamlMapping.java     |   324 +
 .../com/amihaiemil/eoyaml/ReadYamlSequence.java    |   202 +
 .../java/com/amihaiemil/eoyaml/ReadYamlStream.java |   116 +
 .../com/amihaiemil/eoyaml/ReflectedYamlDump.java   |    78 +
 .../amihaiemil/eoyaml/ReflectedYamlMapping.java    |   221 +
 .../com/amihaiemil/eoyaml/ReflectedYamlScalar.java |    76 +
 .../amihaiemil/eoyaml/ReflectedYamlSequence.java   |    93 +
 .../java/com/amihaiemil/eoyaml/RtYamlInput.java    |   183 +
 .../java/com/amihaiemil/eoyaml/RtYamlLine.java     |    83 +
 .../java/com/amihaiemil/eoyaml/RtYamlMapping.java  |    93 +
 .../amihaiemil/eoyaml/RtYamlMappingBuilder.java    |   103 +
 .../java/com/amihaiemil/eoyaml/RtYamlPrinter.java  |   407 +
 .../com/amihaiemil/eoyaml/RtYamlScalarBuilder.java |   212 +
 .../java/com/amihaiemil/eoyaml/RtYamlSequence.java |    86 +
 .../amihaiemil/eoyaml/RtYamlSequenceBuilder.java   |    82 +
 .../com/amihaiemil/eoyaml/RtYamlStreamBuilder.java |   103 +
 .../amihaiemil/eoyaml/SameIndentationLevel.java    |   133 +
 .../main/java/com/amihaiemil/eoyaml/Scalar.java    |    49 +
 .../java/com/amihaiemil/eoyaml/ScalarComment.java  |    51 +
 .../src/main/java/com/amihaiemil/eoyaml/Skip.java  |   215 +
 .../java/com/amihaiemil/eoyaml/StartMarkers.java   |   109 +
 .../com/amihaiemil/eoyaml/StrictYamlMapping.java   |    82 +
 .../com/amihaiemil/eoyaml/StrictYamlSequence.java  |   149 +
 .../java/com/amihaiemil/eoyaml/WellIndented.java   |   176 +
 .../src/main/java/com/amihaiemil/eoyaml/Yaml.java  |   179 +
 .../main/java/com/amihaiemil/eoyaml/YamlDump.java  |    78 +
 .../main/java/com/amihaiemil/eoyaml/YamlInput.java |   102 +
 .../main/java/com/amihaiemil/eoyaml/YamlLine.java  |   216 +
 .../main/java/com/amihaiemil/eoyaml/YamlLines.java |    86 +
 .../java/com/amihaiemil/eoyaml/YamlMapping.java    |   470 +
 .../com/amihaiemil/eoyaml/YamlMappingBuilder.java  |    94 +
 .../main/java/com/amihaiemil/eoyaml/YamlNode.java  |   113 +
 .../eoyaml/YamlNodeNotFoundException.java          |    67 +
 .../java/com/amihaiemil/eoyaml/YamlPrinter.java    |    50 +
 .../com/amihaiemil/eoyaml/YamlScalarBuilder.java   |   158 +
 .../java/com/amihaiemil/eoyaml/YamlSequence.java   |   280 +
 .../com/amihaiemil/eoyaml/YamlSequenceBuilder.java |    77 +
 .../java/com/amihaiemil/eoyaml/YamlStream.java     |   241 +
 .../com/amihaiemil/eoyaml/YamlStreamBuilder.java   |    51 +
 .../exceptions/YamlIndentationException.java       |    52 +
 .../eoyaml/exceptions/YamlPrintException.java      |    53 +
 .../eoyaml/exceptions/YamlReadingException.java    |    52 +
 .../eoyaml/extensions/MergedYamlMapping.java       |   276 +
 .../eoyaml/extensions/MergedYamlSequence.java      |   199 +
 .../amihaiemil/eoyaml/extensions/package-info.java |    39 +
 .../main/resources/com/amihaiemil/EOYaml.gwt.xml   |     9 +
 .../tooling/marshalling/json/api/pom.xml           |    47 -
 .../java/jakarta/json/bind/GwtIncompatible.java    |    30 -
 .../api/src/main/java/jakarta/json/bind/Jsonb.java |   283 -
 .../jakarta/json/bind/adapter/package-info.java    |    22 -
 .../jakarta/json/bind/annotation/package-info.java |    22 -
 .../jakarta/json/bind/config/package-info.java     |    23 -
 .../main/java/jakarta/json/bind/package-info.java  |    25 -
 .../jakarta/json/bind/serializer/package-info.java |    22 -
 .../java/jakarta/json/bind/spi/package-info.java   |    31 -
 .../java/jakarta/json/stream/JsonGenerator.java    |   483 -
 .../api/src/main/resources/jakarta/Api.gwt.xml     |     6 -
 .../tooling/marshalling/json/common/pom.xml        |     8 +-
 .../java/jakarta/json/JsonObjectDecorator.java     |   177 -
 .../main/java/jakarta/json/JsonValueDecorator.java |   227 -
 .../serializer/JsonDeserializationContext.java     |    57 -
 .../bind/serializer/JsonSerializationContext.java  |    63 -
 .../jakarta/json/stream/JsonArrayGenerator.java    |   113 -
 .../json/stream/JsonGeneratorDecorator.java        |   217 -
 .../java/jakarta/json/stream/JsonParserImpl.java   |    81 -
 .../json/stream/JsonbPropertyDeserializer.java     |    27 -
 .../json/stream/JsonbPropertySerializer.java       |    27 -
 .../json/stream/gwt/GwtArrayJsonGenerator.java     |   244 -
 .../jakarta/json/stream/gwt/JsonArrayImpl.java     |   236 -
 .../jakarta/json/stream/gwt/JsonObjectImpl.java    |   216 -
 .../jakarta/json/stream/jre/JreJsonGenerator.java  |    39 -
 .../json/mapper/annotation/GwtIncompatible.java    |    30 -
 .../stunner/client/json/mapper/internal/Pair.java  |     1 +
 .../deserializer/AbstractBeanJsonDeserializer.java |     1 +
 .../deserializer/BaseNumberJsonDeserializer.java   |     1 +
 .../DeserializerJsonbTypeSerializerWrapper.java    |    38 +
 .../internal/deserializer/JsonbDeserializer.java   |     2 +-
 .../deserializer/JsonbSubtypeDeserializer.java     |     3 +-
 .../array/AbstractArrayJsonDeserializer.java       |     4 +-
 .../array/PrimitiveByteArrayJsonDeserializer.java  |     5 +-
 .../PrimitiveDoubleArrayJsonDeserializer.java      |     5 +-
 .../array/PrimitiveFloatArrayJsonDeserializer.java |     5 +-
 .../PrimitiveIntegerArrayJsonDeserializer.java     |     5 +-
 .../array/PrimitiveLongArrayJsonDeserializer.java  |     7 +-
 .../array/PrimitiveShortArrayJsonDeserializer.java |     5 +-
 .../collection/CollectionDeserializer.java         |     1 +
 .../mapper/internal/serializer/JsonSerializer.java |     2 +-
 .../internal/serializer/JsonSerializerAdapter.java |    24 +-
 .../serializer/JsonbSubtypeSerializer.java         |    12 +-
 .../SerializerJsonbTypeSerializerWrapper.java      |    44 +
 .../serializer/array/ArrayBeanJsonSerializer.java  |    14 +-
 .../serializer/array/ArrayJsonSerializer.java      |     4 +-
 .../array/PrimitiveBooleanArrayJsonSerializer.java |     4 +-
 .../array/PrimitiveByteArrayJsonSerializer.java    |     4 +-
 .../PrimitiveCharacterArrayJsonSerializer.java     |     4 +-
 .../array/PrimitiveDoubleArrayJsonSerializer.java  |     9 +-
 .../array/PrimitiveFloatArrayJsonSerializer.java   |    11 +-
 .../array/PrimitiveIntegerArrayJsonSerializer.java |    11 +-
 .../array/PrimitiveLongArrayLongSerializer.java    |    11 +-
 .../array/PrimitiveShortArrayJsonSerializer.java   |    11 +-
 .../BoxedTypeCollectionJsonSerializer.java         |     2 +-
 .../collection/CollectionJsonSerializer.java       |    10 +-
 .../src/main/resources/jakarta/Common.gwt.xml      |     4 +-
 .../third_party/tooling/marshalling/json/pom.xml   |     3 +-
 .../tooling/marshalling/json/processor/pom.xml     |     6 +-
 .../apt/definition/ArrayBeanFieldDefinition.java   |   196 +-
 .../json/mapper/apt/definition/BeanDefinition.java |    51 +-
 .../apt/definition/CollectionsFieldDefinition.java |   134 +-
 .../apt/definition/EnumBeanFieldDefinition.java    |     1 -
 .../apt/definition/FieldDefinitionFactory.java     |    42 +-
 .../apt/definition/JsonbTypeInfoDefinition.java    |   221 +-
 .../definition/JsonbTypeSerFieldDefinition.java    |   109 +-
 .../mapper/apt/definition/PropertyDefinition.java  |    17 +-
 .../mapper/apt/generator/AbstractGenerator.java    |    10 +
 .../apt/generator/DeserializerGenerator.java       |     1 +
 .../json/mapper/apt/generator/MapperGenerator.java |    14 +-
 .../mapper/apt/generator/SerializerGenerator.java  |     1 +
 .../json/mapper/apt/processor/BeanProcessor.java   |   123 +-
 .../client/json/mapper/apt/utils/TypeRegistry.java |   300 +-
 .../client/json/mapper/apt/utils/TypeUtils.java    |   140 +-
 .../third_party/tooling/marshalling/pom.xml        |     5 +-
 .../tooling/marshalling/yaml/common/pom.xml        |    61 +
 .../yaml/mapper/api/AbstractObjectMapper.java      |   108 +
 .../api/DefaultYAMLSerializationContext.java       |   164 +
 .../client/yaml/mapper/api/YAMLContext.java        |    25 +
 .../yaml/mapper/api/YAMLContextProvider.java       |    44 +
 .../client/yaml/mapper/api/YAMLDeserializer.java   |    37 +
 .../client/yaml/mapper/api/YAMLSerializer.java     |    28 +
 .../yaml/mapper/api/annotation/YAMLMapper.java     |    26 +
 .../yaml/mapper/api/annotation/YamlProperty.java   |    49 +
 .../mapper/api/annotation/YamlPropertyOrder.java   |    30 +
 .../yaml/mapper/api/annotation/YamlSubtype.java    |    40 +
 .../yaml/mapper/api/annotation/YamlTransient.java  |    29 +
 .../api/annotation/YamlTypeDeserializer.java       |    40 +
 .../yaml/mapper/api/annotation/YamlTypeInfo.java   |    43 +
 .../mapper/api/annotation/YamlTypeSerializer.java  |    41 +
 .../exception/YAMLDeserializationException.java    |    52 +
 .../mapper/api/exception/YAMLMappingException.java |    52 +
 .../api/exception/YAMLSerializationException.java  |    52 +
 .../internal/deser/BaseDateYAMLDeserializer.java   |    94 +
 .../internal/deser/BaseNumberYAMLDeserializer.java |   204 +
 .../internal/deser/BooleanYAMLDeserializer.java    |    39 +
 .../internal/deser/CharacterYAMLDeserializer.java  |    39 +
 .../deser/DefaultYAMLDeserializationContext.java   |   131 +
 .../api/internal/deser/EnumYAMLDeserializer.java   |    94 +
 .../deser/StringArrayYAMLDeserializer.java         |    61 +
 .../api/internal/deser/StringYAMLDeserializer.java |    54 +
 .../internal/deser/YAMLDeserializationContext.java |    52 +
 .../deser/array/AbstractArrayYAMLDeserializer.java |    86 +
 .../deser/array/ArrayYAMLDeserializer.java         |    91 +
 .../PrimitiveBooleanArrayYAMLDeserializer.java     |    72 +
 .../array/PrimitiveByteArrayYAMLDeserializer.java  |    46 +
 .../PrimitiveCharacterArrayYAMLDeserializer.java   |    70 +
 .../PrimitiveDoubleArrayYAMLDeserializer.java      |    74 +
 .../array/PrimitiveFloatArrayYAMLDeserializer.java |    72 +
 .../PrimitiveIntegerArrayYAMLDeserializer.java     |    74 +
 .../array/PrimitiveLongArrayYAMLDeserializer.java  |    72 +
 .../array/PrimitiveShortArrayYAMLDeserializer.java |    72 +
 .../deser/bean/AbstractBeanYAMLDeserializer.java   |   135 +
 .../deser/bean/BeanPropertyDeserializer.java       |    44 +
 .../api/internal/deser/bean/HasDeserializer.java   |    49 +
 .../deser/bean/HasDeserializerAndParameters.java   |    43 +
 .../mapper/api/internal/deser/bean/Instance.java   |    46 +
 .../api/internal/deser/bean/InstanceBuilder.java   |    45 +
 .../deser/bean/YamlSubtypeDeserializer.java        |    77 +
 .../AbstractCollectionYAMLDeserializer.java        |    61 +
 .../collection/AbstractListYAMLDeserializer.java   |    59 +
 .../collection/AbstractQueueYAMLDeserializer.java  |    60 +
 .../AbstractSequentialListYAMLDeserializer.java    |    61 +
 .../collection/AbstractSetYAMLDeserializer.java    |    60 +
 .../collection/ArrayListYAMLDeserializer.java      |    57 +
 .../collection/BaseCollectionYAMLDeserializer.java |   103 +
 .../collection/BaseIterableYAMLDeserializer.java   |    46 +
 .../deser/collection/BaseListYAMLDeserializer.java |    43 +
 .../collection/BaseQueueYAMLDeserializer.java      |    49 +
 .../deser/collection/BaseSetYAMLDeserializer.java  |    56 +
 .../collection/BaseSortedSetYAMLDeserializer.java  |    49 +
 .../collection/CollectionYAMLDeserializer.java     |    60 +
 .../deser/collection/EnumSetYAMLDeserializer.java  |    68 +
 .../deser/collection/HashSetYAMLDeserializer.java  |    57 +
 .../deser/collection/IterableYAMLDeserializer.java |    64 +
 .../collection/LinkedHashSetYAMLDeserializer.java  |    57 +
 .../collection/LinkedListYAMLDeserializer.java     |    57 +
 .../deser/collection/ListYAMLDeserializer.java     |    59 +
 .../collection/PriorityQueueYAMLDeserializer.java  |    58 +
 .../deser/collection/QueueYAMLDeserializer.java    |    59 +
 .../deser/collection/SetYAMLDeserializer.java      |    59 +
 .../collection/SortedSetYAMLDeserializer.java      |    60 +
 .../deser/collection/StackYAMLDeserializer.java    |    57 +
 .../deser/collection/TreeSetYAMLDeserializer.java  |    57 +
 .../deser/collection/VectorYAMLDeserializer.java   |    57 +
 .../deser/map/AbstractMapYAMLDeserializer.java     |    66 +
 .../deser/map/BaseMapYAMLDeserializer.java         |    79 +
 .../deser/map/EnumMapYAMLDeserializer.java         |    68 +
 .../deser/map/HashMapYAMLDeserializer.java         |    64 +
 .../deser/map/IdentityHashMapYAMLDeserializer.java |    64 +
 .../deser/map/LinkedHashMapYAMLDeserializer.java   |    64 +
 .../internal/deser/map/MapYAMLDeserializer.java    |    65 +
 .../deser/map/SortedMapYAMLDeserializer.java       |    66 +
 .../deser/map/TreeMapYAMLDeserializer.java         |    64 +
 .../api/internal/ser/AbstractYAMLSerializer.java   |    82 +
 .../api/internal/ser/BaseDateYAMLSerializer.java   |   140 +
 .../api/internal/ser/BaseNumberYAMLSerializer.java |   112 +
 .../api/internal/ser/BooleanYAMLSerializer.java    |    49 +
 .../api/internal/ser/CharacterYAMLSerializer.java  |    50 +
 .../api/internal/ser/CollectionYAMLSerializer.java |    91 +
 .../api/internal/ser/EnumYAMLSerializer.java       |    50 +
 .../api/internal/ser/IterableYAMLSerializer.java   |    76 +
 .../api/internal/ser/StringYAMLSerializer.java     |    58 +
 .../api/internal/ser/YAMLSerializationContext.java |    29 +
 .../internal/ser/YamlTypeSerializerWrapper.java    |    47 +
 .../internal/ser/array/ArrayYAMLSerializer.java    |    82 +
 .../ser/array/BasicArrayYAMLSerializer.java        |    22 +
 .../array/PrimitiveBooleanArrayYAMLSerializer.java |    66 +
 .../array/PrimitiveByteArrayYAMLSerializer.java    |    57 +
 .../PrimitiveCharacterArrayYAMLSerializer.java     |    66 +
 .../array/PrimitiveDoubleArrayYAMLSerializer.java  |    68 +
 .../array/PrimitiveFloatArrayYAMLSerializer.java   |    66 +
 .../array/PrimitiveIntegerArrayYAMLSerializer.java |    67 +
 .../array/PrimitiveLongArrayYAMLSerializer.java    |    66 +
 .../array/PrimitiveShortArrayYAMLSerializer.java   |    68 +
 .../ser/bean/AbstractBeanYAMLSerializer.java       |   122 +
 .../internal/ser/bean/BeanPropertySerializer.java  |    79 +
 .../api/internal/ser/bean/HasSerializer.java       |    49 +
 .../api/internal/ser/bean/InternalSerializer.java  |    37 +
 .../internal/ser/bean/YamlSubtypeSerializer.java   |   122 +
 .../api/internal/ser/map/MapYAMLSerializer.java    |   136 +
 .../mapper/api/internal/utils/Base64Utils.java     |   220 +
 .../yaml/mapper/api/internal/utils/Pair.java       |    29 +
 .../client/yaml/mapper/api/stream/YAMLReader.java  |    22 +
 .../yaml/mapper/api/stream/YAMLSequenceWriter.java |    29 +
 .../client/yaml/mapper/api/stream/YAMLWriter.java  |    36 +
 .../mapper/api/stream/impl/DefaultYAMLReader.java  |    47 +
 .../api/stream/impl/DefaultYAMLSequenceWriter.java |    45 +
 .../mapper/api/stream/impl/DefaultYAMLWriter.java  |   559 +
 .../stunner/client/yaml/mapper/Mapper.gwt.xml      |     9 +
 .../third_party/tooling/marshalling/yaml/pom.xml   |    23 +
 .../tooling/marshalling/yaml/processor/pom.xml     |    99 +
 .../yaml/processor/ApplicationProcessor.java       |   121 +
 .../client/yaml/processor/TypeRegistry.java        |   899 ++
 .../stunner/client/yaml/processor/TypeUtils.java   |   857 ++
 .../yaml/processor/context/GenerationContext.java  |    85 +
 .../definition/ArrayBeanFieldDefinition.java       |   126 +
 .../definition/BasicTypeFieldDefinition.java       |    70 +
 .../yaml/processor/definition/BeanDefinition.java  |   122 +
 .../definition/DefaultBeanFieldDefinition.java     |    54 +
 .../yaml/processor/definition/Definition.java      |    39 +
 .../definition/EnumBeanFieldDefinition.java        |    68 +
 .../yaml/processor/definition/FieldDefinition.java |    35 +
 .../definition/FieldDefinitionFactory.java         |    65 +
 .../definition/IterableBeanFieldDefinition.java    |    78 +
 .../definition/MapBeanFieldDefinition.java         |    86 +
 .../processor/definition/PropertyDefinition.java   |   172 +
 .../definition/YamlTypeInfoFieldDefinition.java    |   124 +
 .../deserializer/DeserializerGenerator.java        |   373 +
 .../processor/exception/GenerationException.java   |    45 +
 .../exception/UnableToCompleteException.java       |    87 +
 .../processor/generator/AbstractGenerator.java     |    92 +
 .../yaml/processor/generator/MapperGenerator.java  |   181 +
 .../yaml/processor/logger/AbstractTreeLogger.java  |   307 +
 .../processor/logger/PrintWriterTreeLogger.java    |    98 +
 .../client/yaml/processor/logger/TreeLogger.java   |   250 +
 .../yaml/processor/processor/BeanProcessor.java    |   202 +
 .../processor/serializer/SerializerGenerator.java  |   265 +
 .../third_party/tooling/pom.xml                    |     4 +-
 .../views/pfly/tab/TabPanelWithDropdownsTest.java  |    14 +-
 .../org/uberfire/client/mvp/EditorActivity.java    |     4 +
 .../java/org/uberfire/client/util/JSFunctions.java |     8 +
 packages/stunner-editors-dmn-loader/package.json   |     1 -
 .../src/@types/react-table.d.ts                    |    74 -
 packages/stunner-editors-dmn-loader/src/index.tsx  |   171 +-
 .../rebind/BindableProxyLoaderGenerator.java       |     7 -
 .../errai/databinding/rebind/DataBindingUtil.java  |    39 +-
 .../common/dmn/api/definition/model/Binding.java   |     7 +
 .../common/dmn/api/definition/model/Context.java   |    13 +
 .../dmn/api/definition/model/ContextEntry.java     |     9 +-
 .../dmn/api/definition/model/DecisionRule.java     |    13 +
 .../dmn/api/definition/model/DecisionTable.java    |    21 +
 .../dmn/api/definition/model/Expression.java       |     8 +
 .../api/definition/model/FunctionDefinition.java   |    17 +
 .../dmn/api/definition/model/ImportedValues.java   |    11 +
 .../dmn/api/definition/model/InformationItem.java  |     6 +
 .../dmn/api/definition/model/InputClause.java      |     9 +
 .../model/InputClauseLiteralExpression.java        |    15 +
 .../definition/model/InputClauseUnaryTests.java    |     8 +
 .../dmn/api/definition/model/Invocation.java       |    12 +
 .../common/dmn/api/definition/model/List.java      |    15 +
 .../api/definition/model/LiteralExpression.java    |    13 +
 .../dmn/api/definition/model/OutputClause.java     |    11 +
 .../model/OutputClauseLiteralExpression.java       |    10 +
 .../definition/model/OutputClauseUnaryTests.java   |     8 +
 .../common/dmn/api/definition/model/Relation.java  |    12 +
 .../api/definition/model/RuleAnnotationClause.java |     4 +
 .../dmn/api/definition/model/UnaryTests.java       |    10 +
 .../definition/model/common/HasTypeRefHelper.java  |     2 +
 .../workbench/common/dmn/api/property/dmn/Id.java  |     4 +
 .../api/resources/i18n/DMNAPIConstants.properties  |     2 +-
 .../dmn/api/definition/model/BindingTest.java      |    17 +
 .../dmn/api/definition/model/ContextEntryTest.java |    17 +
 .../dmn/api/definition/model/ContextTest.java      |    12 +
 .../dmn/api/definition/model/DecisionRuleTest.java |    13 +
 .../api/definition/model/DecisionTableTest.java    |    28 +
 .../dmn/api/definition/model/ExpressionTest.java   |     5 +
 .../definition/model/FunctionDefinitionTest.java   |    17 +
 .../api/definition/model/ImportedValuesTest.java   |    23 +
 .../api/definition/model/InformationItemTest.java  |    13 +
 .../model/InputClauseLiteralExpressionTest.java    |    19 +
 .../dmn/api/definition/model/InputClauseTest.java  |    25 +
 .../model/InputClauseUnaryTestsTest.java           |    16 +
 .../dmn/api/definition/model/InvocationTest.java   |    20 +
 .../common/dmn/api/definition/model/ListTest.java  |    18 +
 .../definition/model/LiteralExpressionTest.java    |    22 +
 .../model/OutputClauseLiteralExpressionTest.java   |    20 +
 .../dmn/api/definition/model/OutputClauseTest.java |    30 +-
 .../model/OutputClauseUnaryTestsTest.java          |    16 +
 .../dmn/api/definition/model/RelationTest.java     |    20 +
 .../dmn/api/definition/model/UnaryTestsTest.java   |    20 +
 .../general/NavigateToDRGEditorCommand.java        |     3 +-
 .../documentation/common/DMNDocumentation.java     |     8 -
 .../template/dmn-documentation-template.html       |    14 -
 .../expressions/ExpressionContainerGrid.java       |     8 +
 .../editors/expressions/ExpressionEditor.java      |    46 +-
 .../expressions/ExpressionEditorControlImpl.java   |    12 +-
 .../editors/expressions/ExpressionEditorView.java  |     4 -
 .../expressions/ExpressionEditorViewImpl.html      |    32 +-
 .../expressions/ExpressionEditorViewImpl.java      |   456 +-
 .../expressions/ExpressionEditorViewImpl.less      |    76 +-
 .../expressions/SaveCurrentStateCommand.java       |     5 +-
 .../commands/ClearExpressionCommand.java           |    11 +-
 .../commands/FillContextExpressionCommand.java     |    11 +-
 .../FillDecisionTableExpressionCommand.java        |    11 +-
 .../commands/FillExpressionCommand.java            |    24 +-
 .../commands/FillFunctionExpressionCommand.java    |    11 +-
 .../commands/FillInvocationExpressionCommand.java  |    11 +-
 .../commands/FillListExpressionCommand.java        |    11 +-
 .../commands/FillLiteralExpressionCommand.java     |     9 +-
 .../commands/FillRelationExpressionCommand.java    |    11 +-
 .../expressions/jsinterop/props/Annotation.java    |     5 +-
 .../editors/expressions/jsinterop/props/Cell.java  |    31 +
 .../expressions/jsinterop/props/Clause.java        |     5 +-
 .../jsinterop/props/ClauseUnaryTests.java          |    36 +
 .../jsinterop/props/DecisionTableProps.java        |     4 +-
 .../jsinterop/props/DecisionTableRule.java         |     6 +-
 .../expressions/jsinterop/props/FunctionProps.java |     6 +-
 .../jsinterop/props/InputClauseProps.java          |    31 +
 .../jsinterop/props/InvocationFunctionProps.java   |    15 +
 .../jsinterop/props/InvocationProps.java           |     6 +-
 .../expressions/jsinterop/props/ListProps.java     |     5 +-
 .../expressions/jsinterop/props/PMMLParam.java     |     6 +-
 .../editors/expressions/jsinterop/props/Row.java   |     4 +-
 .../expressions/jsinterop/props/RuleEntry.java     |    32 +
 .../jsinterop/util/BoxedExpressionService.java     |   100 -
 .../jsinterop/util/ExpressionEditorService.java    |    73 +
 .../jsinterop/util/ExpressionModelFiller.java      |   214 +-
 .../jsinterop/util/ExpressionPropsFiller.java      |    60 +-
 .../types/ExpressionEditorModelEnricher.java       |    19 +
 .../editors/expressions/types/ExpressionType.java  |     4 +-
 .../expressions/types/context/ContextGrid.java     |     6 +-
 .../dtable/DecisionTableEditorDefinition.java      |     5 +
 .../DecisionTableEditorDefinitionEnricher.java     |   115 +-
 .../pmml/PMMLDocumentMetadataProvider.java         |     3 +-
 .../types/invocation/InvocationGrid.java           |     6 +-
 .../editors/expressions/types/list/ListGrid.java   |     6 +-
 .../types/literal/LiteralExpressionGrid.java       |     3 +-
 .../editors/expressions/util/ExpressionState.java  |    14 +-
 .../editors/expressions/util/TypeRefUtils.java     |    22 +
 .../included/commands/AddIncludedModelCommand.java |    15 +-
 .../commands/RemovePMMLIncludedModelCommand.java   |     4 +-
 .../editors/included/grid/PMMLCardComponent.java   |     3 +-
 .../editors/included/modal/IncludedModelModal.java |     7 +
 .../dmn/client/events/IncludedPMMLModelUpdate.java |    33 +
 .../workbench/common/dmn/client/js/DMNLoader.java  |     4 +-
 .../dmn/client/marshaller/common/WrapperUtils.java |    11 +
 .../converters/ContextEntryPropertyConverter.java  |     8 -
 .../converters/ListPropertyConverter.java          |    10 +-
 .../dmn/client/resources/DMNImageResources.java    |     6 -
 .../dmn/client/resources/DMNSVGGlyphFactory.java   |     2 -
 .../resources/i18n/DMNClientConstants.properties   |    18 +-
 .../images/logos/supported-by-red-hat-logo.svg     |     1 -
 .../common/DMNDocumentationFactoryTest.java        |     1 -
 .../ExpressionEditorControlImplTest.java           |     7 +-
 .../editors/expressions/ExpressionEditorTest.java  |    32 +-
 .../expressions/ExpressionEditorViewImplTest.java  |   538 +-
 .../expressions/SaveCurrentStateCommandTest.java   |     2 +-
 .../commands/ClearExpressionCommandTest.java       |    10 +-
 .../commands/FillContextExpressionCommandTest.java |    18 +-
 .../FillDecisionTableExpressionCommandTest.java    |    18 +-
 .../commands/FillExpressionCommandTest.java        |    13 +-
 .../FillFunctionExpressionCommandTest.java         |    18 +-
 .../FillInvocationExpressionCommandTest.java       |    18 +-
 .../commands/FillListExpressionCommandTest.java    |    17 +-
 .../commands/FillLiteralExpressionCommandTest.java |    18 +-
 .../FillRelationExpressionCommandTest.java         |    18 +-
 .../jsinterop/util/ExpressionModelFillerTest.java  |   105 +-
 .../jsinterop/util/ExpressionPropsFillerTest.java  |    16 +-
 .../expressions/types/context/ContextGridTest.java |     3 +-
 .../DecisionTableEditorDefinitionEnricherTest.java |     6 +-
 .../types/invocation/InvocationGridTest.java       |     3 +-
 .../expressions/types/list/ListGridTest.java       |     4 +-
 .../expressions/util/ExpressionStateTest.java      |    30 +-
 .../commands/AddIncludedModelCommandTest.java      |    23 +-
 .../included/modal/IncludedModelModalTest.java     |     8 +-
 .../client/editor/AbstractDMNDiagramEditor.java    |     8 +-
 .../editor/AbstractDMNDiagramEditorTest.java       |    13 +-
 .../pom.xml                                        |     2 +-
 .../showcase/client/editor/DMNDiagramEditor.java   |     7 +-
 .../src/main/webapp/test.html                      |    14 +-
 .../client/selenium/DMNDesignerIntelliSenseIT.java |     4 +-
 .../selenium/DMNDesignerKogitoSeleniumIT.java      |     5 +-
 .../selenium/locator/EditorXPathLocator.java       |    10 +-
 .../pom.xml                                        |     2 +-
 .../widget/grid/columns/RowNumberColumn.java       |     4 +-
 packages/uniforms-patternfly/.eslintignore         |     2 +
 packages/uniforms-patternfly/package.json          |     2 +
 packages/uniforms-patternfly/src/DateField.tsx     |   197 +-
 packages/uniforms-patternfly/src/NumField.tsx      |     7 +-
 packages/uniforms-patternfly/src/TextField.tsx     |   209 +-
 .../src/__tests__/DateField.test.tsx               |   105 +-
 .../src/__tests__/NumField.test.tsx                |     7 +
 .../src/__tests__/TextField.test.tsx               |    80 +-
 packages/uniforms-patternfly/src/cjs               |     1 +
 packages/uniforms-patternfly/src/esm               |     1 +
 packages/unitables-dmn/package.json                |     1 +
 packages/unitables-dmn/src/DmnBoxedOutputs.tsx     |   252 -
 packages/unitables-dmn/src/DmnRunnerOutputs.tsx    |   201 +
 .../unitables-dmn/src/DmnRunnerOutputsTable.css    |    20 +
 .../unitables-dmn/src/DmnRunnerOutputsTable.tsx    |   326 +
 packages/unitables-dmn/src/DmnTableResults.tsx     |   126 -
 packages/unitables-dmn/src/DmnTypes.ts             |    43 -
 .../unitables-dmn/src/DmnUnitablesValidator.ts     |     4 +-
 packages/unitables-dmn/src/index.ts                |     2 +-
 .../src/uniforms/DmnUnitablesJsonSchemaBridge.ts   |    22 +-
 packages/unitables/package.json                    |     3 +
 packages/unitables/src/Unitables.css               |    24 +
 packages/unitables/src/Unitables.tsx               |   358 +-
 packages/unitables/src/UnitablesBoxedTypes.ts      |    43 -
 packages/unitables/src/UnitablesContext.tsx        |    41 +
 .../unitables/src/UnitablesContextProvider.tsx     |    37 +
 packages/unitables/src/UnitablesInputs.tsx         |   201 -
 packages/unitables/src/UnitablesRow.tsx            |   109 +-
 packages/unitables/src/UnitablesTypes.ts           |    39 +
 packages/unitables/src/UnitablesWrapper.tsx        |    61 +
 packages/unitables/src/bee/UnitablesBeeTable.tsx   |   519 +
 packages/unitables/src/bee/index.ts                |    17 +
 packages/unitables/src/boxed/CustomTable.css       |   128 -
 packages/unitables/src/boxed/CustomTable.tsx       |   337 -
 .../unitables/src/boxed/TableOperationHandler.ts   |    90 -
 packages/unitables/src/boxed/index.ts              |    17 -
 packages/unitables/src/index.ts                    |     4 +-
 packages/unitables/src/style.scss                  |     4 -
 .../src/uniforms/UnitablesJsonSchemaBridge.ts      |   167 -
 .../src/uniforms/UnitablesJsonSchemaBridge.tsx     |   159 +
 .../dashbuilder-editor-extension-smoke.test.ts     |     2 +
 .../it-tests/helpers/VSCodeTestHelper.ts           |    32 +
 .../package.json                                   |     6 +-
 .../it-tests/extension-editors-bpmn.test.ts        |     2 +
 .../it-tests/extension-editors-dmn.test.ts         |     7 +-
 .../it-tests/extension-editors-scesim.test.ts      |     2 +
 .../it-tests/extension-editors-smoke.test.ts       |     2 +
 .../it-tests/helpers/VSCodeTestHelper.ts           |    32 +
 .../it-tests/helpers/dmn/ExpressionEditorHelper.ts |    18 +-
 .../it-tests/helpers/dmn/ExpressionType.ts         |     2 +-
 .../package.json                                   |     6 +-
 .../it-tests/helpers/VSCodeTestHelper.ts           |    59 +-
 .../it-tests/helpers/swf/SwfEditorTestHelper.ts    |     2 +-
 .../autocompletion/autocompletion.sw.yaml          |     1 +
 .../autocompletion/autocompletion.sw.yaml.result   |    13 +-
 .../resources/expression/expression.sw.json        |    35 +
 .../resources/expression/expression.sw.yaml        |    22 +
 .../resources/expression/schema/schema.json        |    24 +
 .../resources/expression/specs/openapi.json        |    49 +
 ...orkflow-editor-extension-autocompletion.test.ts |    35 +-
 ...kflow-editor-extension-basic-operations.test.ts |     4 +-
 ...low-editor-extension-diagram-navigation.test.ts |    47 +-
 ...ss-workflow-editor-extension-expression.test.ts |    85 +
 ...ess-workflow-editor-extension-functions.test.ts |     2 +
 ...verless-workflow-editor-extension-smoke.test.ts |     2 +
 ...kflow-editor-extension-syntax-highlight.test.ts |     4 +-
 .../package.json                                   |     8 +-
 .../builtInVsCodeEditorSwfContributions.ts         |     2 +-
 .../src/extension/extension.ts                     |    11 +-
 .../it-tests/helpers/VSCodeTestHelper.ts           |    32 +
 .../it-tests/yard-editor.test.ts                   |     2 +
 packages/vscode-extension-yard-editor/package.json |     6 +-
 .../src/constants/ExtensionHelper.ts               |     8 +-
 .../src/context/WorkspacesContextProvider.tsx      |    37 +-
 .../WorkspaceFileRelativePathParser.ts             |    45 +-
 .../src/worker/WorkspacesSharedWorker.ts           |     4 +
 .../WorkspaceFileRelativePathParser.test.ts        |    12 +-
 .../src/decision/DecisionExpressionDefinitions.ts  |    54 +-
 packages/yard-editor/src/uiEditor/YardUIEditor.tsx |    21 +-
 pnpm-lock.yaml                                     |   393 +-
 repo/graph.dot                                     |    23 +-
 repo/graph.json                                    |    37 +-
 3998 files changed, 72884 insertions(+), 277290 deletions(-)


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 05/27: Merge remote-tracking branch 'kiegroup/main' into KOGITO-8015-feature-preview

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit d15d841ac9d900b2828467bb07df507d6502c4b5
Merge: 888e11c9f6 e3b20102d6
Author: Guilherme Caponetto <63...@users.noreply.github.com>
AuthorDate: Thu Feb 9 11:27:08 2023 -0300

    Merge remote-tracking branch 'kiegroup/main' into KOGITO-8015-feature-preview

 .ci/jenkins/Jenkinsfile                            |     4 +-
 .ci/jenkins/Jenkinsfile.vscode                     |    50 +-
 .github/actions/setup-env/action.yml               |     7 +-
 .../ci_sonar_analysis_stunner_editors.yml          |     4 +-
 .gitignore                                         |    10 -
 README.md                                          |     4 +-
 .../commit-message-validation-service/Makefile     |    29 +
 .../commit-message-validation-service/README.md    |    31 +
 .../commit-message-validation-service/env/index.js |    39 +
 examples/commit-message-validation-service/go.mod  |    29 +
 examples/commit-message-validation-service/go.sum  |   107 +
 examples/commit-message-validation-service/main.go |    44 +
 .../commit-message-validation-service/package.json |    41 +
 .../pkg/metadata/config.go                         |     7 +-
 .../pkg/validate.go                                |    56 +
 .../pkg/validators/issuePrefix.go                  |    47 +
 .../pkg/validators/length.go                       |    53 +
 .../pkg/validators/validator.go                    |    15 +-
 package.json                                       |     4 +-
 packages/.gitignore                                |     1 +
 packages/boxed-expression-component/package.json   |     4 +-
 .../dashbuilder-component-map/src/MapComponent.tsx |    11 +-
 .../dashbuilder-component-uniforms/package.json    |     2 +-
 packages/dashbuilder-editor/package.json           |     5 +-
 .../{editor => api}/DashbuilderEditorChannelApi.ts |     3 +-
 .../src/api}/index.ts                              |     2 +-
 .../src/editor/DashbuilderEditorFactory.ts         |     2 +-
 .../src/editor/DashbuilderEditorView.tsx           |     2 +-
 packages/dashbuilder-editor/src/editor/index.ts    |     2 +-
 .../src/impl/DashbuilderEditorChannelApiImpl.ts    |   109 +
 .../src/impl}/index.ts                             |     3 +-
 .../src/monaco/DashbuilderMonacoEditor.tsx         |    15 +-
 .../src/monaco/augmentation/codeLenses/index.ts    |    62 +
 .../src/monaco/augmentation/commands/index.ts      |    42 +
 .../src/monaco/augmentation/completion/index.ts    |   156 +
 .../language/schemas/dashbuilderSchema.ts          |   194 +-
 packages/dashbuilder-language-service/LICENSE      |   201 +
 packages/dashbuilder-language-service/README.md    |     1 +
 .../env/index.js}                                  |    13 +-
 .../jest.config.js}                                |    50 +-
 .../package.json                                   |    31 +-
 .../api/DashbuilderLanguageServiceChannelApi.ts    |    45 +
 .../src/api}/index.ts                              |     8 +-
 .../code-completions/dashbuilder-completion.ts     |    41 +
 .../src/assets/code-completions/index.ts           |     1 +
 .../src/assets/schemas/dashbuilder.ts}             |   194 +-
 .../src/assets/schemas}/index.ts                   |     4 +-
 .../src/channel/DashbuilderLanguageService.ts      |   259 +
 .../DashbuilderLanguageServiceCodeCompletion.ts    |    77 +
 .../DashbuilderLanguageServiceCodeLenses.ts        |    50 +
 .../src/channel/indentText.ts                      |    37 +
 .../src/channel}/index.ts                          |     5 +-
 .../src/channel/types.ts                           |    43 +
 .../tests/DashbuilderLanguageService.test.ts       |   115 +
 .../DashbuilderLanguageService.test.ts.snap        |   210 +
 .../tests/testUtils.ts                             |    48 +
 .../tsconfig.json                                  |     4 +-
 packages/dashbuilder-viewer/dev-webapp/App.tsx     |     5 +-
 .../displayer/client/widgets/DisplayerError.java   |    56 -
 .../client/widgets/DisplayerErrorWidget.html       |     1 +
 .../client/widgets/DisplayerErrorWidget.java       |    30 +-
 .../displayer/client/widgets/DisplayerViewer.java  |    45 +-
 .../renderer/client/metric/MetricDisplayer.java    |     1 -
 .../dashbuilder/client/RuntimeClientLoader.java    |    26 +-
 .../external/ExternalDataCallbackCoordinator.java  |   124 +
 .../external/ExternalDataSetClientProvider.java    |    90 +-
 .../client/navbar/DashboardListMenuBuilder.java    |    56 -
 .../client/resources/i18n/AppConstants.java        |     4 +
 .../dashbuilder/client/screens/EmptyScreen.java    |     9 +
 .../dashbuilder/client/screens/RouterScreen.java   |     9 +-
 .../client/screens/view/EmptyScreenView.java       |    10 +
 .../client/setup/RuntimeClientSetup.java           |     3 +
 .../dashbuilder/client/widgets/UploadWidget.java   |     2 +-
 .../client/widgets/view/DashboardCardView.css}     |    22 +-
 .../client/widgets/view/DashboardCardView.html     |     2 +-
 .../client/resources/i18n/AppConstants.properties  |     4 +-
 .../src/main/webapp/setup.js                       |     5 +-
 .../ExternalDataCallbackCoordinatorTest.java       |   144 +
 .../dataset/group/AggregateFunctionType.java       |     5 +-
 .../function/AggregateFunctionManagerImpl.java     |     1 +
 .../dataset/engine/function/MedianFunction.java    |    75 +
 .../engine/function/AggregateFunctionsTest.java    |    16 +
 .../env/index.js}                                  |    17 +-
 packages/dmn-language-service/jest.config.js       |    32 +
 .../{form => dmn-language-service}/package.json    |    30 +-
 packages/dmn-language-service/src/index.ts         |    93 +
 .../dmn-language-service/tests/fixtures/model.dmn  |    26 +
 .../dmn-language-service/tests/fixtures/nested.dmn |    24 +
 .../tests/fixtures/recursive.dmn                   |    25 +
 packages/dmn-language-service/tests/index.test.ts  |    93 +
 .../tsconfig.json                                  |     3 +-
 packages/extended-services/package.json            |     2 +-
 packages/form-dmn/package.json                     |     2 +-
 packages/form/package.json                         |     2 +-
 packages/form/src/FormHook.tsx                     |     2 +-
 packages/git-cors-proxy-image/env/index.js         |     2 +-
 packages/git-cors-proxy-image/package.json         |     2 +-
 packages/i18n-common-dictionary/src/names.ts       |     2 +
 .../it-tests/cypress/e2e/both-bpmn-dmn.cy.ts       |     6 +-
 .../it-tests/cypress/e2e/dmn-editable.cy.ts        |     6 +-
 packages/kie-editors-standalone/package.json       |     4 +-
 packages/kie-sandbox-image/README.md               |    99 +-
 packages/kn-plugin-workflow/README.md              |     2 +-
 packages/monaco-editor/package.json                |     2 +-
 packages/online-editor/build/defaultEnvJson.ts     |    23 +-
 packages/online-editor/env/index.js                |    12 +
 packages/online-editor/package.json                |     5 +-
 packages/online-editor/src/App.tsx                 |     4 +-
 .../switchExpression/switchExpression.test.ts      |    61 +
 .../online-editor/src/aboutModal/AboutButton.tsx   |   116 +
 .../online-editor/src/accounts/AccountsContext.tsx |    21 +
 .../online-editor/src/accounts/AccountsIcon.tsx    |    33 +-
 .../ConnectToGitSection.tsx}                       |   226 +-
 .../openshift/ConnectToOpenShiftSection.tsx        |     2 +-
 .../src/authProviders/AuthProvidersApi.ts          |    31 +-
 .../src/authProviders/AuthProvidersGallery.tsx     |    10 +
 .../src/authSessions/AuthSessionApi.ts             |     1 +
 .../src/authSessions/AuthSessionsContext.tsx       |    16 +-
 .../src/authSessions/AuthSessionsList.tsx          |     2 +-
 .../src/authSessions/CompatibleAuthSessions.ts     |     6 +-
 packages/online-editor/src/bitbucket/Hooks.tsx     |   230 +
 .../DmnRunnerInputsDispatchContextProvider.tsx     |     6 +
 .../src/dmnRunnerInputs/DmnRunnerInputsHook.tsx    |    32 +-
 .../src/editor/CreateGistOrSnippetModal.tsx        |   301 +
 .../src/editor/CreateGitHubRepositoryModal.tsx     |   225 -
 .../src/editor/CreateGitRepositoryModal.tsx        |   341 +
 .../src/editor/DeleteDropdownWithConfirmation.tsx  |     1 +
 .../src/editor/DmnRunner/DmnRunnerContext.tsx      |    12 +-
 .../src/editor/DmnRunner/DmnRunnerDockToggle.tsx   |    42 +-
 .../DmnRunner/DmnRunnerDrawerPanelContent.tsx      |    24 +-
 .../src/editor/DmnRunner/DmnRunnerLoading.tsx      |    48 +-
 .../src/editor/DmnRunner/DmnRunnerProvider.tsx     |   163 +-
 .../src/editor/DmnRunner/DmnRunnerStatus.ts        |     4 +-
 .../src/editor/DmnRunner/DmnRunnerTable.tsx        |    18 +-
 packages/online-editor/src/editor/EditorPage.tsx   |    42 +-
 .../src/editor/EditorPageDockDrawer.tsx            |    80 +-
 .../src/editor/EditorPageDockToggleItem.tsx        |    39 +
 .../online-editor/src/editor/EditorToolbar.tsx     |   726 +-
 packages/online-editor/src/editor/FileSwitcher.tsx |     2 +-
 .../KieSandboxExtendedServicesButtons.tsx          |     4 +-
 .../src/editor/LoadOrganizationsSelect.tsx         |   236 +
 .../src/editor/NewFileDropdownMenu.tsx             |    21 +-
 .../NotificationsPanelDockToggle.tsx               |    33 +-
 packages/online-editor/src/editor/Validation.tsx   |   133 +
 packages/online-editor/src/env/EnvJson.ts          |     2 +
 packages/online-editor/src/github/Hooks.tsx        |     6 +-
 packages/online-editor/src/home/HomePage.tsx       |     9 -
 packages/online-editor/src/home/UploadCard.tsx     |     2 +-
 packages/online-editor/src/i18n/OnlineI18n.ts      |   146 +-
 packages/online-editor/src/i18n/locales/en.ts      |   205 +-
 .../importFromUrl/ImportFromUrlHomePageCard.tsx    |     4 +-
 .../src/importFromUrl/ImportableUrlHooks.tsx       |   136 +-
 .../src/importFromUrl/NewWorkspaceFromUrlPage.tsx  |    38 +-
 .../src/importFromUrl/fetchSingleFileContent.ts    |    51 +-
 .../KieSandboxExtendedServicesClient.ts}           |    65 +-
 .../KieSandboxExtendedServicesContext.tsx          |     2 +
 .../KieSandboxExtendedServicesContextProvider.tsx  |     6 +-
 .../KieSandboxExtendedServicesIcon.tsx             |     4 +-
 .../KieSandboxExtendedServicesModal.tsx            |    40 +-
 packages/online-editor/src/navigation/Routes.ts    |    11 +-
 .../src/openshift/KieSandboxOpenShiftService.ts    |     1 -
 .../src/pageTemplate/OnlineEditorPage.tsx          |     4 +-
 .../src/switchExpression/switchExpression.ts       |    60 +
 .../CommitMessageValidationService.ts              |    51 +
 .../src/workspace/components/PromiseModal.tsx      |    87 +
 .../workspace/components/WorkspaceCommitModal.tsx  |   148 +
 .../src/workspace/components/WorkspaceLabel.tsx    |    92 +-
 .../components/WorkspaceStatusIndicator.tsx        |     2 +-
 ...ontextProviderWithCustomCommitMessagesModal.tsx |    53 +
 packages/online-editor/static/resources/style.css  |    49 +-
 packages/online-editor/webpack.config.ts           |    10 +
 packages/pmml-editor/package.json                  |     2 +-
 packages/root-env/env/index.js                     |     4 +-
 .../it-tests/e2e/TrySample.cy.ts                   |     8 +-
 packages/serverless-logic-web-tools/package.json   |     7 +-
 packages/serverless-logic-web-tools/src/App.tsx    |     5 +-
 .../Deploy/ConfirmOptions/SwfDeployOptions.tsx     |     2 +-
 .../src/editor/EditorPage.tsx                      |    36 +-
 .../DashbuilderLanguageServiceChannelApiImpl.ts    |    39 +
 .../editor/api/RemoteServiceRegistryCatalogApi.ts  |    10 +-
 .../src/editor/api/SwfServiceCatalogStore.ts       |    75 +-
 .../serviceRegistry/ServiceRegistrySettingsTab.tsx |     8 +-
 .../com/ait/lienzo/client/core/util/Geometry.java  |     7 +-
 .../ait/lienzo/test/stub/overlays/DomGlobal.java   |    26 +
 .../stunner/sw/client/shapes/StateShape.java       |    77 +-
 .../stunner/sw/client/shapes/StateShapeView.java   |    11 +-
 .../stunner/sw/client/shapes/StateShapeTest.java   |   241 +
 .../src/channel/SwfLanguageService.ts              |    13 +-
 .../channel/SwfLanguageServiceCodeCompletion.ts    |    13 +-
 .../tests/SwfLanguageServiceConfigs.ts             |     7 +-
 .../SwfJsonLanguageService.test.ts.snap            |    20 +-
 .../SwfYamlLanguageService.test.ts.snap            |    28 +-
 .../src/api/index.ts                               |     1 +
 .../src/api/types.ts                               |    25 +-
 .../src/channel/parsers/impl/SpecParser.ts}        |    22 +-
 .../parsers/impl/asyncapi/AsyncApiParser.ts        |    30 +
 .../src/channel/parsers/impl/asyncapi/asyncapi.ts  |   171 +
 .../src/channel/parsers/impl/asyncapi/types.ts     |   158 +
 .../src/channel/parsers/impl/convertSource.ts      |    32 +
 .../channel/parsers/impl/openapi/OpenApiParser.ts  |    30 +
 .../channel/parsers/{ => impl/openapi}/openapi.ts  |    50 +-
 .../src/channel/parsers/index.ts                   |     4 +-
 .../src/channel/parsers/parseApiContent.ts         |    53 +
 .../channel/parsers/asyncapi/asyncapi.test.ts      |    84 +
 .../tests/channel/parsers/examples/http.yaml       |    61 +
 .../tests/channel/parsers/examples/message.yaml    |    49 +
 .../channel/parsers/{ => openapi}/openapi.test.ts  |    49 +-
 .../tests/channel/parsers/parseApiContent.test.ts  |    63 +
 .../package.json                                   |     2 -
 .../src/swf/resources/SwfTextEditorResources.ts    |    11 +-
 .../editor/ScenarioSimulationEditorWrapper.java    |     6 +-
 .../client/editor/ScenarioSimulationView.java      |     4 +
 .../client/editor/ScenarioSimulationViewImpl.java  |    27 +
 .../client/models/AbstractScesimGridModel.java     |    14 +-
 .../i18n/ScenarioSimulationEditorConstants.java    |     4 +
 .../client/widgets/ScenarioGridPanel.java          |     2 +-
 .../ScenarioSimulationEditorConstants.properties   |     3 +
 .../client/models/AbstractScesimGridModelTest.java |    98 +-
 .../client/widgets/ScenarioGridPanelTest.java      |    15 +-
 .../kogito/client/docks/KogitoEditorDock.java      |     3 +
 .../ScenarioSimulationEditorKogitoWrapper.java     |    19 +-
 .../kogito/client/docks/KogitoEditorDockTest.java  |    29 +-
 .../ScenarioSimulationEditorKogitoWrapperTest.java |     9 +
 packages/stunner-editors/kie-wb-common-bom/pom.xml |    32 +-
 .../stunner-editors/kie-wb-common-dmn/README.md    |    41 +-
 .../kie-dmn-feel-gwt-functions/pom.xml             |    83 +
 .../feel/gwt/functions/api/FunctionDefinition.java |    42 +
 .../functions/api/FunctionDefinitionStrings.java}  |    29 +-
 .../functions/api/FunctionOverrideVariation.java   |    80 +
 .../dmn/feel/gwt/functions/api/HumanReadable.java} |    13 +-
 .../kie/dmn/feel/gwt/functions/api/Parameter.java} |    36 +-
 .../org/kie/dmn/feel/gwt/functions/api/Type.java}  |    44 +-
 .../functions/client/FEELFunctionProvider.java}    |    15 +-
 .../dmn/feel/gwt/functions/rebind/FileCreator.java |    88 +
 .../rebind/FunctionProviderGenerator.java          |    55 +
 .../feel/gwt/functions/rebind/MethodTemplates.java |   185 +
 .../gwt/functions/DMNFeelGWTFunctions.gwt.xml}     |    30 +-
 .../api/FunctionOverrideVariationTest.java         |    51 +
 .../feel/gwt/functions/rebind/FileCreatorTest.java |   111 +
 .../rebind/FunctionProviderGeneratorTest.java      |    89 +
 .../gwt/functions/rebind/MethodTemplatesTest.java  |   244 +
 .../kie-wb-common-dmn/kie-dmn-feel-gwt/pom.xml     |   120 +
 .../src/main/java/org/kie/dmn/feel/FEEL.java       |   189 +
 .../dmn/feel/codegen/feel11/CodegenStringUtil.java |    42 +
 .../feel11/CompiledFEELSemanticMappings.java       |    78 +
 .../feel/codegen/feel11/ProcessedExpression.java   |    78 +
 .../kie/dmn/feel/entrypoint/FEELEntryPoint.java}   |    17 +-
 .../org/kie/dmn/feel/lang/ast/ContextNode.java     |    98 +
 .../org/kie/dmn/feel/lang/ast/FunctionDefNode.java |   180 +
 .../org/kie/dmn/feel/lang/ast/InfixOpNode.java     |   418 +
 .../java/org/kie/dmn/feel/lang/ast/RangeNode.java  |   160 +
 .../ast/visitor/ASTTemporalConstantVisitor.java    |   234 +
 .../visitor/DMNDTAnalyserValueFromNodeVisitor.java |   191 +
 .../dmn/feel/lang/impl/EvaluationContextImpl.java  |   213 +
 .../java/org/kie/dmn/feel/lang/impl/FEELImpl.java  |   206 +
 .../lang/types/impl/ImmutableFPAWrappingPOJO.java  |    48 +
 .../dmn/feel/marshaller/FEELCodeMarshaller.java    |    69 +
 .../dmn/feel/marshaller/FEELStringMarshaller.java  |    94 +
 .../dmn/feel/parser/feel11/FEELErrorHandler.java}  |    19 +-
 .../org/kie/dmn/feel/parser/feel11/FEELParser.java |   153 +
 .../parser/feel11/FEELParserErrorListener.java     |   205 +
 .../kie/dmn/feel/parser/feel11/ParserHelper.java   |   355 +
 .../runtime/decisiontables/DecisionTableImpl.java  |    50 +
 .../feel/runtime/functions/BaseFEELFunction.java   |   612 +
 .../feel/runtime/functions/BuiltInFunctions.java   |    80 +
 .../runtime/functions/DateAndTimeFunction.java     |   195 +
 .../dmn/feel/runtime/functions/DateFunction.java   |   101 +
 .../feel/runtime/functions/DurationFunction.java   |    65 +
 .../feel/runtime/functions/MatchesFunction.java    |    54 +
 .../dmn/feel/runtime/functions/StringFunction.java |    50 +
 .../feel/runtime/functions/SubstringFunction.java  |    55 +
 .../dmn/feel/runtime/functions/TimeFunction.java   |   154 +
 .../runtime/functions/extended/InvokeFunction.java |    94 +
 .../extended/KieExtendedDMNFunctions.java          |    72 +
 .../org/kie/dmn/feel/runtime/impl/RangeImpl.java   |   161 +
 .../domino/logger/ConsoleLoggerAdapter.java        |   445 +
 .../org/kie/dmn/feel/super/org/slf4j/Logger.java   |   260 +
 .../org/kie/dmn/feel/util/AssignableFromUtil.java} |    22 +-
 .../java/org/kie/dmn/feel/util/EvalHelper.java     |   708 +
 .../src/main/java/org/kie/dmn/feel/util/Msg.java   |   150 +
 .../main/java/org/kie/dmn/feel/util/MsgUtil.java   |    41 +
 .../main/java/org/kie/dmn/feel/util/TypeUtil.java  |   320 +
 .../resources/org/kie/dmn/feel/DMNFeelGWT.gwt.xml  |    42 +
 .../kie/dmn/feel/util/AssignableFromUtilTest.java} |    51 +-
 .../test/resources/META-INF/ErraiApp.properties    |    19 +
 .../kie-wb-common-dmn-client/pom.xml               |    26 +-
 .../docks/navigator/DecisionNavigatorDock.java     |    16 +-
 .../client/docks/preview/PreviewDiagramDock.java   |    17 +-
 .../DecisionTableEditorDefinitionEnricher.java     |    87 +-
 .../editors/types/common/ItemDefinitionUtils.java  |     8 +
 .../common/typed/string/StringSelector.java        |     9 +-
 .../client/marshaller/DMNMarshallerService.java    |     8 +-
 .../dmn/client/widgets/panel/DMNGridPanel.java     |    17 -
 .../docks/navigator/DecisionNavigatorDockTest.java |    46 +-
 .../PreviewDiagramDockTest.java}                   |    89 +-
 .../DecisionTableEditorDefinitionEnricherTest.java |   177 +-
 .../types/common/ItemDefinitionUtilsTest.java      |    15 +
 .../common/typed/string/StringSelectorTest.java    |    24 +
 .../kie-wb-common-dmn-webapp-common/pom.xml        |   102 -
 .../main/resources/META-INF/ErraiApp.properties    |    31 -
 .../src/main/resources/META-INF/beans.xml          |    20 -
 .../dmn/webapp/common/DMNWebappCommon.gwt.xml      |    32 -
 .../kie-wb-common-dmn-webapp-kogito-common/pom.xml |    10 +-
 .../client/docks/KogitoDecisionNavigatorDock.java  |    96 -
 .../client/docks/KogitoPreviewDiagramDock.java     |    68 -
 .../common/client/docks/KogitoPropertiesDock.java  |    16 +-
 .../client/editor/AbstractDMNDiagramEditor.java    |    45 +-
 .../kogito/common/DMNWebappKogitoCommon.gwt.xml    |     1 -
 .../common/client/docks/BaseKogitoDockTest.java    |    38 +-
 .../docks/KogitoDecisionNavigatorDockTest.java     |    94 -
 .../client/docks/KogitoPreviewDiagramDockTest.java |    38 -
 .../editor/AbstractDMNDiagramEditorTest.java       |    53 +-
 .../pom.xml                                        |    42 +-
 .../showcase/client/editor/DMNDiagramEditor.java   |     2 +-
 .../src/main/webapp/static/sample.dmn              |     0
 .../src/main/webapp/test.html                      |    71 +-
 .../client/selenium/locator/CommonCSSLocator.java  |     4 +-
 .../README.md                                      |    49 -
 .../pom.xml                                        |   712 -
 .../client/alternatives/DMNClientModels.java       |   281 -
 .../alternatives/KogitoResourceContentService.java |    80 -
 .../showcase/client/editor/DMNDiagramEditor.java   |   246 -
 .../client/editor/DMNDiagramEditorActivity.java    |   128 -
 .../dmn/showcase/client/feel/FEELDemoEditor.java   |   201 -
 .../showcase/client/feel/FEELDemoEditorView.html   |    37 -
 .../showcase/client/feel/FEELDemoEditorView.java   |    95 -
 .../main/resources/META-INF/ErraiApp.properties    |    31 -
 .../src/main/resources/log4j.xml                   |    38 -
 .../src/main/resources/logback.xml                 |    34 -
 .../dmn/showcase/DMNKogitoTestingWebapp.gwt.xml    |    41 -
 .../src/main/webapp/WEB-INF/beans.xml              |    69 -
 .../webapp/WEB-INF/jboss-deployment-structure.xml  |    23 -
 .../src/main/webapp/WEB-INF/web.xml                |    27 -
 .../src/main/webapp/editor.html                    |    50 -
 .../src/main/webapp/favicon.ico                    |   Bin 494 -> 0 bytes
 .../src/main/webapp/index.html                     |    46 -
 .../src/main/webapp/model/readme.md                |     1 -
 .../src/main/webapp/static/test.js                 |    89 -
 packages/stunner-editors/kie-wb-common-dmn/pom.xml |     4 +-
 .../client/widgets/editor/StunnerEditor.java       |     1 +
 .../client/widgets/editor/StunnerEditorTest.java   |    20 +-
 .../command/impl/PasteSelectionSessionCommand.java |    25 +-
 .../impl/PasteSelectionSessionCommandTest.java     |    29 +-
 .../pom.xml                                        |    17 +
 .../marshall/service/BPMNClientDiagramService.java |     7 +-
 .../common/widgets/client/errorpage/ErrorPage.html |    13 +-
 .../common/widgets/client/errorpage/ErrorPage.java |    28 +-
 .../errorpage/{ErrorPage.css => ErrorPage.less}    |     6 +-
 .../search/component/SearchBarComponent.java       |     6 +
 .../search/component/SearchBarComponentView.java   |     9 +
 .../search/component/SearchBarComponentTest.java   |    10 +
 .../component/SearchBarComponentViewTest.java      |    20 +
 packages/stunner-editors/pom.xml                   |    37 +-
 .../uberfire/client/docks/view/DockResizeBar.java  |    11 +-
 .../org/uberfire/client/docks/view/DocksBars.java  |     4 +-
 .../client/docks/view/bars/DocksCollapsedBar.java  |     4 +-
 .../client/docks/view/bars/DocksExpandedBar.java   |    19 +-
 .../client/docks/view/items/AbstractDockItem.java  |     7 -
 .../docks/view/items/AbstractSideDockItem.java     |     2 -
 .../client/docks/view/items/SouthDockItem.java     |   109 -
 .../client/docks/view/items/SouthDockItem.ui.xml   |    23 -
 .../org/uberfire/client/resources/DocksCss.java    |    21 -
 .../org/uberfire/client/resources/css/docks.css    |    38 -
 .../docks/view/bars/DocksExpandedBarTest.java      |     4 +-
 .../docks/view/items/AbstractDockItemOuiaTest.java |    10 +-
 .../client/docks/view/items/SouthDockItemTest.java |   134 -
 .../client/widget/layer/impl/DefaultGridLayer.java |    46 +-
 .../widget/layer/impl/DefaultGridLayerTest.java    |    72 +-
 .../views/pfly/multipage/MultiPageEditorImpl.java  |     9 +
 .../views/pfly/tab/TabPanelWithDropdowns.java      |    39 +-
 .../pfly/multipage/MultiPageEditorImplTest.java    |    46 +
 .../views/pfly/tab/TabPanelWithDropdownsTest.java  |    18 +-
 .../workbench/docks/UberfireDockPosition.java      |    22 -
 .../workbench/docks/UberfireDocksContainer.java    |     8 +-
 .../widgets/multipage/MultiPageEditor.java         |     2 +
 .../client/workbench/docks/UberfireDockTest.java   |     8 +-
 packages/unitables-dmn/package.json                |     2 +-
 packages/unitables/package.json                    |     2 +-
 packages/unitables/src/boxed/CustomTable.tsx       |    12 +-
 .../package.json                                   |    40 +-
 .../src/debounce.ts}                               |    17 +-
 .../builtInVsCodeEditorDashbuilderContributions.ts |   224 +
 .../src/extension/commandIds.ts                    |     2 +
 .../src/extension/extension.ts                     |    12 +
 .../VsCodeDashbuilderLanguageService.ts            |    46 +
 .../src/extension/setupDashboardEditorControls.ts  |    17 +-
 .../tsconfig.json                                  |     3 +-
 .../package.json                                   |     2 +-
 .../.mocharc.json                                  |     3 +-
 .../README.md                                      |     4 +-
 .../it-tests/helpers/VSCodeTestHelper.ts           |     2 +-
 .../it-tests/helpers/swf/SwfEditorTestHelper.ts    |   128 +-
 .../applicant-request-decision.sw.json             |    59 +
 ...orkflow-editor-extension-autocompletion.test.ts |    12 +-
 ...kflow-editor-extension-basic-operations.test.ts |    12 +-
 ...low-editor-extension-diagram-navigation.test.ts |    77 +
 ...verless-workflow-editor-extension-smoke.test.ts |    10 +-
 .../it-tests/settings.json                         |     2 +-
 .../package.json                                   |     6 +-
 .../SwfServiceCatalogSupportActions.ts             |     4 +-
 .../fs/FsWatchingServiceCatalogRelativeStore.ts    |    19 +-
 .../ServiceRegistryInstanceClient.ts               |    49 +-
 .../extension/setupDiagramEditorCompanionTab.ts    |    11 +-
 .../vscode-extension-yard-editor/.mocharc.json     |     3 +-
 packages/vscode-extension-yard-editor/package.json |     2 +-
 .../src/VsCodeKieEditorsCustomEditorProvider.ts    |     2 +-
 .../pom.xml                                        |     4 +-
 packages/webpack-base/package.json                 |     2 +-
 .../src/context/WorkspacesContext.tsx              |     8 +-
 .../src/context/WorkspacesContextProvider.tsx      |    67 +-
 .../workspaces-git-fs/src/hooks/WorkspaceHooks.tsx |     7 +-
 .../src/services/WorkspaceDescriptorService.tsx    |    25 +-
 .../src/services/WorkspaceService.tsx              |     2 +-
 .../src/worker/WorkspacesWorkerApiImpl.ts          |    73 +-
 .../src/worker/api/WorkspaceOrigin.tsx             |    33 +-
 .../src/worker/api/WorkspacesWorkerGitApi.ts       |    19 +-
 pnpm-lock.yaml                                     | 20624 +++++++++++--------
 repo/graph.dot                                     |    15 +-
 repo/graph.json                                    |    30 +-
 scripts/bootstrap/bootstrap.js                     |     2 +-
 420 files changed, 29856 insertions(+), 14780 deletions(-)

diff --cc packages/serverless-logic-web-tools/package.json
index f023e2d7a8,75bd46dd96..f4be1a6cf8
--- a/packages/serverless-logic-web-tools/package.json
+++ b/packages/serverless-logic-web-tools/package.json
@@@ -16,14 -16,14 +16,15 @@@
    "main": "dist/index.js",
    "scripts": {
      "build:dev": "rimraf dist && webpack --env dev",
 -    "build:prod": "pnpm lint && pnpm test && rimraf dist && webpack && pnpm test:it",
 +    "build:prod": "pnpm lint && pnpm test && rimraf dist && webpack",
      "cy:open": "cypress open --project it-tests --config baseUrl=$(build-env serverlessLogicWebTools.dev.cypressUrl)",
      "cy:run": "cypress run --headed -b chrome --project it-tests --config baseUrl=$(build-env serverlessLogicWebTools.dev.cypressUrl)",
 +    "format": "prettier --write  './src/**/*.{tsx,ts,js}'",
      "lint": "run-script-if --bool \"$(build-env linters.run)\" --then \"kie-tools--eslint ./src\"",
+     "postreport": "jrm ./dist-it-tests/junit-transformed.xml \"./dist-it-tests/junit-report*.xml\"",
      "start": "webpack serve --host 0.0.0.0 --env dev",
      "test": "run-script-if --ignore-errors \"$(build-env tests.ignoreFailures)\" --bool \"$(build-env tests.run)\" --then \"jest --silent --verbose --passWithNoTests\"",
-     "test:it": "run-script-if --ignore-errors \"$(build-env integrationTests.ignoreFailures)\" --bool \"$(build-env integrationTests.run)\" --then  \"pnpm rimraf ./dist-it-tests\" \"pnpm start-server-and-test start https-get://0.0.0.0:$(build-env serverlessLogicWebTools.dev.port) cy:run\""
+     "test:it": "run-script-if --ignore-errors \"$(build-env integrationTests.ignoreFailures)\" --bool \"$(build-env integrationTests.run)\" --then  \"pnpm rimraf ./dist-it-tests\" \"pnpm start-server-and-test start https-get://0.0.0.0:$(build-env serverlessLogicWebTools.dev.port) cy:run\" \"pnpm postreport\""
    },
    "dependencies": {
      "@kie-tools-core/editor": "workspace:*",
diff --cc packages/serverless-logic-web-tools/src/App.tsx
index eb5d51eb35,f44b318453..6041811fe6
--- a/packages/serverless-logic-web-tools/src/App.tsx
+++ b/packages/serverless-logic-web-tools/src/App.tsx
@@@ -36,8 -35,10 +36,11 @@@ export const App = () => 
        [EnvContextProvider, {}],
        [KieSandboxExtendedServicesContextProvider, {}],
        [SettingsContextProvider, {}],
 +      [NewSettingsContextProvider, {}],
-       [WorkspacesContextProvider, { workspacesSharedWorkerScriptUrl: "workspace/worker/sharedWorker.js" }],
+       [
+         WorkspacesContextProvider,
+         { workspacesSharedWorkerScriptUrl: "workspace/worker/sharedWorker.js", shouldRequireCommitMessage: false },
+       ],
        [OpenShiftContextProvider, {}],
        [VirtualServiceRegistryContextProvider, {}],
        [NavigationContextProvider, {}],
diff --cc packages/serverless-logic-web-tools/src/editor/EditorPage.tsx
index 1380f6a45d,e52f11bc0c..fab131e3ac
--- a/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx
@@@ -31,9 -31,10 +31,9 @@@ import { useHistory } from "react-route
  import { AlertsController } from "../alerts/Alerts";
  import { LoadingSpinner } from "./LoadingSpinner";
  import { useEditorEnvelopeLocator } from "../envelopeLocator/EditorEnvelopeLocatorContext";
- import { isEditable, isServerlessWorkflow } from "../extension";
+ import { isDashbuilder, isEditable, isServerlessWorkflow } from "../extension";
  import { useAppI18n } from "../i18n";
  import { useRoutes } from "../navigation/Hooks";
 -import { OnlineEditorPage } from "../pageTemplate/OnlineEditorPage";
  import { useQueryParams } from "../queryParams/QueryParamsContext";
  import { useCancelableEffect } from "@kie-tools-core/react-hooks/dist/useCancelableEffect";
  import { useController } from "@kie-tools-core/react-hooks/dist/useController";
@@@ -386,56 -414,57 +413,55 @@@ export function EditorPage(props: Props
      },
      [swfEditorChannelApi]
    );
- 
    return (
 -    <OnlineEditorPage>
 -      <PromiseStateWrapper
 -        promise={workspaceFilePromise}
 -        pending={<LoadingSpinner />}
 -        rejected={(errors) => <EditorPageErrorPage errors={errors} path={props.fileRelativePath} />}
 -        resolved={(file) => (
 -          <>
 -            <Page>
 -              <EditorToolbar
 -                workspaceFile={file.workspaceFile}
 -                editor={editor}
 -                alerts={alerts}
 -                alertsRef={alertsRef}
 -                editorPageDock={editorPageDock}
 -              />
 -              <Divider />
 -              <EditorPageDockDrawer
 -                ref={editorPageDockRef}
 -                isEditorReady={editor?.isReady}
 -                workspaceFile={file.workspaceFile}
 -                onNotificationClick={onNotificationClick}
 -              >
 -                <PageSection hasOverflowScroll={true} padding={{ default: "noPadding" }}>
 -                  <div style={{ height: "100%" }}>
 -                    {!isEditorReady && <LoadingSpinner />}
 -                    <div style={{ display: isEditorReady ? "inline" : "none" }}>
 -                      {embeddedEditorFile && (
 -                        <EmbeddedEditor
 -                          /* FIXME: By providing a different `key` everytime, we avoid calling `setContent` twice on the same Editor.
 -                           * This is by design, and after setContent supports multiple calls on the same instance, we can remove that.
 -                           */
 -                          key={uniqueFileId}
 -                          ref={editorRef}
 -                          file={embeddedEditorFile}
 -                          editorEnvelopeLocator={editorEnvelopeLocator}
 -                          channelType={ChannelType.ONLINE_MULTI_FILE}
 -                          locale={locale}
 -                          customChannelApiImpl={apiImpl}
 -                          stateControl={stateControl}
 -                          isReady={isReady}
 -                        />
 -                      )}
 -                    </div>
 +    <PromiseStateWrapper
 +      promise={workspaceFilePromise}
 +      pending={<LoadingSpinner />}
 +      rejected={(errors) => <EditorPageErrorPage errors={errors} path={props.fileRelativePath} />}
 +      resolved={(file) => (
 +        <>
 +          <Page>
 +            <EditorToolbar
 +              workspaceFile={file.workspaceFile}
 +              editor={editor}
 +              alerts={alerts}
 +              alertsRef={alertsRef}
 +              editorPageDock={editorPageDock}
 +            />
 +            <Divider />
 +            <EditorPageDockDrawer
 +              ref={editorPageDockRef}
 +              isEditorReady={editor?.isReady}
 +              workspaceFile={file.workspaceFile}
 +              onNotificationClick={onNotificationClick}
 +            >
 +              <PageSection hasOverflowScroll={true} padding={{ default: "noPadding" }}>
 +                <div style={{ height: "100%" }}>
 +                  {!isEditorReady && <LoadingSpinner />}
 +                  <div style={{ display: isEditorReady ? "inline" : "none" }}>
 +                    {embeddedEditorFile && (
 +                      <EmbeddedEditor
 +                        /* FIXME: By providing a different `key` everytime, we avoid calling `setContent` twice on the same Editor.
 +                         * This is by design, and after setContent supports multiple calls on the same instance, we can remove that.
 +                         */
 +                        key={uniqueFileId}
 +                        ref={editorRef}
 +                        file={embeddedEditorFile}
 +                        editorEnvelopeLocator={editorEnvelopeLocator}
 +                        channelType={ChannelType.ONLINE_MULTI_FILE}
 +                        locale={locale}
 +                        customChannelApiImpl={apiImpl}
 +                        stateControl={stateControl}
 +                        isReady={isReady}
 +                      />
 +                    )}
                    </div>
 -                </PageSection>
 -              </EditorPageDockDrawer>
 -            </Page>
 -          </>
 -        )}
 -      />
 -    </OnlineEditorPage>
 +                </div>
 +              </PageSection>
 +            </EditorPageDockDrawer>
 +          </Page>
 +        </>
 +      )}
 +    />
    );
  }
diff --cc pnpm-lock.yaml
index 72a47a3011,944702b941..b6ab909f03
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@@ -11747,13 -14470,15 +14470,13 @@@ packages
      resolution:
        { integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== }
      engines: { node: ">=0.10.0" }
 -    dev: true
  
-   /ansi-regex/3.0.1:
+   /ansi-regex@3.0.1:
      resolution:
        { integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== }
      engines: { node: ">=4" }
 -    dev: true
  
-   /ansi-regex/5.0.1:
+   /ansi-regex@5.0.1:
      resolution:
        { integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== }
      engines: { node: ">=8" }
@@@ -13257,8 -15983,9 +15981,8 @@@
      resolution:
        { integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== }
      engines: { node: ">=0.10.0" }
 -    dev: true
  
-   /collect-v8-coverage/1.0.1:
+   /collect-v8-coverage@1.0.1:
      resolution:
        { integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== }
      dev: true
@@@ -13367,8 -16100,9 +16097,8 @@@
      resolution:
        { integrity: sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw== }
      engines: { node: ^12.20.0 || >=14 }
 -    dev: true
  
-   /common-tags/1.8.0:
+   /common-tags@1.8.0:
      resolution:
        { integrity: sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== }
      engines: { node: ">=4.0.0" }
@@@ -14772,8 -17528,9 +17524,8 @@@
      resolution:
        { integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== }
      engines: { node: ">=0.10.0" }
 -    dev: true
  
-   /decamelize/4.0.0:
+   /decamelize@4.0.0:
      resolution:
        { integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== }
      engines: { node: ">=10" }
@@@ -18341,14 -21045,9 +21040,14 @@@
      engines: { node: ">=0.10.0" }
      dependencies:
        number-is-nan: 1.0.1
 -    dev: true
 +
 +  /is-fullwidth-code-point/2.0.0:
 +    resolution:
 +      { integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== }
 +    engines: { node: ">=4" }
 +    dev: false
  
-   /is-fullwidth-code-point/3.0.0:
+   /is-fullwidth-code-point@3.0.0:
      resolution:
        { integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== }
      engines: { node: ">=8" }
@@@ -18499,8 -21199,9 +21199,8 @@@
      resolution:
        { integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== }
      engines: { node: ">=0.10.0" }
 -    dev: true
  
-   /is-stream/2.0.0:
+   /is-stream@2.0.0:
      resolution:
        { integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== }
      engines: { node: ">=8" }
@@@ -18584,11 -21279,12 +21278,11 @@@
      engines: { node: ">= 8.0.0" }
      dev: true
  
-   /isexe/2.0.0:
+   /isexe@2.0.0:
      resolution:
        { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== }
 -    dev: true
  
-   /isobject/2.1.0:
+   /isobject@2.1.0:
      resolution:
        { integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== }
      engines: { node: ">=0.10.0" }
@@@ -20358,15 -23052,9 +23050,15 @@@
      resolution:
        { integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== }
      engines: { node: ">=8" }
 -    dev: true
 +
 +  /lru-cache/4.1.5:
 +    resolution:
 +      { integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== }
 +    dependencies:
 +      pseudomap: 1.0.2
 +      yallist: 2.1.2
  
-   /lru-cache/6.0.0:
+   /lru-cache@6.0.0:
      resolution:
        { integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== }
      engines: { node: ">=10" }
@@@ -21517,8 -24196,9 +24200,8 @@@
      engines: { node: ">=4" }
      dependencies:
        path-key: 2.0.1
 -    dev: true
  
-   /npm-run-path/4.0.1:
+   /npm-run-path@4.0.1:
      resolution:
        { integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== }
      engines: { node: ">=8" }
@@@ -21558,8 -24238,9 +24241,8 @@@
      resolution:
        { integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== }
      engines: { node: ">=0.10.0" }
 -    dev: true
  
-   /numeral/2.0.6:
+   /numeral@2.0.6:
      resolution:
        { integrity: sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA== }
      dev: false
@@@ -21855,8 -24515,9 +24517,8 @@@
      resolution:
        { integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== }
      engines: { node: ">=4" }
 -    dev: true
  
-   /p-finally/2.0.1:
+   /p-finally@2.0.1:
      resolution:
        { integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== }
      engines: { node: ">=8" }
@@@ -22193,8 -24830,9 +24831,8 @@@
      resolution:
        { integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== }
      engines: { node: ">=4" }
 -    dev: true
  
-   /path-exists/4.0.0:
+   /path-exists@4.0.0:
      resolution:
        { integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== }
      engines: { node: ">=8" }
@@@ -22210,8 -24848,9 +24848,8 @@@
      resolution:
        { integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== }
      engines: { node: ">=4" }
 -    dev: true
  
-   /path-key/3.1.1:
+   /path-key@3.1.1:
      resolution:
        { integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== }
      engines: { node: ">=8" }
@@@ -24531,13 -27189,16 +27188,15 @@@
        escape-html: 1.0.3
        parseurl: 1.3.3
        send: 0.17.1
+     transitivePeerDependencies:
+       - supports-color
      dev: true
  
-   /set-blocking/2.0.0:
+   /set-blocking@2.0.0:
      resolution:
        { integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== }
 -    dev: true
  
-   /set-immediate-shim/1.0.1:
+   /set-immediate-shim@1.0.1:
      resolution:
        { integrity: sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ== }
      engines: { node: ">=0.10.0" }
@@@ -24602,8 -27262,9 +27260,8 @@@
      engines: { node: ">=0.10.0" }
      dependencies:
        shebang-regex: 1.0.0
 -    dev: true
  
-   /shebang-command/2.0.0:
+   /shebang-command@2.0.0:
      resolution:
        { integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== }
      engines: { node: ">=8" }
@@@ -24615,8 -27276,9 +27273,8 @@@
      resolution:
        { integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== }
      engines: { node: ">=0.10.0" }
 -    dev: true
  
-   /shebang-regex/3.0.0:
+   /shebang-regex@3.0.0:
      resolution:
        { integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== }
      engines: { node: ">=8" }
@@@ -25204,17 -27852,9 +27848,17 @@@
        code-point-at: 1.1.0
        is-fullwidth-code-point: 1.0.0
        strip-ansi: 3.0.1
 -    dev: true
 +
 +  /string-width/2.1.1:
 +    resolution:
 +      { integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== }
 +    engines: { node: ">=4" }
 +    dependencies:
 +      is-fullwidth-code-point: 2.0.0
 +      strip-ansi: 4.0.0
 +    dev: false
  
-   /string-width/4.2.3:
+   /string-width@4.2.3:
      resolution:
        { integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== }
      engines: { node: ">=8" }
@@@ -25275,16 -27915,9 +27919,16 @@@
      engines: { node: ">=0.10.0" }
      dependencies:
        ansi-regex: 2.1.1
 -    dev: true
 +
 +  /strip-ansi/4.0.0:
 +    resolution:
 +      { integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== }
 +    engines: { node: ">=4" }
 +    dependencies:
 +      ansi-regex: 3.0.1
 +    dev: false
  
-   /strip-ansi/6.0.1:
+   /strip-ansi@6.0.1:
      resolution:
        { integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== }
      engines: { node: ">=8" }
@@@ -25316,8 -27949,9 +27960,8 @@@
      resolution:
        { integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== }
      engines: { node: ">=0.10.0" }
 -    dev: true
  
-   /strip-final-newline/2.0.0:
+   /strip-final-newline@2.0.0:
      resolution:
        { integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== }
      engines: { node: ">=6" }
@@@ -27535,18 -30144,20 +30154,18 @@@
        is-symbol: 1.0.4
      dev: true
  
-   /which-module/2.0.0:
+   /which-module@2.0.0:
      resolution:
        { integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== }
 -    dev: true
  
-   /which/1.3.1:
+   /which@1.3.1:
      resolution:
        { integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== }
      hasBin: true
      dependencies:
        isexe: 2.0.0
 -    dev: true
  
-   /which/2.0.2:
+   /which@2.0.2:
      resolution:
        { integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== }
      engines: { node: ">= 8" }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 07/27: KOGITO-8628: Remove old settings modal (#1457)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit e0d6379b2a685b690485aa331932bbec7af9a943
Author: Fabrizio Antonangeli <fa...@gmail.com>
AuthorDate: Fri Feb 10 11:16:00 2023 +0100

    KOGITO-8628: Remove old settings modal (#1457)
    
    * Replaced use of old settings components
    
    * Removed old settings dir
    
    * Empty commit
    
    * Fix lint warnings
---
 packages/serverless-logic-web-tools/src/App.tsx    |   2 -
 .../src/editor/Deploy/DeployDropdownItems.tsx      |   9 +-
 .../src/editor/EditorToolbar.tsx                   |  27 +-
 .../src/homepage/pageTemplate/OnlineEditorPage.tsx |   2 +-
 .../KieSandboxExtendedServicesIcon.tsx             |  10 +-
 .../src/navigation/RoutesSwitch.tsx                |   2 +-
 .../src/newSettings/SettingsButton.tsx             |  35 ---
 .../src/newSettings/SettingsContext.tsx            | 322 --------------------
 .../featurePreview/FeaturePreviewConfig.tsx        |  42 ---
 .../src/newSettings/github/Hooks.tsx               |  34 ---
 .../src/newSettings/kafka/KafkaSettingsConfig.tsx  |  70 -----
 .../openshift/OpenShiftSettingsConfig.tsx          |  58 ----
 .../serviceAccount/ServiceAccountConfig.tsx        |  66 ----
 .../serviceRegistry/ServiceRegistryConfig.tsx      |  66 ----
 .../dropdown/OpenshiftDeploymentsDropdown.tsx      |   8 +-
 .../src/settings/SettingsButton.tsx                |  17 +-
 .../src/settings/SettingsContext.tsx               |  79 +----
 .../src/settings/SettingsModalBody.tsx             | 100 -------
 .../KieSandboxExtendedServicesSettings.tsx         |   0
 .../KieSandboxExtendedServicesSettingsTab.tsx      | 225 --------------
 .../featurePreview/FeaturePreviewConfig.tsx        |   2 +-
 .../featurePreview/FeaturePreviewSettings.tsx      |   0
 .../featurePreview/FeaturePreviewSettingsTab.tsx   |  71 -----
 .../github/GitHubSettings.tsx                      |   0
 .../src/settings/github/GitHubSettingsTab.tsx      | 216 --------------
 .../kafka/ApacheKafkaSettings.tsx                  |   0
 .../src/settings/kafka/ApacheKafkaSettingsTab.tsx  | 246 ---------------
 .../openshift/OpenShiftSettings.tsx                |   0
 .../openshift/OpenShiftSettingsSimpleConfig.tsx    |   0
 .../settings/openshift/OpenShiftSettingsTab.tsx    |  88 ------
 .../openshift/OpenShiftSettingsTabSimpleConfig.tsx | 332 ---------------------
 .../routes/SettingsPageRoutes.tsx                  |   0
 .../serviceAccount/ServiceAccountConfig.tsx        |   2 +-
 .../serviceAccount/ServiceAccountSettings.tsx      |   0
 .../serviceAccount/ServiceAccountSettingsTab.tsx   | 261 ----------------
 .../serviceRegistry/ServiceRegistryConfig.tsx      |   2 +-
 .../serviceRegistry/ServiceRegistrySettings.tsx    |   7 +-
 .../serviceRegistry/ServiceRegistrySettingsTab.tsx | 257 ----------------
 .../src/{newSettings => settings}/types.ts         |   0
 .../uiNav/SettingsPageNav.tsx                      |   0
 40 files changed, 59 insertions(+), 2599 deletions(-)

diff --git a/packages/serverless-logic-web-tools/src/App.tsx b/packages/serverless-logic-web-tools/src/App.tsx
index 6041811fe6..f44b318453 100644
--- a/packages/serverless-logic-web-tools/src/App.tsx
+++ b/packages/serverless-logic-web-tools/src/App.tsx
@@ -24,7 +24,6 @@ import { NavigationContextProvider } from "./navigation/NavigationContextProvide
 import { RoutesSwitch } from "./navigation/RoutesSwitch";
 import { OpenShiftContextProvider } from "./openshift/OpenShiftContextProvider";
 import { SettingsContextProvider } from "./settings/SettingsContext";
-import { SettingsContextProvider as NewSettingsContextProvider } from "./newSettings/SettingsContext";
 import { VirtualServiceRegistryContextProvider } from "./virtualServiceRegistry/VirtualServiceRegistryContextProvider";
 import { WorkspacesContextProvider } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContextProvider";
 
@@ -36,7 +35,6 @@ export const App = () => (
       [EnvContextProvider, {}],
       [KieSandboxExtendedServicesContextProvider, {}],
       [SettingsContextProvider, {}],
-      [NewSettingsContextProvider, {}],
       [
         WorkspacesContextProvider,
         { workspacesSharedWorkerScriptUrl: "workspace/worker/sharedWorker.js", shouldRequireCommitMessage: false },
diff --git a/packages/serverless-logic-web-tools/src/editor/Deploy/DeployDropdownItems.tsx b/packages/serverless-logic-web-tools/src/editor/Deploy/DeployDropdownItems.tsx
index aa55b29edb..cf7fb21ca7 100644
--- a/packages/serverless-logic-web-tools/src/editor/Deploy/DeployDropdownItems.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/Deploy/DeployDropdownItems.tsx
@@ -34,15 +34,16 @@ import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServic
 import { useOpenShift } from "../../openshift/OpenShiftContext";
 import { OpenShiftInstanceStatus } from "../../openshift/OpenShiftInstanceStatus";
 import { useSettings, useSettingsDispatch } from "../../settings/SettingsContext";
-import { SettingsTabs } from "../../settings/SettingsModalBody";
 import { useVirtualServiceRegistryDependencies } from "../../virtualServiceRegistry/hooks/useVirtualServiceRegistryDependencies";
 import { FileLabel } from "../../workspace/components/FileLabel";
 import { ActiveWorkspace } from "@kie-tools-core/workspaces-git-fs/dist/model/ActiveWorkspace";
+import { useHistory } from "react-router";
+import { routes } from "../../navigation/Routes";
 
 export function useDeployDropdownItems(props: { workspace: ActiveWorkspace }) {
   const { i18n } = useAppI18n();
   const settings = useSettings();
-  const settingsDispatch = useSettingsDispatch();
+  const history = useHistory();
   const kieSandboxExtendedServices = useKieSandboxExtendedServices();
   const openshift = useOpenShift();
   const { needsDependencyDeployment } = useVirtualServiceRegistryDependencies({
@@ -60,8 +61,8 @@ export function useDeployDropdownItems(props: { workspace: ActiveWorkspace }) {
   );
 
   const onSetup = useCallback(() => {
-    settingsDispatch.open(SettingsTabs.OPENSHIFT);
-  }, [settingsDispatch]);
+    history.push(routes.settings.openshift.path({}));
+  }, [history]);
 
   const onDeploy = useCallback(() => {
     if (isKieSandboxExtendedServicesRunning) {
diff --git a/packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx b/packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx
index d1d2620bf8..20348a49c8 100644
--- a/packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx
@@ -71,7 +71,6 @@ import {
 import { useCancelableEffect } from "@kie-tools-core/react-hooks/dist/useCancelableEffect";
 import { useGitHubAuthInfo } from "../settings/github/Hooks";
 import { AuthStatus, GithubScopes, useSettings, useSettingsDispatch } from "../settings/SettingsContext";
-import { SettingsTabs } from "../settings/SettingsModalBody";
 import { FileLabel } from "../workspace/components/FileLabel";
 import { WorkspaceLabel } from "../workspace/components/WorkspaceLabel";
 import { PromiseStateWrapper } from "@kie-tools-core/react-hooks/dist/PromiseState";
@@ -94,6 +93,8 @@ import { WorkspaceStatusIndicator } from "../workspace/components/WorkspaceStatu
 import { WorkspaceKind } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceOrigin";
 import { useEditorEnvelopeLocator } from "../envelopeLocator/EditorEnvelopeLocatorContext";
 import { UrlType, useImportableUrl } from "../workspace/hooks/ImportableUrlHooks";
+import { Link } from "react-router-dom";
+import { routes } from "../navigation/Routes";
 
 export interface Props {
   alerts: AlertsController | undefined;
@@ -727,10 +728,12 @@ If you are, it means that creating this Gist failed and it can safely be deleted
               {!canPushToGitRepository && (
                 <>
                   <Divider />
-                  <DropdownItem onClick={() => settingsDispatch.open(SettingsTabs.GITHUB)}>
-                    <Button isInline={true} variant={ButtonVariant.link}>
-                      Configure GitHub token...
-                    </Button>
+                  <DropdownItem>
+                    <Link to={routes.settings.github.path({})}>
+                      <Button isInline={true} variant={ButtonVariant.link}>
+                        Configure GitHub token...
+                      </Button>
+                    </Link>
                   </DropdownItem>
                 </>
               )}
@@ -748,7 +751,7 @@ If you are, it means that creating this Gist failed and it can safely be deleted
       downloadWorkspaceZip,
       i18n,
       canCreateGitRepository,
-      settingsDispatch,
+      routes,
     ]
   );
 
@@ -1072,7 +1075,7 @@ If you are, it means that creating this Gist failed and it can safely be deleted
                 )}
 
                 {!canPushToGitRepository && (
-                  <AlertActionLink onClick={() => settingsDispatch.open(SettingsTabs.GITHUB)}>
+                  <AlertActionLink onClick={() => history.push(routes.settings.github.path({}))}>
                     {`Configure GitHub token...`}
                   </AlertActionLink>
                 )}
@@ -1088,7 +1091,7 @@ If you are, it means that creating this Gist failed and it can safely be deleted
           </Alert>
         );
       },
-      [canPushToGitRepository, pushNewBranch, settingsDispatch, workspacePromise]
+      [canPushToGitRepository, pushNewBranch, workspacePromise, history, routes]
     )
   );
 
@@ -1603,7 +1606,7 @@ If you are, it means that creating this Gist failed and it can safely be deleted
                                   {!canPushToGitRepository && (
                                     <>
                                       <Divider />
-                                      <DropdownItem onClick={() => settingsDispatch.open(SettingsTabs.GITHUB)}>
+                                      <DropdownItem onClick={() => history.push(routes.settings.github.path({}))}>
                                         <Button isInline={true} variant={ButtonVariant.link}>
                                           Configure GitHub token...
                                         </Button>
@@ -1661,7 +1664,7 @@ If you are, it means that creating this Gist failed and it can safely be deleted
                                   {!canPushToGitRepository && (
                                     <>
                                       <Divider />
-                                      <DropdownItem onClick={() => settingsDispatch.open(SettingsTabs.GITHUB)}>
+                                      <DropdownItem onClick={() => history.push(routes.settings.github.path({}))}>
                                         <Button isInline={true} variant={ButtonVariant.link}>
                                           Configure GitHub token...
                                         </Button>
@@ -1752,7 +1755,7 @@ export function PushToGitHubAlertActionLinks(props: {
   kind?: WorkspaceKind;
   remoteRef?: string;
 }) {
-  const settingsDispatch = useSettingsDispatch();
+  const history = useHistory();
 
   if (props.kind === WorkspaceKind.GIT && !props.remoteRef) {
     throw new Error("Should specify remoteRef for GIT workspaces");
@@ -1761,7 +1764,7 @@ export function PushToGitHubAlertActionLinks(props: {
   return (
     <>
       {!props.canPush && (
-        <AlertActionLink onClick={() => settingsDispatch.open(SettingsTabs.GITHUB)}>
+        <AlertActionLink onClick={() => history.push(routes.settings.github.path({}))}>
           {`Configure GitHub token...`}
         </AlertActionLink>
       )}
diff --git a/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx b/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
index af763471da..4251df69db 100644
--- a/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
@@ -39,7 +39,7 @@ import { useHistory, useRouteMatch } from "react-router";
 import { useLocation } from "react-router-dom";
 import { KieSandboxExtendedServicesIcon } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesIcon";
 import { useRoutes } from "../../navigation/Hooks";
-import { SettingsPageNav } from "../../newSettings/uiNav/SettingsPageNav";
+import { SettingsPageNav } from "../../settings/uiNav/SettingsPageNav";
 import { OpenshiftDeploymentsDropdown } from "../../openshift/dropdown/OpenshiftDeploymentsDropdown";
 import {
   ApplicationServicesIntegrationQuickStart,
diff --git a/packages/serverless-logic-web-tools/src/kieSandboxExtendedServices/KieSandboxExtendedServicesIcon.tsx b/packages/serverless-logic-web-tools/src/kieSandboxExtendedServices/KieSandboxExtendedServicesIcon.tsx
index 80c1653d69..5e0b060b95 100644
--- a/packages/serverless-logic-web-tools/src/kieSandboxExtendedServices/KieSandboxExtendedServicesIcon.tsx
+++ b/packages/serverless-logic-web-tools/src/kieSandboxExtendedServices/KieSandboxExtendedServicesIcon.tsx
@@ -23,18 +23,18 @@ import { KieSandboxExtendedServicesStatus } from "./KieSandboxExtendedServicesSt
 import { ConnectedIcon } from "@patternfly/react-icons/dist/js/icons/connected-icon";
 import { DisconnectedIcon } from "@patternfly/react-icons/dist/js/icons/disconnected-icon";
 import { useKieSandboxExtendedServices } from "./KieSandboxExtendedServicesContext";
-import { useSettingsDispatch } from "../settings/SettingsContext";
-import { SettingsTabs } from "../settings/SettingsModalBody";
 import { useAppI18n } from "../i18n";
+import { routes } from "../navigation/Routes";
+import { useHistory } from "react-router";
 
 export function KieSandboxExtendedServicesIcon() {
   const kieSandboxExtendedServices = useKieSandboxExtendedServices();
   const { i18n } = useAppI18n();
-  const settingsDispatch = useSettingsDispatch();
+  const history = useHistory();
 
   const toggleKieSandboxExtendedServices = useCallback(() => {
     if (kieSandboxExtendedServices.status === KieSandboxExtendedServicesStatus.RUNNING) {
-      settingsDispatch.open(SettingsTabs.KIE_SANDBOX_EXTENDED_SERVICES);
+      history.push(routes.settings.kie_sandbox_extended_services.path({}));
     }
 
     if (!kieSandboxExtendedServices.outdated) {
@@ -42,7 +42,7 @@ export function KieSandboxExtendedServicesIcon() {
     }
     kieSandboxExtendedServices.setInstallTriggeredBy(undefined);
     kieSandboxExtendedServices.setModalOpen(true);
-  }, [settingsDispatch, kieSandboxExtendedServices]);
+  }, [kieSandboxExtendedServices, history]);
 
   const dropdownToggleIcon = useMemo(
     () => (
diff --git a/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx b/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx
index e4a33a202d..b4e2b5021c 100644
--- a/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx
+++ b/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx
@@ -21,7 +21,7 @@ import { useRoutes } from "./Hooks";
 import { OnlineEditorPage } from "../homepage/pageTemplate/OnlineEditorPage";
 import { Label } from "@patternfly/react-core/dist/js/components/Label";
 import { HomePageRoutes } from "../homepage/routes/HomePageRoutes";
-import { SettingsPageRoutes } from "../newSettings/routes/SettingsPageRoutes";
+import { SettingsPageRoutes } from "../settings/routes/SettingsPageRoutes";
 
 export function RoutesSwitch() {
   const routes = useRoutes();
diff --git a/packages/serverless-logic-web-tools/src/newSettings/SettingsButton.tsx b/packages/serverless-logic-web-tools/src/newSettings/SettingsButton.tsx
deleted file mode 100644
index 7b1cde4e00..0000000000
--- a/packages/serverless-logic-web-tools/src/newSettings/SettingsButton.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2021 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import * as React from "react";
-import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
-import { CogIcon } from "@patternfly/react-icons/dist/js/icons/cog-icon";
-import { useSettingsDispatch } from "./SettingsContext";
-import { Link } from "react-router-dom";
-import { useRoutes } from "../navigation/Hooks";
-
-export function SettingsButton() {
-  const settingsDispatch = useSettingsDispatch();
-  const routes = useRoutes();
-
-  return (
-    <Link to={routes.settings.home.path({})}>
-      <Button variant={ButtonVariant.plain} aria-label="Settings" className={"kie-tools--masthead-hoverable-dark"}>
-        <CogIcon />
-      </Button>
-    </Link>
-  );
-}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/SettingsContext.tsx b/packages/serverless-logic-web-tools/src/newSettings/SettingsContext.tsx
deleted file mode 100644
index 76a2eeb0bf..0000000000
--- a/packages/serverless-logic-web-tools/src/newSettings/SettingsContext.tsx
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * Copyright 2023 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { OpenShiftConnection } from "@kie-tools-core/openshift/dist/service/OpenShiftConnection";
-import { OpenShiftService } from "@kie-tools-core/openshift/dist/service/OpenShiftService";
-import { Octokit } from "@octokit/rest";
-import * as React from "react";
-import { useContext, useEffect, useMemo, useState } from "react";
-import { getCookie, setCookie } from "../cookies";
-import { SwfServiceCatalogStore } from "../editor/api/SwfServiceCatalogStore";
-import { useKieSandboxExtendedServices } from "../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
-import { KieSandboxExtendedServicesStatus } from "../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
-import { OpenShiftInstanceStatus } from "../openshift/OpenShiftInstanceStatus";
-import { FeaturePreviewSettingsConfig, readFeaturePreviewConfigCookie } from "./featurePreview/FeaturePreviewConfig";
-import { GITHUB_AUTH_TOKEN_COOKIE_NAME } from "./github/GitHubSettings";
-import { KafkaSettingsConfig, readKafkaConfigCookie } from "./kafka/KafkaSettingsConfig";
-import { readOpenShiftConfigCookie } from "./openshift/OpenShiftSettingsConfig";
-import { readServiceAccountConfigCookie, ServiceAccountSettingsConfig } from "./serviceAccount/ServiceAccountConfig";
-import {
-  readServiceRegistryConfigCookie,
-  ServiceRegistrySettingsConfig,
-} from "./serviceRegistry/ServiceRegistryConfig";
-
-export enum AuthStatus {
-  SIGNED_OUT,
-  TOKEN_EXPIRED,
-  LOADING,
-  SIGNED_IN,
-}
-
-export enum GithubScopes {
-  GIST = "gist",
-  REPO = "repo",
-}
-
-interface GithubUser {
-  login: string;
-  name: string;
-  email: string;
-}
-
-export class ExtendedServicesConfig {
-  constructor(public readonly host: string, public readonly port: string) {}
-
-  public buildUrl(): string {
-    if (this.port.trim().length === 0) {
-      return this.host;
-    }
-    return `${this.host}:${this.port}`;
-  }
-}
-
-export interface SettingsContextType {
-  openshift: {
-    status: OpenShiftInstanceStatus;
-    config: OpenShiftConnection;
-  };
-  kieSandboxExtendedServices: {
-    config: ExtendedServicesConfig;
-  };
-  github: {
-    token?: string;
-    user?: GithubUser;
-    scopes?: string[];
-    authStatus: AuthStatus;
-  };
-  apacheKafka: {
-    config: KafkaSettingsConfig;
-  };
-  serviceAccount: {
-    config: ServiceAccountSettingsConfig;
-  };
-  serviceRegistry: {
-    config: ServiceRegistrySettingsConfig;
-  };
-  featurePreview: {
-    config: FeaturePreviewSettingsConfig;
-  };
-}
-
-export interface SettingsDispatchContextType {
-  openshift: {
-    service: OpenShiftService;
-    setStatus: React.Dispatch<React.SetStateAction<OpenShiftInstanceStatus>>;
-    setConfig: React.Dispatch<React.SetStateAction<OpenShiftConnection>>;
-  };
-  kieSandboxExtendedServices: {
-    setConfig: React.Dispatch<React.SetStateAction<ExtendedServicesConfig>>;
-  };
-  github: {
-    authService: { reset: () => void; authenticate: (token: string) => Promise<void> };
-    octokit: Octokit;
-  };
-  apacheKafka: {
-    setConfig: React.Dispatch<React.SetStateAction<KafkaSettingsConfig>>;
-  };
-  serviceAccount: {
-    setConfig: React.Dispatch<React.SetStateAction<ServiceAccountSettingsConfig>>;
-  };
-  serviceRegistry: {
-    setConfig: React.Dispatch<React.SetStateAction<ServiceRegistrySettingsConfig>>;
-    catalogStore: SwfServiceCatalogStore;
-  };
-  featurePreview: {
-    setConfig: React.Dispatch<React.SetStateAction<FeaturePreviewSettingsConfig>>;
-  };
-}
-
-export const SettingsContext = React.createContext<SettingsContextType>({} as any);
-export const SettingsDispatchContext = React.createContext<SettingsDispatchContextType>({} as any);
-
-export function SettingsContextProvider(props: any) {
-  //github
-  const [githubAuthStatus, setGitHubAuthStatus] = useState(AuthStatus.LOADING);
-  const [githubOctokit, setGitHubOctokit] = useState<Octokit>(new Octokit());
-  const [githubToken, setGitHubToken] = useState<string | undefined>(undefined);
-  const [githubUser, setGitHubUser] = useState<GithubUser | undefined>(undefined);
-  const [githubScopes, setGitHubScopes] = useState<string[] | undefined>(undefined);
-
-  const githubAuthService = useMemo(() => {
-    return {
-      reset: () => {
-        setGitHubOctokit(new Octokit());
-        setGitHubToken(undefined);
-        setGitHubUser(undefined);
-        setGitHubScopes(undefined);
-        setCookie(GITHUB_AUTH_TOKEN_COOKIE_NAME, "");
-        setGitHubAuthStatus(AuthStatus.SIGNED_OUT);
-      },
-      authenticate: async (token: string) => {
-        try {
-          setGitHubAuthStatus(AuthStatus.LOADING);
-          const octokit = new Octokit({ auth: token });
-          const response = await octokit.users.getAuthenticated();
-          await delay(1000);
-          const scopes = response.headers["x-oauth-scopes"]?.split(", ") ?? [];
-          if (!scopes.includes("repo")) {
-            throw new Error("Token doesn't have 'repo' scope.");
-          }
-
-          setGitHubOctokit(octokit);
-          setGitHubToken(token);
-          setGitHubUser({
-            login: response.data.login,
-            name: response.data.name ?? "",
-            email: response.data.email ?? "",
-          });
-          setGitHubScopes(scopes);
-          setCookie(GITHUB_AUTH_TOKEN_COOKIE_NAME, token);
-          setGitHubAuthStatus(AuthStatus.SIGNED_IN);
-        } catch (e) {
-          setGitHubAuthStatus(AuthStatus.SIGNED_OUT);
-          throw e;
-        }
-      },
-    };
-  }, []);
-
-  useEffect(() => {
-    const tokenCookie = getCookie(GITHUB_AUTH_TOKEN_COOKIE_NAME);
-    if (!tokenCookie) {
-      setGitHubAuthStatus(AuthStatus.SIGNED_OUT);
-      return;
-    }
-
-    githubAuthService.authenticate(tokenCookie).catch(() => {
-      setGitHubAuthStatus(AuthStatus.TOKEN_EXPIRED);
-    });
-  }, [githubAuthService]);
-
-  const kieSandboxExtendedServices = useKieSandboxExtendedServices();
-  const [openshiftConfig, setOpenShiftConfig] = useState(readOpenShiftConfigCookie());
-  const [kafkaConfig, setKafkaConfig] = useState<KafkaSettingsConfig>(readKafkaConfigCookie());
-  const [serviceAccountConfig, setServiceAccountConfig] = useState<ServiceAccountSettingsConfig>(
-    readServiceAccountConfigCookie()
-  );
-  const [serviceRegistryConfig, setServiceRegistryConfig] = useState<ServiceRegistrySettingsConfig>(
-    readServiceRegistryConfigCookie()
-  );
-
-  const [featurePreviewConfig, setFeaturePreviewConfig] = useState<FeaturePreviewSettingsConfig>(
-    readFeaturePreviewConfigCookie()
-  );
-
-  const [openshiftStatus, setOpenshiftStatus] = useState(
-    kieSandboxExtendedServices.status === KieSandboxExtendedServicesStatus.AVAILABLE
-      ? OpenShiftInstanceStatus.DISCONNECTED
-      : OpenShiftInstanceStatus.UNAVAILABLE
-  );
-
-  const openshiftService = useMemo(
-    () =>
-      new OpenShiftService({
-        connection: openshiftConfig,
-        proxyUrl: `${kieSandboxExtendedServices.config.buildUrl()}/cors-proxy`,
-      }),
-    [openshiftConfig, kieSandboxExtendedServices.config]
-  );
-
-  const serviceCatalogStore = useMemo(
-    () =>
-      new SwfServiceCatalogStore({
-        serviceAccount: serviceAccountConfig,
-        serviceRegistry: serviceRegistryConfig,
-        extendedServicesConfig: kieSandboxExtendedServices.config,
-      }),
-    [kieSandboxExtendedServices.config, serviceAccountConfig, serviceRegistryConfig]
-  );
-
-  const dispatch = useMemo(() => {
-    return {
-      openshift: {
-        service: openshiftService,
-        setStatus: setOpenshiftStatus,
-        setConfig: setOpenShiftConfig,
-      },
-      github: {
-        authService: githubAuthService,
-        octokit: githubOctokit,
-      },
-      kieSandboxExtendedServices: {
-        setConfig: kieSandboxExtendedServices.saveNewConfig,
-      },
-      apacheKafka: {
-        setConfig: setKafkaConfig,
-      },
-      serviceAccount: {
-        setConfig: setServiceAccountConfig,
-      },
-      serviceRegistry: {
-        setConfig: setServiceRegistryConfig,
-        catalogStore: serviceCatalogStore,
-      },
-      featurePreview: {
-        setConfig: setFeaturePreviewConfig,
-      },
-    };
-  }, [
-    githubAuthService,
-    githubOctokit,
-    openshiftService,
-    kieSandboxExtendedServices.saveNewConfig,
-    serviceCatalogStore,
-  ]);
-
-  const value = useMemo(() => {
-    return {
-      openshift: {
-        status: openshiftStatus,
-        config: openshiftConfig,
-      },
-      github: {
-        authStatus: githubAuthStatus,
-        token: githubToken,
-        user: githubUser,
-        scopes: githubScopes,
-      },
-      kieSandboxExtendedServices: {
-        config: kieSandboxExtendedServices.config,
-      },
-      apacheKafka: {
-        config: kafkaConfig,
-      },
-      serviceAccount: {
-        config: serviceAccountConfig,
-      },
-      serviceRegistry: {
-        config: serviceRegistryConfig,
-      },
-      featurePreview: {
-        config: featurePreviewConfig,
-      },
-    };
-  }, [
-    openshiftStatus,
-    openshiftConfig,
-    githubAuthStatus,
-    githubToken,
-    githubUser,
-    githubScopes,
-    kafkaConfig,
-    serviceAccountConfig,
-    serviceRegistryConfig,
-    kieSandboxExtendedServices.config,
-    featurePreviewConfig,
-  ]);
-
-  return (
-    <SettingsContext.Provider value={value}>
-      <SettingsDispatchContext.Provider value={dispatch}>{props.children}</SettingsDispatchContext.Provider>
-    </SettingsContext.Provider>
-  );
-}
-
-export function useSettings() {
-  return useContext(SettingsContext);
-}
-
-export function useSettingsDispatch() {
-  return useContext(SettingsDispatchContext);
-}
-
-function delay(ms: number) {
-  return new Promise<void>((res) => {
-    setTimeout(() => {
-      res();
-    }, ms);
-  });
-}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/featurePreview/FeaturePreviewConfig.tsx b/packages/serverless-logic-web-tools/src/newSettings/featurePreview/FeaturePreviewConfig.tsx
deleted file mode 100644
index 36cce4c180..0000000000
--- a/packages/serverless-logic-web-tools/src/newSettings/featurePreview/FeaturePreviewConfig.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2023 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { getCookie, makeCookieName, setCookie } from "../../cookies";
-
-export const FEATURE_PREVIEW_STUNNER_ENABLED_COOKIE_NAME = makeCookieName("feature-preview", "stunner-enabled");
-
-export interface FeaturePreviewSettingsConfig {
-  stunnerEnabled: boolean;
-}
-
-export const DEFAULT_CONFIG: FeaturePreviewSettingsConfig = {
-  stunnerEnabled: true,
-};
-
-export function readFeaturePreviewConfigCookie(): FeaturePreviewSettingsConfig {
-  const stunnerEnabledCookie = getCookie(FEATURE_PREVIEW_STUNNER_ENABLED_COOKIE_NAME);
-  return {
-    stunnerEnabled: stunnerEnabledCookie ? stunnerEnabledCookie === "true" : DEFAULT_CONFIG.stunnerEnabled,
-  };
-}
-
-export function saveStunnerEnabledCookie(isEnabled: boolean): void {
-  setCookie(FEATURE_PREVIEW_STUNNER_ENABLED_COOKIE_NAME, String(isEnabled));
-}
-
-export function saveConfigCookie(config: FeaturePreviewSettingsConfig): void {
-  saveStunnerEnabledCookie(config.stunnerEnabled);
-}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/github/Hooks.tsx b/packages/serverless-logic-web-tools/src/newSettings/github/Hooks.tsx
deleted file mode 100644
index f05fde5cd4..0000000000
--- a/packages/serverless-logic-web-tools/src/newSettings/github/Hooks.tsx
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2021 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { useMemo } from "react";
-import { AuthStatus, useSettings } from "../SettingsContext";
-
-export function useGitHubAuthInfo() {
-  const settings = useSettings();
-  return useMemo(() => {
-    if (settings.github.authStatus !== AuthStatus.SIGNED_IN) {
-      return undefined;
-    }
-
-    return {
-      name: settings.github.user!.name,
-      email: settings.github.user!.email,
-      username: settings.github.user!.login,
-      password: settings.github.token!,
-    };
-  }, [settings.github]);
-}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/kafka/KafkaSettingsConfig.tsx b/packages/serverless-logic-web-tools/src/newSettings/kafka/KafkaSettingsConfig.tsx
deleted file mode 100644
index dde86edea1..0000000000
--- a/packages/serverless-logic-web-tools/src/newSettings/kafka/KafkaSettingsConfig.tsx
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { makeCookieName, getCookie, setCookie } from "../../cookies";
-
-export const KAFKA_BOOTSTRAP_SERVER_COOKIE_NAME = makeCookieName("kafka", "bootstrap-server");
-export const KAFKA_TOPIC_COOKIE_NAME = makeCookieName("kafka", "topic");
-
-export interface KafkaSettingsConfig {
-  bootstrapServer: string;
-  topic: string;
-}
-
-export const EMPTY_CONFIG: KafkaSettingsConfig = {
-  bootstrapServer: "",
-  topic: "",
-};
-
-export function isKafkaConfigValid(config: KafkaSettingsConfig): boolean {
-  return isBootstrapServerValid(config.bootstrapServer) && isTopicValid(config.topic);
-}
-
-export function isBootstrapServerValid(bootstrapServer: string): boolean {
-  return bootstrapServer !== undefined && bootstrapServer.trim().length > 0;
-}
-
-export function isOAuthEndpointUriValid(oauthEndpointUri: string): boolean {
-  return oauthEndpointUri !== undefined && oauthEndpointUri.trim().length > 0;
-}
-
-export function isTopicValid(topic: string): boolean {
-  return topic !== undefined && topic.trim().length > 0;
-}
-
-export function readKafkaConfigCookie(): KafkaSettingsConfig {
-  return {
-    bootstrapServer: getCookie(KAFKA_BOOTSTRAP_SERVER_COOKIE_NAME) ?? "",
-    topic: getCookie(KAFKA_TOPIC_COOKIE_NAME) ?? "",
-  };
-}
-
-export function resetConfigCookie(): void {
-  saveConfigCookie(EMPTY_CONFIG);
-}
-
-export function saveBootstrapServerCookie(bootstrapServer: string): void {
-  setCookie(KAFKA_BOOTSTRAP_SERVER_COOKIE_NAME, bootstrapServer);
-}
-
-export function saveTopicCookie(topic: string): void {
-  setCookie(KAFKA_TOPIC_COOKIE_NAME, topic);
-}
-
-export function saveConfigCookie(config: KafkaSettingsConfig): void {
-  saveBootstrapServerCookie(config.bootstrapServer);
-  saveTopicCookie(config.topic);
-}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettingsConfig.tsx b/packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettingsConfig.tsx
deleted file mode 100644
index 26ffc405ea..0000000000
--- a/packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettingsConfig.tsx
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { OpenShiftConnection } from "@kie-tools-core/openshift/dist/service/OpenShiftConnection";
-import { makeCookieName, getCookie, setCookie } from "../../cookies";
-
-export const OPENSHIFT_NAMESPACE_COOKIE_NAME = makeCookieName("openshift", "namespace");
-export const OPENSHIFT_HOST_COOKIE_NAME = makeCookieName("openshift", "host");
-export const OPENSHIFT_TOKEN_COOKIE_NAME = makeCookieName("openshift", "token");
-
-export const EMPTY_CONFIG: OpenShiftConnection = {
-  namespace: "",
-  host: "",
-  token: "",
-};
-
-export function readOpenShiftConfigCookie(): OpenShiftConnection {
-  return {
-    namespace: getCookie(OPENSHIFT_NAMESPACE_COOKIE_NAME) ?? "",
-    host: getCookie(OPENSHIFT_HOST_COOKIE_NAME) ?? "",
-    token: getCookie(OPENSHIFT_TOKEN_COOKIE_NAME) ?? "",
-  };
-}
-
-export function resetConfigCookie(): void {
-  saveConfigCookie(EMPTY_CONFIG);
-}
-
-export function saveNamespaceCookie(namespace: string): void {
-  setCookie(OPENSHIFT_NAMESPACE_COOKIE_NAME, namespace);
-}
-
-export function saveHostCookie(host: string): void {
-  setCookie(OPENSHIFT_HOST_COOKIE_NAME, host);
-}
-
-export function saveTokenCookie(token: string): void {
-  setCookie(OPENSHIFT_TOKEN_COOKIE_NAME, token);
-}
-
-export function saveConfigCookie(config: OpenShiftConnection): void {
-  saveNamespaceCookie(config.namespace);
-  saveHostCookie(config.host);
-  saveTokenCookie(config.token);
-}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/serviceAccount/ServiceAccountConfig.tsx b/packages/serverless-logic-web-tools/src/newSettings/serviceAccount/ServiceAccountConfig.tsx
deleted file mode 100644
index 1b9bb2d77a..0000000000
--- a/packages/serverless-logic-web-tools/src/newSettings/serviceAccount/ServiceAccountConfig.tsx
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright 2023 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { makeCookieName, getCookie, setCookie } from "../../cookies";
-
-export const SERVICE_ACCOUNT_CLIENT_ID_COOKIE_NAME = makeCookieName("service-account", "client-id");
-export const SERVICE_ACCOUNT_CLIENT_SECRET_COOKIE_NAME = makeCookieName("service-account", "client-secret");
-
-export interface ServiceAccountSettingsConfig {
-  clientId: string;
-  clientSecret: string;
-}
-
-export const EMPTY_CONFIG: ServiceAccountSettingsConfig = {
-  clientId: "",
-  clientSecret: "",
-};
-
-export function isServiceAccountConfigValid(config: ServiceAccountSettingsConfig): boolean {
-  return isClientIdValid(config.clientId) && isClientSecretValid(config.clientSecret);
-}
-
-export function isClientIdValid(clientId: string): boolean {
-  return clientId !== undefined && clientId.trim().length > 0;
-}
-
-export function isClientSecretValid(clientSecret: string): boolean {
-  return clientSecret !== undefined && clientSecret.trim().length > 0;
-}
-
-export function readServiceAccountConfigCookie(): ServiceAccountSettingsConfig {
-  return {
-    clientId: getCookie(SERVICE_ACCOUNT_CLIENT_ID_COOKIE_NAME) ?? "",
-    clientSecret: getCookie(SERVICE_ACCOUNT_CLIENT_SECRET_COOKIE_NAME) ?? "",
-  };
-}
-
-export function resetConfigCookie(): void {
-  saveConfigCookie(EMPTY_CONFIG);
-}
-
-export function saveClientIdCookie(clientId: string): void {
-  setCookie(SERVICE_ACCOUNT_CLIENT_ID_COOKIE_NAME, clientId);
-}
-
-export function saveClientSecretCookie(clientSecret: string): void {
-  setCookie(SERVICE_ACCOUNT_CLIENT_SECRET_COOKIE_NAME, clientSecret);
-}
-
-export function saveConfigCookie(config: ServiceAccountSettingsConfig): void {
-  saveClientIdCookie(config.clientId);
-  saveClientSecretCookie(config.clientSecret);
-}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/serviceRegistry/ServiceRegistryConfig.tsx b/packages/serverless-logic-web-tools/src/newSettings/serviceRegistry/ServiceRegistryConfig.tsx
deleted file mode 100644
index 49dad4fe02..0000000000
--- a/packages/serverless-logic-web-tools/src/newSettings/serviceRegistry/ServiceRegistryConfig.tsx
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright 2023 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { getCookie, makeCookieName, setCookie } from "../../cookies";
-
-export const SERVICE_REGISTRY_NAME_COOKIE_NAME = makeCookieName("service-registry", "name");
-export const SERVICE_REGISTRY_CORE_REGISTRY_API_COOKIE_NAME = makeCookieName("service-registry", "core-registry-api");
-
-export interface ServiceRegistrySettingsConfig {
-  name: string;
-  coreRegistryApi: string;
-}
-
-export const EMPTY_CONFIG: ServiceRegistrySettingsConfig = {
-  name: "",
-  coreRegistryApi: "",
-};
-
-export function isServiceRegistryConfigValid(config: ServiceRegistrySettingsConfig): boolean {
-  return isNameValid(config.name) && isCoreRegistryApiValid(config.coreRegistryApi);
-}
-
-export function isNameValid(name: string): boolean {
-  return name !== undefined && name.trim().length > 0;
-}
-
-export function isCoreRegistryApiValid(coreRegistryApi: string): boolean {
-  return coreRegistryApi !== undefined && coreRegistryApi.trim().length > 0;
-}
-
-export function readServiceRegistryConfigCookie(): ServiceRegistrySettingsConfig {
-  return {
-    name: getCookie(SERVICE_REGISTRY_NAME_COOKIE_NAME) ?? "",
-    coreRegistryApi: getCookie(SERVICE_REGISTRY_CORE_REGISTRY_API_COOKIE_NAME) ?? "",
-  };
-}
-
-export function resetConfigCookie(): void {
-  saveConfigCookie(EMPTY_CONFIG);
-}
-
-export function saveNameCookie(name: string): void {
-  setCookie(SERVICE_REGISTRY_NAME_COOKIE_NAME, name);
-}
-
-export function saveCoreRegistryApiCookie(coreRegistryApi: string): void {
-  setCookie(SERVICE_REGISTRY_CORE_REGISTRY_API_COOKIE_NAME, coreRegistryApi);
-}
-
-export function saveConfigCookie(config: ServiceRegistrySettingsConfig): void {
-  saveNameCookie(config.name);
-  saveCoreRegistryApiCookie(config.coreRegistryApi);
-}
diff --git a/packages/serverless-logic-web-tools/src/openshift/dropdown/OpenshiftDeploymentsDropdown.tsx b/packages/serverless-logic-web-tools/src/openshift/dropdown/OpenshiftDeploymentsDropdown.tsx
index 86f24c5f3f..6a4c26392b 100644
--- a/packages/serverless-logic-web-tools/src/openshift/dropdown/OpenshiftDeploymentsDropdown.tsx
+++ b/packages/serverless-logic-web-tools/src/openshift/dropdown/OpenshiftDeploymentsDropdown.tsx
@@ -26,15 +26,17 @@ import { useCallback, useMemo } from "react";
 import { ResponsiveDropdown } from "../../ResponsiveDropdown/ResponsiveDropdown";
 import { ResponsiveDropdownToggle } from "../../ResponsiveDropdown/ResponsiveDropdownToggle";
 import { useSettings, useSettingsDispatch } from "../../settings/SettingsContext";
-import { SettingsTabs } from "../../settings/SettingsModalBody";
 import { useOpenShift } from "../OpenShiftContext";
 import { OpenShiftDeploymentDropdownItem } from "./OpenShiftDeploymentDropdownItem";
 import { OpenShiftInstanceStatus } from "../OpenShiftInstanceStatus";
+import { routes } from "../../navigation/Routes";
+import { useHistory } from "react-router";
 
 export function OpenshiftDeploymentsDropdown() {
   const settings = useSettings();
   const settingsDispatch = useSettingsDispatch();
   const openshift = useOpenShift();
+  const history = useHistory();
 
   const isConnected = useMemo(
     () => settings.openshift.status === OpenShiftInstanceStatus.CONNECTED,
@@ -42,8 +44,8 @@ export function OpenshiftDeploymentsDropdown() {
   );
 
   const openOpenShiftSettings = useCallback(() => {
-    settingsDispatch.open(SettingsTabs.OPENSHIFT);
-  }, [settingsDispatch]);
+    history.push(routes.settings.openshift.path({}));
+  }, [history]);
 
   const items = useMemo(() => {
     const common = isConnected
diff --git a/packages/serverless-logic-web-tools/src/settings/SettingsButton.tsx b/packages/serverless-logic-web-tools/src/settings/SettingsButton.tsx
index 50c96c4566..7b1cde4e00 100644
--- a/packages/serverless-logic-web-tools/src/settings/SettingsButton.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/SettingsButton.tsx
@@ -18,17 +18,18 @@ import * as React from "react";
 import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
 import { CogIcon } from "@patternfly/react-icons/dist/js/icons/cog-icon";
 import { useSettingsDispatch } from "./SettingsContext";
+import { Link } from "react-router-dom";
+import { useRoutes } from "../navigation/Hooks";
 
 export function SettingsButton() {
   const settingsDispatch = useSettingsDispatch();
+  const routes = useRoutes();
+
   return (
-    <Button
-      variant={ButtonVariant.plain}
-      onClick={() => settingsDispatch.open()}
-      aria-label="Settings"
-      className={"kie-tools--masthead-hoverable-dark"}
-    >
-      <CogIcon />
-    </Button>
+    <Link to={routes.settings.home.path({})}>
+      <Button variant={ButtonVariant.plain} aria-label="Settings" className={"kie-tools--masthead-hoverable-dark"}>
+        <CogIcon />
+      </Button>
+    </Link>
   );
 }
diff --git a/packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx b/packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx
index 2abccb1650..76a2eeb0bf 100644
--- a/packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,30 +14,25 @@
  * limitations under the License.
  */
 
+import { OpenShiftConnection } from "@kie-tools-core/openshift/dist/service/OpenShiftConnection";
+import { OpenShiftService } from "@kie-tools-core/openshift/dist/service/OpenShiftService";
+import { Octokit } from "@octokit/rest";
 import * as React from "react";
-import { useCallback, useContext, useEffect, useMemo, useState } from "react";
+import { useContext, useEffect, useMemo, useState } from "react";
 import { getCookie, setCookie } from "../cookies";
-import { Octokit } from "@octokit/rest";
-import { useQueryParams } from "../queryParams/QueryParamsContext";
-import { Modal, ModalVariant } from "@patternfly/react-core/dist/js/components/Modal";
-import { SettingsModalBody, SettingsTabs } from "./SettingsModalBody";
-import { readOpenShiftConfigCookie } from "./openshift/OpenShiftSettingsConfig";
-import { OpenShiftConnection } from "@kie-tools-core/openshift/dist/service/OpenShiftConnection";
+import { SwfServiceCatalogStore } from "../editor/api/SwfServiceCatalogStore";
+import { useKieSandboxExtendedServices } from "../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
+import { KieSandboxExtendedServicesStatus } from "../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
 import { OpenShiftInstanceStatus } from "../openshift/OpenShiftInstanceStatus";
-import { OpenShiftService } from "@kie-tools-core/openshift/dist/service/OpenShiftService";
-import { useHistory, useRouteMatch } from "react-router";
-import { QueryParams, routes } from "../navigation/Routes";
-import { GITHUB_AUTH_TOKEN_COOKIE_NAME } from "./github/GitHubSettingsTab";
+import { FeaturePreviewSettingsConfig, readFeaturePreviewConfigCookie } from "./featurePreview/FeaturePreviewConfig";
+import { GITHUB_AUTH_TOKEN_COOKIE_NAME } from "./github/GitHubSettings";
 import { KafkaSettingsConfig, readKafkaConfigCookie } from "./kafka/KafkaSettingsConfig";
+import { readOpenShiftConfigCookie } from "./openshift/OpenShiftSettingsConfig";
 import { readServiceAccountConfigCookie, ServiceAccountSettingsConfig } from "./serviceAccount/ServiceAccountConfig";
 import {
   readServiceRegistryConfigCookie,
   ServiceRegistrySettingsConfig,
 } from "./serviceRegistry/ServiceRegistryConfig";
-import { useKieSandboxExtendedServices } from "../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
-import { KieSandboxExtendedServicesStatus } from "../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
-import { SwfServiceCatalogStore } from "../editor/api/SwfServiceCatalogStore";
-import { FeaturePreviewSettingsConfig, readFeaturePreviewConfigCookie } from "./featurePreview/FeaturePreviewConfig";
 
 export enum AuthStatus {
   SIGNED_OUT,
@@ -69,8 +64,6 @@ export class ExtendedServicesConfig {
 }
 
 export interface SettingsContextType {
-  isOpen: boolean;
-  activeTab: SettingsTabs;
   openshift: {
     status: OpenShiftInstanceStatus;
     config: OpenShiftConnection;
@@ -99,8 +92,6 @@ export interface SettingsContextType {
 }
 
 export interface SettingsDispatchContextType {
-  open: (activeTab?: SettingsTabs) => void;
-  close: () => void;
   openshift: {
     service: OpenShiftService;
     setStatus: React.Dispatch<React.SetStateAction<OpenShiftInstanceStatus>>;
@@ -132,32 +123,6 @@ export const SettingsContext = React.createContext<SettingsContextType>({} as an
 export const SettingsDispatchContext = React.createContext<SettingsDispatchContextType>({} as any);
 
 export function SettingsContextProvider(props: any) {
-  const queryParams = useQueryParams();
-  const history = useHistory();
-  const [isOpen, setOpen] = useState(false);
-  const [activeTab, setActiveTab] = useState(SettingsTabs.GITHUB);
-  const isRouteInSettingsSection = useRouteMatch(routes.settings.home.path({}));
-
-  useEffect(() => {
-    setOpen(queryParams.has(QueryParams.SETTINGS));
-    setActiveTab((queryParams.get(QueryParams.SETTINGS) as SettingsTabs) ?? SettingsTabs.GITHUB);
-  }, [queryParams]);
-
-  const open = useCallback(
-    (activeTab = SettingsTabs.GITHUB) => {
-      history.replace({
-        search: queryParams.with(QueryParams.SETTINGS, activeTab).toString(),
-      });
-    },
-    [history, queryParams]
-  );
-
-  const close = useCallback(() => {
-    history.replace({
-      search: queryParams.without(QueryParams.SETTINGS).toString(),
-    });
-  }, [history, queryParams]);
-
   //github
   const [githubAuthStatus, setGitHubAuthStatus] = useState(AuthStatus.LOADING);
   const [githubOctokit, setGitHubOctokit] = useState<Octokit>(new Octokit());
@@ -257,8 +222,6 @@ export function SettingsContextProvider(props: any) {
 
   const dispatch = useMemo(() => {
     return {
-      open,
-      close,
       openshift: {
         service: openshiftService,
         setStatus: setOpenshiftStatus,
@@ -286,10 +249,8 @@ export function SettingsContextProvider(props: any) {
       },
     };
   }, [
-    close,
     githubAuthService,
     githubOctokit,
-    open,
     openshiftService,
     kieSandboxExtendedServices.saveNewConfig,
     serviceCatalogStore,
@@ -297,8 +258,6 @@ export function SettingsContextProvider(props: any) {
 
   const value = useMemo(() => {
     return {
-      isOpen,
-      activeTab,
       openshift: {
         status: openshiftStatus,
         config: openshiftConfig,
@@ -326,8 +285,6 @@ export function SettingsContextProvider(props: any) {
       },
     };
   }, [
-    isOpen,
-    activeTab,
     openshiftStatus,
     openshiftConfig,
     githubAuthStatus,
@@ -343,19 +300,7 @@ export function SettingsContextProvider(props: any) {
 
   return (
     <SettingsContext.Provider value={value}>
-      <SettingsDispatchContext.Provider value={dispatch}>
-        {(isRouteInSettingsSection || githubAuthStatus !== AuthStatus.LOADING) && <>{props.children}</>}
-        <Modal
-          title="Settings"
-          isOpen={!isRouteInSettingsSection && isOpen}
-          onClose={close}
-          variant={ModalVariant.large}
-        >
-          <div style={{ height: "calc(100vh * 0.5)" }} className={"kie-tools--settings-modal-content"}>
-            <SettingsModalBody />
-          </div>
-        </Modal>
-      </SettingsDispatchContext.Provider>
+      <SettingsDispatchContext.Provider value={dispatch}>{props.children}</SettingsDispatchContext.Provider>
     </SettingsContext.Provider>
   );
 }
diff --git a/packages/serverless-logic-web-tools/src/settings/SettingsModalBody.tsx b/packages/serverless-logic-web-tools/src/settings/SettingsModalBody.tsx
deleted file mode 100644
index 3658090673..0000000000
--- a/packages/serverless-logic-web-tools/src/settings/SettingsModalBody.tsx
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 2021 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import * as React from "react";
-import { Tab, Tabs, TabTitleText } from "@patternfly/react-core/dist/js/components/Tabs";
-import { GitHubSettingsTab } from "./github/GitHubSettingsTab";
-import { useSettings, useSettingsDispatch } from "./SettingsContext";
-import { OpenShiftSettingsTab } from "./openshift/OpenShiftSettingsTab";
-import { ApacheKafkaSettingsTab } from "./kafka/ApacheKafkaSettingsTab";
-import { ServiceAccountSettingsTab } from "./serviceAccount/ServiceAccountSettingsTab";
-import { ServiceRegistrySettingsTab } from "./serviceRegistry/ServiceRegistrySettingsTab";
-import { KieSandboxExtendedServicesSettingsTab } from "./extendedServices/KieSandboxExtendedServicesSettingsTab";
-import { FeaturePreviewSettingsTab } from "./featurePreview/FeaturePreviewSettingsTab";
-
-export enum SettingsTabs {
-  GITHUB = "github",
-  OPENSHIFT = "openshift",
-  KIE_SANDBOX_EXTENDED_SERVICES = "kie-sandbox-extended-services",
-  SERVICE_ACCOUNT = "serviceAccount",
-  SERVICE_REGISTRY = "serviceRegistry",
-  KAFKA = "kafka",
-  FEATURE_PREVIEW = "featurePreview",
-}
-
-export function SettingsModalBody() {
-  const settings = useSettings();
-  const settingsDispatch = useSettingsDispatch();
-
-  return (
-    <Tabs
-      activeKey={settings.activeTab}
-      onSelect={(e, k) => settingsDispatch.open(k as SettingsTabs)}
-      isVertical={false}
-      isBox={false}
-    >
-      <Tab
-        className="kie-tools--settings-tab"
-        eventKey={SettingsTabs.GITHUB}
-        title={<TabTitleText>GitHub</TabTitleText>}
-      >
-        <GitHubSettingsTab />
-      </Tab>
-      <Tab
-        className="kie-tools--settings-tab"
-        eventKey={SettingsTabs.KIE_SANDBOX_EXTENDED_SERVICES}
-        title={<TabTitleText>KIE Sandbox Extended Services</TabTitleText>}
-      >
-        <KieSandboxExtendedServicesSettingsTab />
-      </Tab>
-      <Tab
-        className="kie-tools--settings-tab"
-        eventKey={SettingsTabs.OPENSHIFT}
-        title={<TabTitleText>OpenShift</TabTitleText>}
-      >
-        <OpenShiftSettingsTab />
-      </Tab>
-      <Tab
-        className="kie-tools--settings-tab"
-        eventKey={SettingsTabs.SERVICE_ACCOUNT}
-        title={<TabTitleText>Service Account</TabTitleText>}
-      >
-        <ServiceAccountSettingsTab />
-      </Tab>
-      <Tab
-        className="kie-tools--settings-tab"
-        eventKey={SettingsTabs.SERVICE_REGISTRY}
-        title={<TabTitleText>Service Registry</TabTitleText>}
-      >
-        <ServiceRegistrySettingsTab />
-      </Tab>
-      <Tab
-        className="kie-tools--settings-tab"
-        eventKey={SettingsTabs.KAFKA}
-        title={<TabTitleText>Streams for Apache Kafka</TabTitleText>}
-      >
-        <ApacheKafkaSettingsTab />
-      </Tab>
-      <Tab
-        className="kie-tools--settings-tab"
-        eventKey={SettingsTabs.FEATURE_PREVIEW}
-        title={<TabTitleText>Feature Preview</TabTitleText>}
-      >
-        <FeaturePreviewSettingsTab />
-      </Tab>
-    </Tabs>
-  );
-}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/extendedServices/KieSandboxExtendedServicesSettings.tsx b/packages/serverless-logic-web-tools/src/settings/extendedServices/KieSandboxExtendedServicesSettings.tsx
similarity index 100%
rename from packages/serverless-logic-web-tools/src/newSettings/extendedServices/KieSandboxExtendedServicesSettings.tsx
rename to packages/serverless-logic-web-tools/src/settings/extendedServices/KieSandboxExtendedServicesSettings.tsx
diff --git a/packages/serverless-logic-web-tools/src/settings/extendedServices/KieSandboxExtendedServicesSettingsTab.tsx b/packages/serverless-logic-web-tools/src/settings/extendedServices/KieSandboxExtendedServicesSettingsTab.tsx
deleted file mode 100644
index 4d25544a4b..0000000000
--- a/packages/serverless-logic-web-tools/src/settings/extendedServices/KieSandboxExtendedServicesSettingsTab.tsx
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Copyright 2021 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
-import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
-import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
-import { ActionGroup, Form, FormAlert, FormGroup } from "@patternfly/react-core/dist/js/components/Form";
-import { InputGroup, InputGroupText } from "@patternfly/react-core/dist/js/components/InputGroup";
-import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
-import { Popover } from "@patternfly/react-core/dist/js/components/Popover";
-import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
-import { TextInput } from "@patternfly/react-core/dist/js/components/TextInput";
-import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-circle-icon";
-import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
-import { TimesIcon } from "@patternfly/react-icons/dist/js/icons/times-icon";
-import * as React from "react";
-import { useCallback, useMemo, useState } from "react";
-import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
-import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
-import { ExtendedServicesConfig, useSettings, useSettingsDispatch } from "../SettingsContext";
-
-export function KieSandboxExtendedServicesSettingsTab() {
-  const settings = useSettings();
-  const settingsDispatch = useSettingsDispatch();
-  const kieSandboxExtendedServices = useKieSandboxExtendedServices();
-  const [config, setConfig] = useState(settings.kieSandboxExtendedServices.config);
-
-  const isCurrentConfigValid = useMemo(
-    () => config.host.trim().length > 0 && config.buildUrl().trim().length > 0,
-    [config]
-  );
-
-  const onClearHost = useCallback(() => setConfig(new ExtendedServicesConfig("", config.port)), [config]);
-  const onClearPort = useCallback(() => setConfig(new ExtendedServicesConfig(config.host, "")), [config]);
-
-  const onHostChanged = useCallback(
-    (newValue: string) => setConfig(new ExtendedServicesConfig(newValue, config.port)),
-    [config]
-  );
-  const onPortChanged = useCallback(
-    (newValue: string) => setConfig(new ExtendedServicesConfig(config.host, newValue)),
-    [config]
-  );
-
-  const onConnect = useCallback(() => {
-    settingsDispatch.kieSandboxExtendedServices.setConfig(config);
-  }, [settingsDispatch.kieSandboxExtendedServices, config]);
-
-  const onReset = useCallback(() => {
-    const emptyConfig = new ExtendedServicesConfig("", "");
-    setConfig(emptyConfig);
-    settingsDispatch.kieSandboxExtendedServices.setConfig(emptyConfig);
-  }, [settingsDispatch.kieSandboxExtendedServices]);
-
-  return (
-    <>
-      <Page>
-        <PageSection>
-          {kieSandboxExtendedServices.status === KieSandboxExtendedServicesStatus.RUNNING ? (
-            <EmptyState>
-              <EmptyStateIcon icon={CheckCircleIcon} color={"var(--pf-global--success-color--100)"} />
-              <TextContent>
-                <Text component={"h2"}>{"You are connect to the KIE Sandbox Extended Services."}</Text>
-              </TextContent>
-              <EmptyStateBody>
-                <TextContent>
-                  Deploying models is <b>enabled</b>.
-                </TextContent>
-                <br />
-                <TextContent>
-                  <b>URL: </b>
-                  <i>{config.buildUrl()}</i>
-                </TextContent>
-                <br />
-                <Button variant={ButtonVariant.tertiary} onClick={onReset}>
-                  Reset
-                </Button>
-              </EmptyStateBody>
-            </EmptyState>
-          ) : (
-            <PageSection variant={"light"} isFilled={true} style={{ height: "100%" }}>
-              <Form>
-                <FormAlert>
-                  <Alert
-                    variant="danger"
-                    title={
-                      <Text>
-                        You are not connected to KIE Sandbox Extended Services.{" "}
-                        <a
-                          onClick={() => {
-                            kieSandboxExtendedServices.setInstallTriggeredBy(undefined);
-                            kieSandboxExtendedServices.setModalOpen(true);
-                          }}
-                        >
-                          Click to setup
-                        </a>
-                      </Text>
-                    }
-                    aria-live="polite"
-                    isInline
-                  />
-                </FormAlert>
-                <TextContent>
-                  <Text component={TextVariants.h3}>KIE Sandbox Extended Services</Text>
-                </TextContent>
-                <TextContent>
-                  <Text component={TextVariants.small}>
-                    Data you provide here is necessary for proxying Serverless Logic Web Tools requests to OpenShift,
-                    thus making it possible to deploy models. All information is locally stored in your browser and
-                    never shared with anyone.
-                  </Text>
-                </TextContent>
-                <FormGroup
-                  label={"Host"}
-                  labelIcon={
-                    <Popover bodyContent={"The host associated with the KIE Sandbox Extended Services URL instance."}>
-                      <button
-                        type="button"
-                        aria-label="More info for host field"
-                        onClick={(e) => e.preventDefault()}
-                        aria-describedby="host-server-field"
-                        className="pf-c-form__group-label-help"
-                      >
-                        <HelpIcon noVerticalAlign />
-                      </button>
-                    </Popover>
-                  }
-                  isRequired
-                  fieldId="host-server-field"
-                >
-                  <InputGroup className="pf-u-mt-sm">
-                    <TextInput
-                      autoComplete={"off"}
-                      isRequired
-                      type="text"
-                      id="host-server-field"
-                      name="host-server-field"
-                      aria-label="Host field"
-                      aria-describedby="host-server-field-helper"
-                      value={config.host}
-                      onChange={onHostChanged}
-                      tabIndex={1}
-                      data-testid="host-text-field"
-                    />
-                    <InputGroupText>
-                      <Button isSmall variant="plain" aria-label="Clear host button" onClick={onClearHost}>
-                        <TimesIcon />
-                      </Button>
-                    </InputGroupText>
-                  </InputGroup>
-                </FormGroup>
-                <FormGroup
-                  label={"Port"}
-                  labelIcon={
-                    <Popover
-                      bodyContent={"The port number associated with the KIE Sandbox Extended Services URL instance."}
-                    >
-                      <button
-                        type="button"
-                        aria-label="More info for port field"
-                        onClick={(e) => e.preventDefault()}
-                        aria-describedby="port-field"
-                        className="pf-c-form__group-label-help"
-                      >
-                        <HelpIcon noVerticalAlign />
-                      </button>
-                    </Popover>
-                  }
-                  isRequired
-                  fieldId="port-field"
-                >
-                  <InputGroup className="pf-u-mt-sm">
-                    <TextInput
-                      autoComplete={"off"}
-                      isRequired
-                      type="text"
-                      id="port-field"
-                      name="port-field"
-                      aria-label="Port field"
-                      aria-describedby="port-field-helper"
-                      value={config.port}
-                      onChange={onPortChanged}
-                      tabIndex={2}
-                      data-testid="port-text-field"
-                    />
-                    <InputGroupText>
-                      <Button isSmall variant="plain" aria-label="Clear port button" onClick={onClearPort}>
-                        <TimesIcon />
-                      </Button>
-                    </InputGroupText>
-                  </InputGroup>
-                </FormGroup>
-                <ActionGroup>
-                  <Button
-                    isDisabled={!isCurrentConfigValid}
-                    id="kie-sandbox-extended-services-config-connect-button"
-                    key="connect"
-                    variant="primary"
-                    onClick={onConnect}
-                    data-testid="connect-config-button"
-                  >
-                    Connect
-                  </Button>
-                </ActionGroup>
-              </Form>
-            </PageSection>
-          )}
-        </PageSection>
-      </Page>
-    </>
-  );
-}
diff --git a/packages/serverless-logic-web-tools/src/settings/featurePreview/FeaturePreviewConfig.tsx b/packages/serverless-logic-web-tools/src/settings/featurePreview/FeaturePreviewConfig.tsx
index f7a383db92..36cce4c180 100644
--- a/packages/serverless-logic-web-tools/src/settings/featurePreview/FeaturePreviewConfig.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/featurePreview/FeaturePreviewConfig.tsx
@@ -1,5 +1,5 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/packages/serverless-logic-web-tools/src/newSettings/featurePreview/FeaturePreviewSettings.tsx b/packages/serverless-logic-web-tools/src/settings/featurePreview/FeaturePreviewSettings.tsx
similarity index 100%
rename from packages/serverless-logic-web-tools/src/newSettings/featurePreview/FeaturePreviewSettings.tsx
rename to packages/serverless-logic-web-tools/src/settings/featurePreview/FeaturePreviewSettings.tsx
diff --git a/packages/serverless-logic-web-tools/src/settings/featurePreview/FeaturePreviewSettingsTab.tsx b/packages/serverless-logic-web-tools/src/settings/featurePreview/FeaturePreviewSettingsTab.tsx
deleted file mode 100644
index 61ca839ff1..0000000000
--- a/packages/serverless-logic-web-tools/src/settings/featurePreview/FeaturePreviewSettingsTab.tsx
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright 2021 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import * as React from "react";
-import { Form } from "@patternfly/react-core/dist/js/components/Form";
-import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
-import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
-import { useCallback, useEffect, useState } from "react";
-import { useSettings, useSettingsDispatch } from "../SettingsContext";
-import { Checkbox } from "@patternfly/react-core/dist/js/components/Checkbox";
-import { saveConfigCookie } from "./FeaturePreviewConfig";
-
-export function FeaturePreviewSettingsTab() {
-  const settings = useSettings();
-  const settingsDispatch = useSettingsDispatch();
-  const [config, setConfig] = useState(settings.featurePreview.config);
-  const [stunnerEnabled, setStunnerEnabled] = useState(config.stunnerEnabled);
-
-  useEffect(() => {
-    settingsDispatch.featurePreview.setConfig(config);
-    saveConfigCookie(config);
-  }, [config, settingsDispatch.featurePreview]);
-
-  const onStunnerEnabledChanged = useCallback(
-    (isEnabled: boolean) => {
-      setStunnerEnabled(isEnabled);
-      setConfig({ ...config, stunnerEnabled: isEnabled });
-    },
-    [config]
-  );
-
-  return (
-    <Page>
-      <PageSection>
-        <PageSection variant={"light"} isFilled={true} style={{ height: "100%" }}>
-          <Form>
-            <TextContent>
-              <Text component={TextVariants.h3}>Feature Preview</Text>
-            </TextContent>
-            <TextContent>
-              <Text component={TextVariants.small}>
-                Data you provide here is necessary for configuring the preview of features that are not fully supported
-                yet. All information is locally stored in your browser and never shared with anyone.
-              </Text>
-            </TextContent>
-            <Checkbox
-              id="feature-preview-enable-stunner"
-              label="Kogito Serverless Workflow Visualization"
-              description={"Enable/disable Kogito Serverless Workflow Visualization for JSON files."}
-              isChecked={stunnerEnabled}
-              onChange={onStunnerEnabledChanged}
-            />
-          </Form>
-        </PageSection>
-      </PageSection>
-    </Page>
-  );
-}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/github/GitHubSettings.tsx b/packages/serverless-logic-web-tools/src/settings/github/GitHubSettings.tsx
similarity index 100%
rename from packages/serverless-logic-web-tools/src/newSettings/github/GitHubSettings.tsx
rename to packages/serverless-logic-web-tools/src/settings/github/GitHubSettings.tsx
diff --git a/packages/serverless-logic-web-tools/src/settings/github/GitHubSettingsTab.tsx b/packages/serverless-logic-web-tools/src/settings/github/GitHubSettingsTab.tsx
deleted file mode 100644
index 91e7937803..0000000000
--- a/packages/serverless-logic-web-tools/src/settings/github/GitHubSettingsTab.tsx
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright 2021 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import * as React from "react";
-import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
-import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
-import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-circle-icon";
-import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
-import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
-import { GithubIcon } from "@patternfly/react-icons/dist/js/icons/github-icon";
-import { Spinner } from "@patternfly/react-core/dist/js/components/Spinner";
-import { Form, FormGroup } from "@patternfly/react-core/dist/js/components/Form";
-import { InputGroup } from "@patternfly/react-core/dist/js/components/InputGroup";
-import { TextInput } from "@patternfly/react-core/dist/js/components/TextInput";
-import { useCallback, useMemo, useState } from "react";
-import { AuthStatus, useSettings, useSettingsDispatch } from "../SettingsContext";
-import { ExclamationTriangleIcon } from "@patternfly/react-icons/dist/js/icons/exclamation-triangle-icon";
-import { ExternalLinkAltIcon } from "@patternfly/react-icons/dist/js/icons/external-link-alt-icon";
-import { makeCookieName } from "../../cookies";
-
-export const GITHUB_OAUTH_TOKEN_SIZE = 40;
-export const GITHUB_TOKENS_URL = "https://github.com/settings/tokens";
-export const GITHUB_TOKENS_HOW_TO_URL =
-  "https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line";
-export const GITHUB_AUTH_TOKEN_COOKIE_NAME = makeCookieName("github", "oauth-token");
-
-export enum GitHubSignInOption {
-  PERSONAL_ACCESS_TOKEN,
-  OAUTH,
-}
-
-enum GitHubTokenScope {
-  GIST = "gist",
-  REPO = "repo",
-}
-
-export function GitHubSettingsTab() {
-  const settings = useSettings();
-  const settingsDispatch = useSettingsDispatch();
-
-  const [potentialGitHubToken, setPotentialGitHubToken] = useState<string | undefined>(undefined);
-  const [isGitHubTokenValid, setIsGitHubTokenValid] = useState(true);
-
-  const githubTokenValidated = useMemo(() => {
-    return isGitHubTokenValid ? "default" : "error";
-  }, [isGitHubTokenValid]);
-
-  const githubTokenHelperText = useMemo(() => {
-    return isGitHubTokenValid ? undefined : "Invalid token. Check if it has the 'repo' scope.";
-  }, [isGitHubTokenValid]);
-
-  const githubTokenToDisplay = useMemo(() => {
-    return obfuscate(potentialGitHubToken ?? settings.github.token);
-  }, [settings.github, potentialGitHubToken]);
-
-  const onPasteGitHubToken = useCallback(
-    (e) => {
-      const token = e.clipboardData.getData("text/plain").slice(0, GITHUB_OAUTH_TOKEN_SIZE);
-      setPotentialGitHubToken(token);
-      settingsDispatch.github.authService
-        .authenticate(token)
-        .then(() => setIsGitHubTokenValid(true))
-        .catch((e) => setIsGitHubTokenValid(false));
-    },
-    [settingsDispatch.github.authService]
-  );
-
-  const onSignOutFromGitHub = useCallback(() => {
-    settingsDispatch.github.authService.reset();
-    setPotentialGitHubToken(undefined);
-  }, [settingsDispatch.github.authService]);
-
-  return (
-    <Page>
-      {settings.github.authStatus === AuthStatus.TOKEN_EXPIRED && (
-        <PageSection>
-          <EmptyState>
-            <EmptyStateIcon icon={ExclamationTriangleIcon} />
-            <TextContent>
-              <Text component={"h2"}>GitHub Token expired</Text>
-            </TextContent>
-            <br />
-            <EmptyStateBody>
-              <TextContent>Reset your token to sign in with GitHub again.</TextContent>
-              <br />
-              <Button variant={ButtonVariant.tertiary} onClick={onSignOutFromGitHub}>
-                Reset
-              </Button>
-            </EmptyStateBody>
-          </EmptyState>
-        </PageSection>
-      )}
-      {settings.github.authStatus === AuthStatus.LOADING && (
-        <PageSection>
-          <EmptyState>
-            <EmptyStateIcon icon={GithubIcon} />
-            <TextContent>
-              <Text component={"h2"}>Signing in with GitHub</Text>
-            </TextContent>
-            <br />
-            <br />
-            <Spinner />
-          </EmptyState>
-        </PageSection>
-      )}
-      {settings.github.authStatus === AuthStatus.SIGNED_IN && (
-        <PageSection>
-          <EmptyState>
-            <EmptyStateIcon icon={CheckCircleIcon} color={"var(--pf-global--success-color--100)"} />
-            <TextContent>
-              <Text component={"h2"}>{"You're signed in with GitHub."}</Text>
-            </TextContent>
-            <EmptyStateBody>
-              <TextContent>
-                Gists are <b>{settings.github.scopes?.includes(GitHubTokenScope.GIST) ? "enabled" : "disabled"}.</b>
-              </TextContent>
-              <TextContent>
-                Private repositories are{" "}
-                <b>{settings.github.scopes?.includes(GitHubTokenScope.REPO) ? "enabled" : "disabled"}.</b>
-              </TextContent>
-              <br />
-              <TextContent>
-                <b>Token: </b>
-                <i>{obfuscate(settings.github.token)}</i>
-              </TextContent>
-              <TextContent>
-                <b>User: </b>
-                <i>{settings.github.user?.login}</i>
-              </TextContent>
-              <TextContent>
-                <b>Scope: </b>
-                <i>{settings.github.scopes?.join(", ") || "(none)"}</i>
-              </TextContent>
-              <br />
-              <Button variant={ButtonVariant.tertiary} onClick={onSignOutFromGitHub}>
-                Sign out
-              </Button>
-            </EmptyStateBody>
-          </EmptyState>
-        </PageSection>
-      )}
-      {settings.github.authStatus === AuthStatus.SIGNED_OUT && (
-        <PageSection>
-          <PageSection variant={"light"} isFilled={true} style={{ height: "100%" }}>
-            <Form>
-              <TextContent>
-                <Text component={TextVariants.h3}>GitHub</Text>
-              </TextContent>
-              <TextContent>
-                <Text component={TextVariants.small}>
-                  Data you provide here is necessary for creating repositories containing models you design, and syncing
-                  changes with GitHub. All information is locally stored in your browser and never shared with anyone.
-                </Text>
-              </TextContent>
-              <h3>
-                <a href={GITHUB_TOKENS_URL} target={"_blank"} rel="noopener noreferrer">
-                  Create a new token&nbsp;&nbsp;
-                  <ExternalLinkAltIcon />
-                </a>
-              </h3>
-              <FormGroup
-                isRequired={true}
-                helperTextInvalid={githubTokenHelperText}
-                validated={githubTokenValidated}
-                label={"Token"}
-                fieldId={"github-pat"}
-                helperText={"Your token must include the 'repo' scope."}
-              >
-                <InputGroup>
-                  <TextInput
-                    autoComplete={"off"}
-                    id="token-input"
-                    name="tokenInput"
-                    aria-describedby="token-text-input-helper"
-                    placeholder={"Paste your GitHub token here"}
-                    maxLength={GITHUB_OAUTH_TOKEN_SIZE}
-                    validated={githubTokenValidated}
-                    value={githubTokenToDisplay}
-                    onPaste={onPasteGitHubToken}
-                  />
-                </InputGroup>
-              </FormGroup>
-            </Form>
-          </PageSection>
-        </PageSection>
-      )}
-    </Page>
-  );
-}
-
-export function obfuscate(token?: string) {
-  if (!token) {
-    return undefined;
-  }
-
-  if (token.length <= 8) {
-    return token;
-  }
-
-  const stars = new Array(token.length - 8).join("*");
-  const pieceToObfuscate = token.substring(4, token.length - 4);
-  return token.replace(pieceToObfuscate, stars);
-}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/kafka/ApacheKafkaSettings.tsx b/packages/serverless-logic-web-tools/src/settings/kafka/ApacheKafkaSettings.tsx
similarity index 100%
rename from packages/serverless-logic-web-tools/src/newSettings/kafka/ApacheKafkaSettings.tsx
rename to packages/serverless-logic-web-tools/src/settings/kafka/ApacheKafkaSettings.tsx
diff --git a/packages/serverless-logic-web-tools/src/settings/kafka/ApacheKafkaSettingsTab.tsx b/packages/serverless-logic-web-tools/src/settings/kafka/ApacheKafkaSettingsTab.tsx
deleted file mode 100644
index 1d169b4376..0000000000
--- a/packages/serverless-logic-web-tools/src/settings/kafka/ApacheKafkaSettingsTab.tsx
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * Copyright 2021 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
-import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
-import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
-import { ActionGroup, Form, FormGroup, FormAlert } from "@patternfly/react-core/dist/js/components/Form";
-import { InputGroup, InputGroupText } from "@patternfly/react-core/dist/js/components/InputGroup";
-import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
-import { Popover } from "@patternfly/react-core/dist/js/components/Popover";
-import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
-import { TextInput } from "@patternfly/react-core/dist/js/components/TextInput";
-import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-circle-icon";
-import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
-import { TimesIcon } from "@patternfly/react-icons/dist/js/icons/times-icon";
-import * as React from "react";
-import { useCallback, useMemo, useState } from "react";
-import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
-import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
-import { useSettings, useSettingsDispatch } from "../SettingsContext";
-import { SettingsTabs } from "../SettingsModalBody";
-import { EMPTY_CONFIG, isKafkaConfigValid, resetConfigCookie, saveConfigCookie } from "./KafkaSettingsConfig";
-
-export function ApacheKafkaSettingsTab() {
-  const settings = useSettings();
-  const settingsDispatch = useSettingsDispatch();
-  const [config, setConfig] = useState(settings.apacheKafka.config);
-  const kieSandboxExtendedServices = useKieSandboxExtendedServices();
-
-  const isExtendedServicesRunning = useMemo(
-    () => kieSandboxExtendedServices.status === KieSandboxExtendedServicesStatus.RUNNING,
-    [kieSandboxExtendedServices.status]
-  );
-
-  const isStoredConfigValid = useMemo(
-    () => isExtendedServicesRunning && isKafkaConfigValid(settings.apacheKafka.config),
-    [isExtendedServicesRunning, settings.apacheKafka.config]
-  );
-
-  const isCurrentConfigValid = useMemo(
-    () => isExtendedServicesRunning && isKafkaConfigValid(config),
-    [isExtendedServicesRunning, config]
-  );
-
-  const onClearBootstraServer = useCallback(() => setConfig({ ...config, bootstrapServer: "" }), [config]);
-  const onClearTopic = useCallback(() => setConfig({ ...config, topic: "" }), [config]);
-
-  const onBootstrapServerChanged = useCallback(
-    (newValue: string) => setConfig({ ...config, bootstrapServer: newValue }),
-    [config]
-  );
-
-  const onTopicChanged = useCallback((newValue: string) => setConfig({ ...config, topic: newValue }), [config]);
-
-  const onReset = useCallback(() => {
-    setConfig(EMPTY_CONFIG);
-    settingsDispatch.apacheKafka.setConfig(EMPTY_CONFIG);
-    resetConfigCookie();
-  }, [settingsDispatch.apacheKafka]);
-
-  const onApply = useCallback(() => {
-    settingsDispatch.apacheKafka.setConfig(config);
-    saveConfigCookie(config);
-  }, [config, settingsDispatch.apacheKafka]);
-
-  return (
-    <Page>
-      <PageSection>
-        {isStoredConfigValid ? (
-          <EmptyState>
-            <EmptyStateIcon icon={CheckCircleIcon} color={"var(--pf-global--success-color--100)"} />
-            <TextContent>
-              <Text component={"h2"}>{"Your Streams for Apache Kafka information is set."}</Text>
-            </TextContent>
-            <EmptyStateBody>
-              <TextContent>
-                Deploying models with a KafkaSource attached to the service is <b>enabled</b>.
-              </TextContent>
-              <br />
-              <TextContent>
-                <b>Bootstrap server: </b>
-                <i>{config.bootstrapServer}</i>
-              </TextContent>
-              <TextContent>
-                <b>Topic: </b>
-                <i>{config.topic}</i>
-              </TextContent>
-              <br />
-              <Button variant={ButtonVariant.tertiary} onClick={onReset}>
-                Reset
-              </Button>
-            </EmptyStateBody>
-          </EmptyState>
-        ) : (
-          <PageSection variant={"light"} isFilled={true} style={{ height: "100%" }}>
-            <Form>
-              {!isExtendedServicesRunning && (
-                <FormAlert>
-                  <Alert
-                    variant="danger"
-                    title={
-                      <Text>
-                        Connect to{" "}
-                        <a onClick={() => settingsDispatch.open(SettingsTabs.KIE_SANDBOX_EXTENDED_SERVICES)}>
-                          KIE Sandbox Extended Services
-                        </a>{" "}
-                        before configuring your Streams for Apache Kafka instance
-                      </Text>
-                    }
-                    aria-live="polite"
-                    isInline
-                  />
-                </FormAlert>
-              )}
-              <TextContent>
-                <Text component={TextVariants.h3}>Streams for Apache Kafka</Text>
-              </TextContent>
-              <TextContent>
-                <Text component={TextVariants.small}>
-                  Data you provide here is necessary for connecting serverless deployments with your Streams for Apache
-                  Kafka instance through a KafkaSource. All information is locally stored in your browser and never
-                  shared with anyone.
-                </Text>
-              </TextContent>
-              <FormGroup
-                label={"Bootstrap Server"}
-                labelIcon={
-                  <Popover bodyContent={"The bootstrap server associated with your Streams for Apache Kafka instance."}>
-                    <button
-                      type="button"
-                      aria-label="More info for bootstrap server field"
-                      onClick={(e) => e.preventDefault()}
-                      aria-describedby="bootstrap-server-field"
-                      className="pf-c-form__group-label-help"
-                    >
-                      <HelpIcon noVerticalAlign />
-                    </button>
-                  </Popover>
-                }
-                isRequired
-                fieldId="bootstrap-server-field"
-              >
-                <InputGroup className="pf-u-mt-sm">
-                  <TextInput
-                    autoComplete={"off"}
-                    isRequired
-                    type="text"
-                    id="bootstrap-server-field"
-                    name="bootstrap-server-field"
-                    aria-label="Bootstrap server field"
-                    aria-describedby="bootstrap-server-field-helper"
-                    value={config.bootstrapServer}
-                    onChange={onBootstrapServerChanged}
-                    tabIndex={1}
-                    data-testid="bootstrap-server-text-field"
-                  />
-                  <InputGroupText>
-                    <Button
-                      isSmall
-                      variant="plain"
-                      aria-label="Clear bootstrap server button"
-                      onClick={onClearBootstraServer}
-                    >
-                      <TimesIcon />
-                    </Button>
-                  </InputGroupText>
-                </InputGroup>
-              </FormGroup>
-              <FormGroup
-                label={"Topic"}
-                labelIcon={
-                  <Popover bodyContent={"The topic that messages will flow in."}>
-                    <button
-                      type="button"
-                      aria-label="More info for topic field"
-                      onClick={(e) => e.preventDefault()}
-                      aria-describedby="topic-field"
-                      className="pf-c-form__group-label-help"
-                    >
-                      <HelpIcon noVerticalAlign />
-                    </button>
-                  </Popover>
-                }
-                isRequired
-                fieldId="topic-field"
-              >
-                <InputGroup className="pf-u-mt-sm">
-                  <TextInput
-                    autoComplete={"off"}
-                    isRequired
-                    type="text"
-                    id="topic-field"
-                    name="topic-field"
-                    aria-label="Topic field"
-                    aria-describedby="topic-field-helper"
-                    value={config.topic}
-                    onChange={onTopicChanged}
-                    tabIndex={2}
-                    data-testid="topic-text-field"
-                  />
-                  <InputGroupText>
-                    <Button isSmall variant="plain" aria-label="Clear topic button" onClick={onClearTopic}>
-                      <TimesIcon />
-                    </Button>
-                  </InputGroupText>
-                </InputGroup>
-              </FormGroup>
-              <TextContent>
-                <Text component={TextVariants.p}>
-                  <b>Note</b>: You must also provide{" "}
-                  <a onClick={() => settingsDispatch.open(SettingsTabs.SERVICE_ACCOUNT)}>Service Account</a> information
-                  so the connection with your Streams for Apache Kafka instance can be properly established.
-                </Text>
-              </TextContent>
-              <ActionGroup>
-                <Button
-                  isDisabled={!isCurrentConfigValid}
-                  id="apache-kafka-config-apply-button"
-                  key="save"
-                  variant="primary"
-                  onClick={onApply}
-                  data-testid="apply-config-button"
-                >
-                  Apply
-                </Button>
-              </ActionGroup>
-            </Form>
-          </PageSection>
-        )}
-      </PageSection>
-    </Page>
-  );
-}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettings.tsx b/packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettings.tsx
similarity index 100%
rename from packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettings.tsx
rename to packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettings.tsx
diff --git a/packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettingsSimpleConfig.tsx b/packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettingsSimpleConfig.tsx
similarity index 100%
rename from packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettingsSimpleConfig.tsx
rename to packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettingsSimpleConfig.tsx
diff --git a/packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettingsTab.tsx b/packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettingsTab.tsx
deleted file mode 100644
index 712ffab798..0000000000
--- a/packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettingsTab.tsx
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright 2021 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import * as React from "react";
-import { useCallback } from "react";
-import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
-import { useSettings, useSettingsDispatch } from "../SettingsContext";
-import { OpenShiftInstanceStatus } from "../../openshift/OpenShiftInstanceStatus";
-import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
-import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-circle-icon";
-import { Text, TextContent } from "@patternfly/react-core/dist/js/components/Text";
-import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
-import { OpenShiftSettingsTabSimpleConfig } from "./OpenShiftSettingsTabSimpleConfig";
-import { obfuscate } from "../github/GitHubSettingsTab";
-import { saveConfigCookie } from "./OpenShiftSettingsConfig";
-import { OpenShiftConnection } from "@kie-tools-core/openshift/dist/service/OpenShiftConnection";
-
-export function OpenShiftSettingsTab() {
-  const settings = useSettings();
-  const settingsDispatch = useSettingsDispatch();
-
-  const onDisconnect = useCallback(() => {
-    settingsDispatch.openshift.setStatus(OpenShiftInstanceStatus.DISCONNECTED);
-    const newConfig: OpenShiftConnection = {
-      namespace: settings.openshift.config.namespace,
-      host: settings.openshift.config.host,
-      token: "",
-    };
-    settingsDispatch.openshift.setConfig(newConfig);
-    saveConfigCookie(newConfig);
-  }, [settings.openshift.config, settingsDispatch.openshift]);
-
-  return (
-    <Page>
-      <PageSection>
-        {settings.openshift.status === OpenShiftInstanceStatus.CONNECTED && (
-          <EmptyState>
-            <EmptyStateIcon icon={CheckCircleIcon} color={"var(--pf-global--success-color--100)"} />
-            <TextContent>
-              <Text component={"h2"}>{"You're connected to OpenShift."}</Text>
-            </TextContent>
-            <EmptyStateBody>
-              <TextContent>
-                Deploying models is <b>enabled</b>.
-              </TextContent>
-              <br />
-              <TextContent>
-                <b>Token: </b>
-                <i>{obfuscate(settings.openshift.config.token)}</i>
-              </TextContent>
-              <TextContent>
-                <b>Host: </b>
-                <i>{settings.openshift.config.host}</i>
-              </TextContent>
-              <TextContent>
-                <b>Namespace (project): </b>
-                <i>{settings.openshift.config.namespace}</i>
-              </TextContent>
-              <br />
-              <Button variant={ButtonVariant.tertiary} onClick={onDisconnect}>
-                Disconnect
-              </Button>
-            </EmptyStateBody>
-          </EmptyState>
-        )}
-        {(settings.openshift.status === OpenShiftInstanceStatus.DISCONNECTED ||
-          settings.openshift.status === OpenShiftInstanceStatus.EXPIRED) && (
-          <PageSection variant={"light"} isFilled={true} style={{ height: "100%" }}>
-            <OpenShiftSettingsTabSimpleConfig />
-          </PageSection>
-        )}
-      </PageSection>
-    </Page>
-  );
-}
diff --git a/packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettingsTabSimpleConfig.tsx b/packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettingsTabSimpleConfig.tsx
deleted file mode 100644
index 4e545f9213..0000000000
--- a/packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettingsTabSimpleConfig.tsx
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
- * Copyright 2021 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import * as React from "react";
-import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
-import { Button } from "@patternfly/react-core/dist/js/components/Button";
-import { ActionGroup, Form, FormAlert, FormGroup } from "@patternfly/react-core/dist/js/components/Form";
-import { InputGroup, InputGroupText } from "@patternfly/react-core/dist/js/components/InputGroup";
-import { Popover } from "@patternfly/react-core/dist/js/components/Popover";
-import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
-import { TextInput } from "@patternfly/react-core/dist/js/components/TextInput";
-import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
-import { TimesIcon } from "@patternfly/react-icons/dist/js/icons/times-icon";
-import { useCallback, useEffect, useState } from "react";
-import { useAppI18n } from "../../i18n";
-import { OpenShiftInstanceStatus } from "../../openshift/OpenShiftInstanceStatus";
-import {
-  isOpenShiftConnectionValid,
-  OpenShiftConnection,
-} from "@kie-tools-core/openshift/dist/service/OpenShiftConnection";
-import { EMPTY_CONFIG, saveConfigCookie } from "./OpenShiftSettingsConfig";
-import { useSettings, useSettingsDispatch } from "../SettingsContext";
-import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
-import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
-import { SettingsTabs } from "../SettingsModalBody";
-
-enum FormValiationOptions {
-  INITIAL = "INITIAL",
-  INVALID = "INVALID",
-  CONNECTION_ERROR = "CONNECTION_ERROR",
-  CONFIG_EXPIRED = "CONFIG_EXPIRED",
-}
-
-export function OpenShiftSettingsTabSimpleConfig() {
-  const { i18n } = useAppI18n();
-  const settings = useSettings();
-  const settingsDispatch = useSettingsDispatch();
-  const [config, setConfig] = useState(settings.openshift.config);
-  const [isConfigValidated, setConfigValidated] = useState(FormValiationOptions.INITIAL);
-  const [isConnecting, setConnecting] = useState(false);
-  const kieSandboxExtendedServices = useKieSandboxExtendedServices();
-
-  useEffect(() => {
-    setConfig(settings.openshift.config);
-    setConfigValidated(
-      settings.openshift.status === OpenShiftInstanceStatus.EXPIRED
-        ? FormValiationOptions.CONFIG_EXPIRED
-        : FormValiationOptions.INITIAL
-    );
-  }, [settings.openshift.config, settings.openshift.status]);
-
-  const resetConfig = useCallback(
-    (config: OpenShiftConnection) => {
-      setConfigValidated(
-        settings.openshift.status === OpenShiftInstanceStatus.EXPIRED && config !== EMPTY_CONFIG
-          ? FormValiationOptions.CONFIG_EXPIRED
-          : FormValiationOptions.INITIAL
-      );
-      setConnecting(false);
-      setConfig(config);
-    },
-    [settings.openshift.status]
-  );
-
-  const onConnect = useCallback(async () => {
-    if (isConnecting) {
-      return;
-    }
-
-    if (!isOpenShiftConnectionValid(config)) {
-      setConfigValidated(FormValiationOptions.INVALID);
-      return;
-    }
-
-    setConnecting(true);
-    const isConfigOk = await settingsDispatch.openshift.service.isConnectionEstablished(config);
-
-    if (isConfigOk) {
-      saveConfigCookie(config);
-      settingsDispatch.openshift.setConfig(config);
-      settingsDispatch.openshift.setStatus(OpenShiftInstanceStatus.CONNECTED);
-    }
-
-    setConnecting(false);
-
-    if (!isConfigOk) {
-      setConfigValidated(FormValiationOptions.CONNECTION_ERROR);
-      return;
-    }
-
-    resetConfig(config);
-  }, [config, isConnecting, resetConfig, settingsDispatch.openshift]);
-
-  const onClearHost = useCallback(() => setConfig({ ...config, host: "" }), [config]);
-  const onClearNamespace = useCallback(() => setConfig({ ...config, namespace: "" }), [config]);
-  const onClearToken = useCallback(() => setConfig({ ...config, token: "" }), [config]);
-
-  const onHostChanged = useCallback(
-    (newValue: string) => {
-      setConfig({ ...config, host: newValue });
-    },
-    [config]
-  );
-
-  const onNamespaceChanged = useCallback(
-    (newValue: string) => {
-      setConfig({ ...config, namespace: newValue });
-    },
-    [config]
-  );
-
-  const onTokenChanged = useCallback(
-    (newValue: string) => {
-      setConfig({ ...config, token: newValue });
-    },
-    [config]
-  );
-
-  return (
-    <>
-      <Form>
-        {kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.RUNNING && (
-          <FormAlert>
-            <Alert
-              variant="danger"
-              title={
-                <Text>
-                  Connect to{" "}
-                  <a onClick={() => settingsDispatch.open(SettingsTabs.KIE_SANDBOX_EXTENDED_SERVICES)}>
-                    KIE Sandbox Extended Services
-                  </a>{" "}
-                  before configuring your OpenShift instance
-                </Text>
-              }
-              aria-live="polite"
-              isInline
-            />
-          </FormAlert>
-        )}
-        {isConfigValidated === FormValiationOptions.INVALID && (
-          <FormAlert>
-            <Alert
-              variant="danger"
-              title={i18n.openshift.configModal.validationError}
-              aria-live="polite"
-              isInline
-              data-testid="alert-validation-error"
-            />
-          </FormAlert>
-        )}
-        {isConfigValidated === FormValiationOptions.CONNECTION_ERROR && (
-          <FormAlert>
-            <Alert
-              variant="danger"
-              title={i18n.openshift.configModal.connectionError}
-              aria-live="polite"
-              isInline
-              data-testid="alert-connection-error"
-            />
-          </FormAlert>
-        )}
-        {isConfigValidated === FormValiationOptions.CONFIG_EXPIRED && (
-          <FormAlert>
-            <Alert
-              variant="warning"
-              title={i18n.openshift.configModal.configExpiredWarning}
-              aria-live="polite"
-              isInline
-              data-testid="alert-config-expired-warning"
-            />
-          </FormAlert>
-        )}
-        <TextContent>
-          <Text component={TextVariants.h3}>OpenShift</Text>
-        </TextContent>
-        <TextContent>
-          <Text component={TextVariants.small}>
-            Data you provide here is necessary for deploying models you design to your OpenShift instance. All
-            information is locally stored in your browser and never shared with anyone.
-          </Text>
-        </TextContent>
-        <FormGroup
-          label={i18n.terms.namespace}
-          labelIcon={
-            <Popover bodyContent={i18n.openshift.configModal.namespaceInfo}>
-              <button
-                type="button"
-                aria-label="More info for namespace field"
-                onClick={(e) => e.preventDefault()}
-                aria-describedby="namespace-field"
-                className="pf-c-form__group-label-help"
-              >
-                <HelpIcon noVerticalAlign />
-              </button>
-            </Popover>
-          }
-          isRequired
-          fieldId="namespace-field"
-        >
-          <InputGroup className="pf-u-mt-sm">
-            <TextInput
-              autoComplete={"off"}
-              isRequired
-              type="text"
-              id="namespace-field"
-              name="namespace-field"
-              aria-label="Namespace field"
-              aria-describedby="namespace-field-helper"
-              value={config.namespace}
-              onChange={onNamespaceChanged}
-              isDisabled={isConnecting}
-              tabIndex={1}
-              data-testid="namespace-text-field"
-            />
-            <InputGroupText>
-              <Button isSmall variant="plain" aria-label="Clear namespace button" onClick={onClearNamespace}>
-                <TimesIcon />
-              </Button>
-            </InputGroupText>
-          </InputGroup>
-        </FormGroup>
-        <FormGroup
-          label={i18n.terms.host}
-          labelIcon={
-            <Popover bodyContent={i18n.openshift.configModal.hostInfo}>
-              <button
-                type="button"
-                aria-label="More info for host field"
-                onClick={(e) => e.preventDefault()}
-                aria-describedby="host-field"
-                className="pf-c-form__group-label-help"
-              >
-                <HelpIcon noVerticalAlign />
-              </button>
-            </Popover>
-          }
-          isRequired
-          fieldId="host-field"
-        >
-          <InputGroup className="pf-u-mt-sm">
-            <TextInput
-              autoComplete={"off"}
-              isRequired
-              type="text"
-              id="host-field"
-              name="host-field"
-              aria-label="Host field"
-              aria-describedby="host-field-helper"
-              value={config.host}
-              onChange={onHostChanged}
-              isDisabled={isConnecting}
-              tabIndex={2}
-              data-testid="host-text-field"
-            />
-            <InputGroupText>
-              <Button isSmall variant="plain" aria-label="Clear host button" onClick={onClearHost}>
-                <TimesIcon />
-              </Button>
-            </InputGroupText>
-          </InputGroup>
-        </FormGroup>
-        <FormGroup
-          label={i18n.terms.token}
-          labelIcon={
-            <Popover bodyContent={i18n.openshift.configModal.tokenInfo}>
-              <button
-                type="button"
-                aria-label="More info for token field"
-                onClick={(e) => e.preventDefault()}
-                aria-describedby="token-field"
-                className="pf-c-form__group-label-help"
-              >
-                <HelpIcon noVerticalAlign />
-              </button>
-            </Popover>
-          }
-          isRequired
-          fieldId="token-field"
-        >
-          <InputGroup className="pf-u-mt-sm">
-            <TextInput
-              autoComplete={"off"}
-              isRequired
-              type="text"
-              id="token-field"
-              name="token-field"
-              aria-label="Token field"
-              aria-describedby="token-field-helper"
-              value={config.token}
-              onChange={onTokenChanged}
-              isDisabled={isConnecting}
-              tabIndex={3}
-              data-testid="token-text-field"
-            />
-            <InputGroupText>
-              <Button isSmall variant="plain" aria-label="Clear token button" onClick={onClearToken}>
-                <TimesIcon />
-              </Button>
-            </InputGroupText>
-          </InputGroup>
-        </FormGroup>
-        <ActionGroup>
-          <Button
-            id="openshift-config-save-button"
-            key="save"
-            variant="primary"
-            onClick={onConnect}
-            data-testid="save-config-button"
-            isLoading={isConnecting}
-            isDisabled={kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.RUNNING}
-            spinnerAriaValueText={isConnecting ? "Loading" : undefined}
-          >
-            {isConnecting ? "Connecting" : "Connect"}
-          </Button>
-        </ActionGroup>
-      </Form>
-    </>
-  );
-}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/routes/SettingsPageRoutes.tsx b/packages/serverless-logic-web-tools/src/settings/routes/SettingsPageRoutes.tsx
similarity index 100%
rename from packages/serverless-logic-web-tools/src/newSettings/routes/SettingsPageRoutes.tsx
rename to packages/serverless-logic-web-tools/src/settings/routes/SettingsPageRoutes.tsx
diff --git a/packages/serverless-logic-web-tools/src/settings/serviceAccount/ServiceAccountConfig.tsx b/packages/serverless-logic-web-tools/src/settings/serviceAccount/ServiceAccountConfig.tsx
index 781dcd609d..1b9bb2d77a 100644
--- a/packages/serverless-logic-web-tools/src/settings/serviceAccount/ServiceAccountConfig.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/serviceAccount/ServiceAccountConfig.tsx
@@ -1,5 +1,5 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/packages/serverless-logic-web-tools/src/newSettings/serviceAccount/ServiceAccountSettings.tsx b/packages/serverless-logic-web-tools/src/settings/serviceAccount/ServiceAccountSettings.tsx
similarity index 100%
rename from packages/serverless-logic-web-tools/src/newSettings/serviceAccount/ServiceAccountSettings.tsx
rename to packages/serverless-logic-web-tools/src/settings/serviceAccount/ServiceAccountSettings.tsx
diff --git a/packages/serverless-logic-web-tools/src/settings/serviceAccount/ServiceAccountSettingsTab.tsx b/packages/serverless-logic-web-tools/src/settings/serviceAccount/ServiceAccountSettingsTab.tsx
deleted file mode 100644
index 58d61cf9ae..0000000000
--- a/packages/serverless-logic-web-tools/src/settings/serviceAccount/ServiceAccountSettingsTab.tsx
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright 2021 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
-import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
-import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
-import { ActionGroup, Form, FormGroup, FormAlert } from "@patternfly/react-core/dist/js/components/Form";
-import { InputGroup, InputGroupText } from "@patternfly/react-core/dist/js/components/InputGroup";
-import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
-import { Popover } from "@patternfly/react-core/dist/js/components/Popover";
-import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
-import { TextInput } from "@patternfly/react-core/dist/js/components/TextInput";
-import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-circle-icon";
-import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
-import { TimesIcon } from "@patternfly/react-icons/dist/js/icons/times-icon";
-import * as React from "react";
-import { useCallback, useMemo, useState } from "react";
-import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
-import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
-import { useSettings, useSettingsDispatch } from "../SettingsContext";
-import { SettingsTabs } from "../SettingsModalBody";
-import { EMPTY_CONFIG, isServiceAccountConfigValid, resetConfigCookie, saveConfigCookie } from "./ServiceAccountConfig";
-
-export function ServiceAccountSettingsTab() {
-  const settings = useSettings();
-  const settingsDispatch = useSettingsDispatch();
-  const [config, setConfig] = useState(settings.serviceAccount.config);
-  const kieSandboxExtendedServices = useKieSandboxExtendedServices();
-
-  const isExtendedServicesRunning = useMemo(
-    () => kieSandboxExtendedServices.status === KieSandboxExtendedServicesStatus.RUNNING,
-    [kieSandboxExtendedServices.status]
-  );
-
-  const isStoredConfigValid = useMemo(
-    () => isExtendedServicesRunning && isServiceAccountConfigValid(settings.serviceAccount.config),
-    [isExtendedServicesRunning, settings.serviceAccount.config]
-  );
-
-  const isCurrentConfigValid = useMemo(
-    () => isExtendedServicesRunning && isServiceAccountConfigValid(config),
-    [config, isExtendedServicesRunning]
-  );
-
-  const onClearClientId = useCallback(() => setConfig({ ...config, clientId: "" }), [config]);
-  const onClearClientSecret = useCallback(() => setConfig({ ...config, clientSecret: "" }), [config]);
-
-  const onClientIdChanged = useCallback(
-    (newValue: string) => {
-      setConfig({ ...config, clientId: newValue });
-    },
-    [config]
-  );
-
-  const onClientSecretChanged = useCallback(
-    (newValue: string) => {
-      setConfig({ ...config, clientSecret: newValue });
-    },
-    [config]
-  );
-
-  const onReset = useCallback(() => {
-    setConfig(EMPTY_CONFIG);
-    settingsDispatch.serviceAccount.setConfig(EMPTY_CONFIG);
-    resetConfigCookie();
-  }, [settingsDispatch.serviceAccount]);
-
-  const onApply = useCallback(() => {
-    settingsDispatch.serviceAccount.setConfig(config);
-    saveConfigCookie(config);
-  }, [config, settingsDispatch.serviceAccount]);
-
-  return (
-    <Page>
-      <PageSection>
-        {isStoredConfigValid ? (
-          <EmptyState>
-            <EmptyStateIcon icon={CheckCircleIcon} color={"var(--pf-global--success-color--100)"} />
-            <TextContent>
-              <Text component={"h2"}>{"Your Service Account information is set."}</Text>
-            </TextContent>
-            <EmptyStateBody>
-              <TextContent>
-                Accessing your Service Registry and Streams for Apache Kafka is <b>enabled</b>.
-              </TextContent>
-              <br />
-              <TextContent>
-                <b>Client ID: </b>
-                <i>{config.clientId}</i>
-              </TextContent>
-              <br />
-              <TextContent>
-                <b>Client secret: </b>
-                <i>{obfuscate(config.clientSecret)}</i>
-              </TextContent>
-              <br />
-              <Button variant={ButtonVariant.tertiary} onClick={onReset}>
-                Reset
-              </Button>
-            </EmptyStateBody>
-          </EmptyState>
-        ) : (
-          <PageSection variant={"light"} isFilled={true} style={{ height: "100%" }}>
-            <Form>
-              {!isExtendedServicesRunning && (
-                <FormAlert>
-                  <Alert
-                    variant="danger"
-                    title={
-                      <Text>
-                        Connect to{" "}
-                        <a onClick={() => settingsDispatch.open(SettingsTabs.KIE_SANDBOX_EXTENDED_SERVICES)}>
-                          KIE Sandbox Extended Services
-                        </a>{" "}
-                        before configuring your Service Account
-                      </Text>
-                    }
-                    aria-live="polite"
-                    isInline
-                  />
-                </FormAlert>
-              )}
-              <TextContent>
-                <Text component={TextVariants.h3}>Service Account</Text>
-              </TextContent>
-              <TextContent>
-                <Text component={TextVariants.small}>
-                  Data you provide here is necessary for uploading Open API specs associated with models you design to
-                  your Service Registry instance and also connecting deployments with your Streams for Apache Kafka
-                  instance. All information is locally stored in your browser and never shared with anyone.
-                </Text>
-              </TextContent>
-              <FormGroup
-                label={"Client ID"}
-                labelIcon={
-                  <Popover bodyContent={"Client ID"}>
-                    <button
-                      type="button"
-                      aria-label="More info for client id field"
-                      onClick={(e) => e.preventDefault()}
-                      aria-describedby="client-id-field"
-                      className="pf-c-form__group-label-help"
-                    >
-                      <HelpIcon noVerticalAlign />
-                    </button>
-                  </Popover>
-                }
-                isRequired
-                fieldId="client-id-field"
-              >
-                <InputGroup className="pf-u-mt-sm">
-                  <TextInput
-                    autoComplete={"off"}
-                    isRequired
-                    type="text"
-                    id="client-id-field"
-                    name="client-id-field"
-                    aria-label="Client ID field"
-                    aria-describedby="client-id-field-helper"
-                    value={config.clientId}
-                    onChange={onClientIdChanged}
-                    tabIndex={1}
-                    data-testid="client-id-text-field"
-                  />
-                  <InputGroupText>
-                    <Button isSmall variant="plain" aria-label="Clear client id button" onClick={onClearClientId}>
-                      <TimesIcon />
-                    </Button>
-                  </InputGroupText>
-                </InputGroup>
-              </FormGroup>
-              <FormGroup
-                label={"Client Secret"}
-                labelIcon={
-                  <Popover bodyContent={"Client Secret"}>
-                    <button
-                      type="button"
-                      aria-label="More info for client secret field"
-                      onClick={(e) => e.preventDefault()}
-                      aria-describedby="client-secret-field"
-                      className="pf-c-form__group-label-help"
-                    >
-                      <HelpIcon noVerticalAlign />
-                    </button>
-                  </Popover>
-                }
-                isRequired
-                fieldId="client-secret-field"
-              >
-                <InputGroup className="pf-u-mt-sm">
-                  <TextInput
-                    autoComplete={"off"}
-                    isRequired
-                    type="text"
-                    id="client-secret-field"
-                    name="client-secret-field"
-                    aria-label="Client secret field"
-                    aria-describedby="client-secret-field-helper"
-                    value={config.clientSecret}
-                    onChange={onClientSecretChanged}
-                    tabIndex={2}
-                    data-testid="client-secret-text-field"
-                  />
-                  <InputGroupText>
-                    <Button
-                      isSmall
-                      variant="plain"
-                      aria-label="Clear client secret button"
-                      onClick={onClearClientSecret}
-                    >
-                      <TimesIcon />
-                    </Button>
-                  </InputGroupText>
-                </InputGroup>
-              </FormGroup>
-              <ActionGroup>
-                <Button
-                  isDisabled={!isCurrentConfigValid}
-                  id="service-account-config-apply-button"
-                  key="save"
-                  variant="primary"
-                  onClick={onApply}
-                  data-testid="apply-config-button"
-                >
-                  Apply
-                </Button>
-              </ActionGroup>
-            </Form>
-          </PageSection>
-        )}
-      </PageSection>
-    </Page>
-  );
-}
-
-export function obfuscate(token?: string) {
-  if (!token) {
-    return undefined;
-  }
-
-  if (token.length <= 10) {
-    return new Array(10).join("*");
-  }
-
-  const stars = new Array(token.length - 4).join("*");
-  const pieceToObfuscate = token.substring(0, token.length - 4);
-  return token.replace(pieceToObfuscate, stars);
-}
diff --git a/packages/serverless-logic-web-tools/src/settings/serviceRegistry/ServiceRegistryConfig.tsx b/packages/serverless-logic-web-tools/src/settings/serviceRegistry/ServiceRegistryConfig.tsx
index 1ed89d6b07..49dad4fe02 100644
--- a/packages/serverless-logic-web-tools/src/settings/serviceRegistry/ServiceRegistryConfig.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/serviceRegistry/ServiceRegistryConfig.tsx
@@ -1,5 +1,5 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/packages/serverless-logic-web-tools/src/newSettings/serviceRegistry/ServiceRegistrySettings.tsx b/packages/serverless-logic-web-tools/src/settings/serviceRegistry/ServiceRegistrySettings.tsx
similarity index 97%
rename from packages/serverless-logic-web-tools/src/newSettings/serviceRegistry/ServiceRegistrySettings.tsx
rename to packages/serverless-logic-web-tools/src/settings/serviceRegistry/ServiceRegistrySettings.tsx
index 0954800caa..9736e7af5c 100644
--- a/packages/serverless-logic-web-tools/src/newSettings/serviceRegistry/ServiceRegistrySettings.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/serviceRegistry/ServiceRegistrySettings.tsx
@@ -100,9 +100,8 @@ export function ServiceRegistrySettings(props: SettingsPageProps) {
         <TextContent>
           <Text component={TextVariants.h1}>Service Registry</Text>
           <Text component={TextVariants.p}>
-            Data you provide here is necessary for uploading Open API specs associated with models you design to your
-            Service Registry instance.
-            <br /> All information is locally stored in your browser and never shared with anyone.
+            Data you provide here is necessary for uploading specs associated with models you design to your Service
+            Registry instance. All information is locally stored in your browser and never shared with anyone.
           </Text>
         </TextContent>
       </PageSection>
@@ -136,7 +135,7 @@ export function ServiceRegistrySettings(props: SettingsPageProps) {
                 <Text component={"h2"}>{"Your Service Registry information is set."}</Text>
               </TextContent>
               <EmptyStateBody>
-                Uploading OpenAPI specs when deploying models is <b>enabled</b>.
+                Uploading specs when deploying models is <b>enabled</b>.
                 <br />
                 <b>Service Registry Name: </b>
                 <i>{config.name}</i>
diff --git a/packages/serverless-logic-web-tools/src/settings/serviceRegistry/ServiceRegistrySettingsTab.tsx b/packages/serverless-logic-web-tools/src/settings/serviceRegistry/ServiceRegistrySettingsTab.tsx
deleted file mode 100644
index aa9344ac5d..0000000000
--- a/packages/serverless-logic-web-tools/src/settings/serviceRegistry/ServiceRegistrySettingsTab.tsx
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Copyright 2021 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
-import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
-import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
-import { ActionGroup, Form, FormGroup, FormAlert } from "@patternfly/react-core/dist/js/components/Form";
-import { InputGroup, InputGroupText } from "@patternfly/react-core/dist/js/components/InputGroup";
-import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
-import { Popover } from "@patternfly/react-core/dist/js/components/Popover";
-import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
-import { TextInput } from "@patternfly/react-core/dist/js/components/TextInput";
-import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-circle-icon";
-import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
-import { TimesIcon } from "@patternfly/react-icons/dist/js/icons/times-icon";
-import * as React from "react";
-import { useCallback, useMemo, useState } from "react";
-import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
-import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
-import { useSettings, useSettingsDispatch } from "../SettingsContext";
-import { SettingsTabs } from "../SettingsModalBody";
-import {
-  EMPTY_CONFIG,
-  isServiceRegistryConfigValid,
-  resetConfigCookie,
-  saveConfigCookie,
-} from "./ServiceRegistryConfig";
-
-export function ServiceRegistrySettingsTab() {
-  const settings = useSettings();
-  const settingsDispatch = useSettingsDispatch();
-  const [config, setConfig] = useState(settings.serviceRegistry.config);
-  const kieSandboxExtendedServices = useKieSandboxExtendedServices();
-
-  const isExtendedServicesRunning = useMemo(
-    () => kieSandboxExtendedServices.status === KieSandboxExtendedServicesStatus.RUNNING,
-    [kieSandboxExtendedServices.status]
-  );
-
-  const isStoredConfigValid = useMemo(
-    () => isExtendedServicesRunning && isServiceRegistryConfigValid(settings.serviceRegistry.config),
-    [isExtendedServicesRunning, settings.serviceRegistry.config]
-  );
-
-  const isCurrentConfigValid = useMemo(
-    () => isExtendedServicesRunning && isServiceRegistryConfigValid(config),
-    [isExtendedServicesRunning, config]
-  );
-
-  const onClearName = useCallback(() => setConfig({ ...config, name: "" }), [config]);
-
-  const onClearCoreRegistryApi = useCallback(() => setConfig({ ...config, coreRegistryApi: "" }), [config]);
-
-  const onNameChanged = useCallback((newValue: string) => setConfig({ ...config, name: newValue }), [config]);
-
-  const onCoreRegistryApiChanged = useCallback(
-    (newValue: string) => setConfig({ ...config, coreRegistryApi: newValue }),
-    [config]
-  );
-
-  const onReset = useCallback(() => {
-    setConfig(EMPTY_CONFIG);
-    settingsDispatch.serviceRegistry.setConfig(EMPTY_CONFIG);
-    resetConfigCookie();
-  }, [settingsDispatch.serviceRegistry]);
-
-  const onApply = useCallback(() => {
-    settingsDispatch.serviceRegistry.setConfig(config);
-    saveConfigCookie(config);
-  }, [config, settingsDispatch.serviceRegistry]);
-
-  return (
-    <Page>
-      <PageSection>
-        {isStoredConfigValid ? (
-          <EmptyState>
-            <EmptyStateIcon icon={CheckCircleIcon} color={"var(--pf-global--success-color--100)"} />
-            <TextContent>
-              <Text component={"h2"}>{"Your Service Registry information is set."}</Text>
-            </TextContent>
-            <EmptyStateBody>
-              <TextContent>
-                Uploading specs when deploying models is <b>enabled</b>.
-              </TextContent>
-              <br />
-              <TextContent>
-                <b>Service Registry Name: </b>
-                <i>{config.name}</i>
-              </TextContent>
-              <br />
-              <TextContent>
-                <b>Core Registry Api: </b>
-                <i>{config.coreRegistryApi}</i>
-              </TextContent>
-              <br />
-              <Button variant={ButtonVariant.tertiary} onClick={onReset}>
-                Reset
-              </Button>
-            </EmptyStateBody>
-          </EmptyState>
-        ) : (
-          <PageSection variant={"light"} isFilled={true} style={{ height: "100%" }}>
-            <Form>
-              {!isExtendedServicesRunning && (
-                <FormAlert>
-                  <Alert
-                    variant="danger"
-                    title={
-                      <Text>
-                        Connect to{" "}
-                        <a onClick={() => settingsDispatch.open(SettingsTabs.KIE_SANDBOX_EXTENDED_SERVICES)}>
-                          KIE Sandbox Extended Services
-                        </a>{" "}
-                        before configuring your Service Registry instance
-                      </Text>
-                    }
-                    aria-live="polite"
-                    isInline
-                  />
-                </FormAlert>
-              )}
-              <TextContent>
-                <Text component={TextVariants.h3}>Service Registry</Text>
-              </TextContent>
-              <TextContent>
-                <Text component={TextVariants.small}>
-                  Data you provide here is necessary for uploading specs associated with models you design to your
-                  Service Registry instance. All information is locally stored in your browser and never shared with
-                  anyone.
-                </Text>
-              </TextContent>
-              <FormGroup
-                label={"Name"}
-                labelIcon={
-                  <Popover
-                    bodyContent={
-                      "Name to identify your Service Registry instance across the Serverless Logic Web Tools."
-                    }
-                  >
-                    <button
-                      type="button"
-                      aria-label="More info for name field"
-                      onClick={(e) => e.preventDefault()}
-                      aria-describedby="name-field"
-                      className="pf-c-form__group-label-help"
-                    >
-                      <HelpIcon noVerticalAlign />
-                    </button>
-                  </Popover>
-                }
-                isRequired
-                fieldId="name-field"
-              >
-                <InputGroup className="pf-u-mt-sm">
-                  <TextInput
-                    autoComplete={"off"}
-                    isRequired
-                    type="text"
-                    id="name-field"
-                    name="name-field"
-                    aria-label="Name field"
-                    aria-describedby="name-field-helper"
-                    value={config.name}
-                    onChange={onNameChanged}
-                    tabIndex={1}
-                    data-testid="name-text-field"
-                  />
-                  <InputGroupText>
-                    <Button isSmall variant="plain" aria-label="Clear name button" onClick={onClearName}>
-                      <TimesIcon />
-                    </Button>
-                  </InputGroupText>
-                </InputGroup>
-              </FormGroup>
-              <FormGroup
-                label={"Core Registry API"}
-                labelIcon={
-                  <Popover bodyContent={"Core Registry API URL associated with your Service Registry instance."}>
-                    <button
-                      type="button"
-                      aria-label="More info for core registry api field"
-                      onClick={(e) => e.preventDefault()}
-                      aria-describedby="core-registry-api-field"
-                      className="pf-c-form__group-label-help"
-                    >
-                      <HelpIcon noVerticalAlign />
-                    </button>
-                  </Popover>
-                }
-                isRequired
-                fieldId="core-registry-api-field"
-              >
-                <InputGroup className="pf-u-mt-sm">
-                  <TextInput
-                    autoComplete={"off"}
-                    isRequired
-                    type="text"
-                    id="core-registry-api-field"
-                    name="core-registry-api-field"
-                    aria-label="Core Registry API field"
-                    aria-describedby="core-registry-api-field-helper"
-                    value={config.coreRegistryApi}
-                    onChange={onCoreRegistryApiChanged}
-                    tabIndex={2}
-                    data-testid="core-registry-api-text-field"
-                  />
-                  <InputGroupText>
-                    <Button
-                      isSmall
-                      variant="plain"
-                      aria-label="Clear core registry api button"
-                      onClick={onClearCoreRegistryApi}
-                    >
-                      <TimesIcon />
-                    </Button>
-                  </InputGroupText>
-                </InputGroup>
-              </FormGroup>
-              <TextContent>
-                <Text component={TextVariants.p}>
-                  <b>Note</b>: You must also provide{" "}
-                  <a onClick={() => settingsDispatch.open(SettingsTabs.SERVICE_ACCOUNT)}>Service Account</a> information
-                  so the connection with your Service Registry instance can be properly established.
-                </Text>
-              </TextContent>
-              <ActionGroup>
-                <Button
-                  isDisabled={!isCurrentConfigValid}
-                  id="service-registry-config-apply-button"
-                  key="save"
-                  variant="primary"
-                  onClick={onApply}
-                  data-testid="apply-config-button"
-                >
-                  Apply
-                </Button>
-              </ActionGroup>
-            </Form>
-          </PageSection>
-        )}
-      </PageSection>
-    </Page>
-  );
-}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/types.ts b/packages/serverless-logic-web-tools/src/settings/types.ts
similarity index 100%
rename from packages/serverless-logic-web-tools/src/newSettings/types.ts
rename to packages/serverless-logic-web-tools/src/settings/types.ts
diff --git a/packages/serverless-logic-web-tools/src/newSettings/uiNav/SettingsPageNav.tsx b/packages/serverless-logic-web-tools/src/settings/uiNav/SettingsPageNav.tsx
similarity index 100%
rename from packages/serverless-logic-web-tools/src/newSettings/uiNav/SettingsPageNav.tsx
rename to packages/serverless-logic-web-tools/src/settings/uiNav/SettingsPageNav.tsx


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 22/27: Merge remote-tracking branch 'upstream/main' into KOGITO-8015-feature-preview

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit 823500e4a27f694cc3f81521fb003b0a9071bc19
Merge: 15fcd99b0b 2422c3ca1a
Author: fantonangeli <fa...@gmail.com>
AuthorDate: Fri May 19 08:58:57 2023 +0200

    Merge remote-tracking branch 'upstream/main' into KOGITO-8015-feature-preview

 .github/workflows/release_build.yml                |    2 +-
 RELEASE_PROCESS.md                                 |    7 +
 .../base64png-editor-chrome-extension/package.json |    2 +-
 .../base64png-editor-vscode-extension/package.json |    2 +-
 examples/base64png-editor/package.json             |    2 +-
 examples/commit-message-validation-service/go.mod  |   23 +-
 examples/commit-message-validation-service/go.sum  |   49 +-
 examples/ping-pong-view-angular/package.json       |   26 +-
 examples/ping-pong-view-react/package.json         |    2 +-
 examples/ping-pong-view/package.json               |    2 +-
 .../todo-list-view-vscode-extension/package.json   |    2 +-
 examples/todo-list-view/package.json               |    2 +-
 examples/uniforms-patternfly/package.json          |    2 +-
 examples/webapp/package.json                       |    2 +-
 packages/backend/package.json                      |    2 +-
 packages/boxed-expression-component/package.json   |    2 +-
 .../src/resizing/WidthConstants.ts                 |    8 +-
 .../src/selection/BeeTableSelectionContext.tsx     |   43 +-
 .../src/table/BeeTable/BeeTableTd.tsx              |   30 +-
 .../src/table/BeeTable/BeeTableThResizable.tsx     |   81 +-
 .../package.json                                   |    2 +-
 .../package.json                                   |    2 +-
 packages/chrome-extension/package.json             |    2 +-
 packages/dashbuilder-component-api/package.json    |    2 +-
 packages/dashbuilder-component-dev/package.json    |    2 +-
 .../package.json                                   |    2 +-
 .../dashbuilder-component-echarts/package.json     |    2 +-
 packages/dashbuilder-component-map/package.json    |    2 +-
 .../dashbuilder-component-svg-heatmap/package.json |    2 +-
 packages/dashbuilder-component-table/package.json  |    2 +-
 .../dashbuilder-component-timeseries/package.json  |    2 +-
 .../dashbuilder-component-uniforms/package.json    |    2 +-
 .../package.json                                   |    2 +-
 packages/dashbuilder-editor/package.json           |    2 +-
 packages/dashbuilder-language-service/package.json |    2 +-
 .../package.json                                   |    2 +-
 packages/dashbuilder-viewer/package.json           |    2 +-
 .../dashbuilder/appformer/uberfire-commons/pom.xml |   58 -
 .../uberfire-layout-editor-client/pom.xml          |   21 -
 .../uberfire-runtime-plugins-client/pom.xml        |  109 +-
 .../layout/editor/MarkdownLayoutDragComponent.java |   49 +
 .../perspective/editor/layout/editor/Marked.java}  |   26 +-
 ...{WebAppResource.java => ResourcesInjector.java} |   34 +-
 .../plugin/client/resources/WebAppResource.java    |    9 +-
 .../appformer/uberfire-testing-utils/pom.xml       |    9 -
 .../pom.xml                                        |   13 -
 .../uberfire-workbench-client/pom.xml              |    5 -
 .../dashbuilder-common-client/pom.xml              |   38 -
 .../dashbuilder-dataset-client/pom.xml             |   32 -
 .../dashbuilder-displayer-client/pom.xml           |   37 +-
 .../dashbuilder-displayer-editor/pom.xml           |   25 -
 .../dashbuilder-navigation-client/pom.xml          |   21 -
 .../dashbuilder-renderer-c3/pom.xml                |   12 +-
 .../dashbuilder-renderer-default/pom.xml           |   27 +-
 .../dashbuilder-renderer-echarts/pom.xml           |   44 -
 .../dashbuilder-runtime-client/pom.xml             |   45 -
 .../marshalling/LayoutTemplateJSONMarshaller.java  |   56 +-
 .../LayoutTemplateJSONMarshallerTest.java          |   18 +-
 .../dashbuilder-navigation-api/pom.xml             |    5 -
 .../dashbuilder-services-api/pom.xml               |   15 -
 .../kie-soup-dataset/kie-soup-dataset-core/pom.xml |    7 -
 packages/dashbuilder/pom.xml                       |   22 +-
 .../dmn-dev-deployment-base-image/Containerfile    |   12 +-
 .../dmn-dev-deployment-form-webapp/package.json    |    2 +-
 packages/dmn-language-service/package.json         |    2 +-
 .../{form/src/index.ts => dmn-runner/env/index.js} |   19 +-
 .../jest.config.js}                                |   26 +-
 packages/{envelope => dmn-runner}/package.json     |   17 +-
 .../{form => dmn-runner}/src/ErrorBoundary.tsx     |    0
 .../src/constants.ts}                              |   16 +-
 .../src/uniforms/DmnAutoFieldProvider.tsx          |    8 +-
 .../src/uniforms/DmnFeelContextField.tsx           |   19 +-
 .../{form/src => dmn-runner/src/uniforms}/index.ts |   13 +-
 packages/dmn-runner/tsconfig.json                  |   12 +
 packages/editor/package.json                       |    2 +-
 packages/envelope-bus/package.json                 |    2 +-
 .../src/common/EnvelopeBusMessageManager.ts        |    4 +-
 packages/envelope/package.json                     |    2 +-
 packages/extended-services-api/package.json        |    2 +-
 packages/extended-services-api/src/dmnResult.ts    |    9 +-
 packages/feel-input-component/package.json         |    2 +-
 packages/form-dmn/package.json                     |    3 +-
 packages/form-dmn/src/DmnForm.tsx                  |    4 +-
 packages/form-dmn/src/DmnFormResult.tsx            |   82 +-
 packages/form-dmn/src/DmnValidator.ts              |   17 +-
 packages/form-dmn/src/i18n/DmnFormI18n.ts          |    4 +-
 .../src/uniforms/DmnFormJsonSchemaBridge.ts        |    6 +-
 packages/form-generation-tool/package.json         |    2 +-
 packages/form/package.json                         |    3 +-
 packages/form/src/FormBase.tsx                     |    2 +-
 packages/form/src/FormHook.tsx                     |    2 +-
 packages/form/src/index.ts                         |    1 -
 packages/i18n-common-dictionary/package.json       |    2 +-
 packages/i18n/package.json                         |    2 +-
 packages/i18n/src/core/immutableDeepMerge.ts       |    4 +-
 packages/image-env-to-json/package.json            |    2 +-
 .../import-java-classes-component/package.json     |    2 +-
 packages/json-yaml-language-service/package.json   |    2 +-
 packages/keyboard-shortcuts/package.json           |    2 +-
 packages/kie-bc-editors/package.json               |    2 +-
 .../it-tests/extension-editors-bpmn.test.ts        |   61 +-
 .../it-tests/extension-editors-dmn.test.ts         |   29 +-
 .../it-tests/extension-editors-scesim.test.ts      |   16 +-
 .../it-tests/extension-editors-smoke.test.ts       |   33 +-
 .../it-tests/helpers/CommonAsserts.ts              |   54 -
 .../it-tests/helpers/CommonLocators.ts             |   10 +-
 .../it-tests/helpers/PmmlEditorTestHelper.ts       |   18 +-
 .../it-tests/helpers/ScesimEditorTestHelper.ts     |   14 +-
 .../it-tests/helpers/VSCodeTestHelper.ts           |  303 --
 .../it-tests/helpers/bpmn/BpmnEditorTestHelper.ts  |   19 +-
 .../it-tests/helpers/bpmn/DiagramExplorerHelper.ts |    4 +-
 .../helpers/bpmn/ProcessVariablesWidgetHelper.ts   |    4 +-
 .../it-tests/helpers/bpmn/PropertiesPanelHelper.ts |    4 +-
 .../helpers/dmn/DecisionNavigatorHelper.ts         |    4 +-
 .../it-tests/helpers/dmn/DmnEditorTestHelper.ts    |   10 +-
 .../it-tests/helpers/dmn/ExpressionEditorHelper.ts |    4 +-
 .../kie-editors-dev-vscode-extension/package.json  |    5 +-
 packages/kie-editors-standalone/package.json       |    2 +-
 packages/kie-sandbox-fs/package.json               |    2 +-
 packages/kie-sandbox-image/Containerfile           |    2 +-
 packages/kie-sandbox-image/package.json            |    6 +-
 packages/kubernetes-bridge/package.json            |    2 +-
 packages/monaco-editor/package.json                |    2 +-
 packages/notifications/package.json                |    2 +-
 packages/online-editor/package.json                |    2 +-
 .../src/__tests__/jsonSchema/dereference.test.ts   |  180 +
 .../src/dmnRunner/DmnRunnerContextProvider.tsx     |    8 +-
 .../src/dmnRunner/DmnRunnerErrorBoundary.tsx       |   10 +-
 .../online-editor/src/dmnRunner/DmnRunnerTable.tsx |   30 +-
 .../src/editor/Toolbar/EditorToolbar.tsx           |    6 +-
 .../Toolbar/EditorToolbarContextProvider.tsx       |    8 +-
 .../src/editor/Toolbar/Share/EmbedModal.tsx        |   11 +
 packages/online-editor/src/i18n/OnlineI18n.ts      |    1 +
 packages/online-editor/src/i18n/locales/en.ts      |    1 +
 .../online-editor/src/jsonSchema/dereference.ts    |   73 +-
 packages/operating-system/package.json             |    2 +-
 packages/pmml-editor-marshaller/package.json       |    2 +-
 packages/pmml-editor/package.json                  |    2 +-
 packages/react-hooks/package.json                  |    2 +-
 packages/react-hooks/src/PromiseState.tsx          |    6 +-
 .../package.json                                   |    2 +-
 packages/serverless-logic-web-tools/package.json   |    2 +-
 .../package.json                                   |    2 +-
 .../package.json                                   |    2 +-
 .../stunner/core/graph/util/GraphUtilsTest.java    |    3 +-
 .../common/stunner/sw/definition/ForEachState.java |   30 +
 .../stunner/sw/definition/ParallelState.java       |   11 +-
 .../custom/NumCompletedJsonTypeSerializer.java     |   34 -
 .../BatchSizeJsonTypeSerializer.java}              |   23 +-
 .../NumCompletedJsonTypeSerializer.java}           |   20 +-
 ...er.java => StringNumberYamlTypeSerializer.java} |    4 +-
 .../stunner/sw/resources/i18n/SWConstants.java     |    9 +
 .../sw/resources/i18n/SWConstants.properties       |    7 +-
 .../sw/client/shapes/ForEachStateShape.java        |   20 +-
 .../stunner/sw/client/shapes/HasCollections.java   |   51 +
 .../shapes/HasConditionsAndHasDataFilter.java      |    2 +-
 .../stunner/sw/client/shapes/HasDataFilter.java    |   10 +-
 .../sw/client/shapes/HasEventAndDataFilter.java    |    4 +-
 .../stunner/sw/client/shapes/icons/IconPath.java   |    1 +
 .../sw/client/shapes/icons/IconPosition.java       |    1 +
 .../sw/client/shapes/HasCollectionsTest.java       |  138 +
 .../package.json                                   |    2 +-
 .../package.json                                   |    2 +-
 .../package.json                                   |    2 +-
 .../package.json                                   |    2 +-
 .../package.json                                   |    2 +-
 .../serverless-workflow-text-editor/package.json   |    2 +-
 .../CHANGELOG.md                                   |    4 +
 .../it-tests/helpers/CommonAsserts.ts              |   54 -
 .../it-tests/helpers/swf/SwfEditorTestHelper.ts    |   18 +-
 ...orkflow-editor-extension-autocompletion.test.ts |    6 +-
 ...kflow-editor-extension-basic-operations.test.ts |    6 +-
 ...low-editor-extension-diagram-navigation.test.ts |    4 +-
 ...ss-workflow-editor-extension-expression.test.ts |    4 +-
 ...ess-workflow-editor-extension-functions.test.ts |    4 +-
 ...verless-workflow-editor-extension-smoke.test.ts |    6 +-
 ...kflow-editor-extension-syntax-highlight.test.ts |    6 +-
 .../package.json                                   |    7 +-
 .../src/extension/extension.ts                     |    2 +-
 packages/stunner-editors-dmn-loader/package.json   |    2 +-
 packages/stunner-editors-dmn-loader/src/index.tsx  |    4 +-
 .../expressions/ExpressionEditorViewImpl.java      |    3 +
 .../jsinterop/util/ExpressionModelFiller.java      |  109 +-
 .../expressions/types/context/ContextGrid.java     |    2 +-
 .../types/dtable/DecisionTableGrid.java            |    6 +-
 .../types/invocation/InvocationGrid.java           |    2 +-
 .../editors/expressions/types/list/ListGrid.java   |    2 +-
 .../types/literal/LiteralExpressionGrid.java       |    2 +-
 .../expressions/types/relation/RelationGrid.java   |    2 +-
 .../constraint/DataTypeConstraintModal.java        |    8 +-
 .../constraint/DataTypeConstraintModalView.java    |    8 +-
 .../jsinterop/util/ExpressionModelFillerTest.java  |   14 +-
 .../DataTypeConstraintModalViewTest.java           |   15 +-
 .../stunner/core/graph/util/GraphUtilsTest.java    |    3 +-
 packages/text-editor/package.json                  |    2 +-
 packages/uniforms-bootstrap4-codegen/package.json  |    2 +-
 packages/uniforms-patternfly-codegen/package.json  |    2 +-
 packages/uniforms-patternfly/package.json          |    2 +-
 packages/uniforms-patternfly/src/cjs               |    1 -
 packages/uniforms-patternfly/src/esm               |    1 -
 packages/unitables-dmn/package.json                |    5 +-
 packages/unitables-dmn/src/DmnRunnerOutputs.tsx    |  175 +-
 .../unitables-dmn/src/DmnRunnerOutputsTable.tsx    |  241 +-
 .../unitables-dmn/src/DmnUnitablesValidator.ts     |   14 +-
 .../src/uniforms/DmnUnitablesJsonSchemaBridge.ts   |   13 +-
 packages/unitables/package.json                    |    4 +-
 packages/unitables/src/UnitablesRow.tsx            |    5 +-
 packages/unitables/src/UnitablesWrapper.tsx        |    2 +-
 packages/unitables/src/bee/UnitablesBeeTable.tsx   |   42 +-
 .../src/uniforms/UnitablesJsonSchemaBridge.tsx     |   28 +-
 .../vscode-extension-common-test-helpers/README.md |    3 +
 .../package.json                                   |   44 +
 .../src}/CommonAsserts.ts                          |    2 +-
 .../src/CommonLocators.ts                          |   56 +
 .../src/EditorTestHelper.ts                        |   36 +
 .../src/KieFileExtensions.ts                       |   84 +
 .../src}/VSCodeTestHelper.ts                       |  216 +-
 .../src/index.ts                                   |   14 +-
 .../tsconfig.json                                  |    8 +
 .../dashbuilder-editor-extension-smoke.test.ts     |    4 +-
 .../it-tests/helpers/VSCodeTestHelper.ts           |  251 -
 .../dashbuilder/DashbuilderEditorTestHelper.ts     |   23 +-
 .../package.json                                   |    5 +-
 .../vscode-extension-kogito-bundle/CHANGELOG.md    |    4 +
 .../vscode-extension-kogito-bundle/package.json    |    2 +-
 .../CHANGELOG.md                                   |    4 +
 .../README.md                                      |    2 +-
 .../it-tests/helpers/VSCodeTestHelper.ts           |  328 --
 .../it-tests/helpers/swf/SwfEditorTestHelper.ts    |   18 +-
 ...orkflow-editor-extension-autocompletion.test.ts |    6 +-
 ...kflow-editor-extension-basic-operations.test.ts |    6 +-
 ...low-editor-extension-diagram-navigation.test.ts |    4 +-
 ...ss-workflow-editor-extension-expression.test.ts |    4 +-
 ...ess-workflow-editor-extension-functions.test.ts |    4 +-
 ...verless-workflow-editor-extension-smoke.test.ts |    6 +-
 ...kflow-editor-extension-syntax-highlight.test.ts |    6 +-
 .../package.json                                   |    5 +-
 .../src/extension/setupDeprecationNotification.ts  |    2 +-
 packages/vscode-extension/package.json             |    2 +-
 .../pom.xml                                        |    7 +-
 packages/vscode-java-code-completion/package.json  |    2 +-
 .../multi-package-live-reload-loader.js            |    1 +
 packages/workspace/package.json                    |    2 +-
 packages/workspaces-git-fs/package.json            |    2 +-
 packages/yaml-language-server/package.json         |    2 +-
 packages/yard-editor/package.json                  |    2 +-
 .../it-tests/helpers/CommonAsserts.ts              |   54 -
 .../it-tests/helpers/VSCodeTestHelper.ts           |  272 -
 .../it-tests/helpers/yard/YardEditorTestHelper.ts  |   19 +-
 .../helpers/yard/YardTextEditorTestHelper.ts       |   14 +-
 .../it-tests/yard-editor.test.ts                   |   17 +-
 packages/yard-vscode-extension/package.json        |    5 +-
 pnpm-lock.yaml                                     | 5573 ++++++++++++++------
 repo/graph.dot                                     |   37 +-
 repo/graph.json                                    |   61 +-
 scripts/build-env/package.json                     |    2 +-
 256 files changed, 6275 insertions(+), 4505 deletions(-)



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 16/27: KOGITO-8890: Refactor workspace files listing according to UX redesign (#1606)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit 1ec224401674968dfc4495866695614b8554eafb
Author: Fabrizio Antonangeli <fa...@gmail.com>
AuthorDate: Fri May 5 13:14:34 2023 +0200

    KOGITO-8890: Refactor workspace files listing according to UX redesign (#1606)
    
    Co-authored-by: Guilherme Caponetto <63...@users.noreply.github.com>
---
 .../serverless-logic-web-tools/src/AppConstants.ts |   2 +
 .../src/editor/EditorToolbar.tsx                   |   4 +-
 .../src/homepage/overView/Overview.tsx             |   3 +-
 .../src/homepage/pageTemplate/OnlineEditorPage.tsx |  27 +-
 .../homepage/recentModels/ConfirmDeleteModal.tsx   | 154 -----------
 .../src/homepage/recentModels/RecentModels.tsx     | 151 ++++++----
 .../src/homepage/recentModels/WorkspacesTable.tsx  |   7 +-
 .../homepage/recentModels/WorkspacesTableRow.tsx   |  17 +-
 .../recentModels/workspaceFiles/WorkspaceFiles.tsx | 304 +++++++++++++++++++++
 .../workspaceFiles/WorkspaceFilesTable.tsx         | 159 +++++++++++
 .../workspaceFiles/WorkspaceFilesTableRow.tsx      | 100 +++++++
 .../src/homepage/routes/HomePageRoutes.tsx         |   4 +
 .../src/homepage/uiNav/HomePageNav.tsx             |  19 +-
 .../src/navigation/Routes.ts                       |   4 +
 .../src/table/ConfirmDeleteModal.tsx               |  96 +++++++
 .../src/table/TablePagination.tsx                  |  12 +-
 .../src/table/TableToolbar.tsx                     |   3 +
 .../static/resources/style.css                     |   5 +
 18 files changed, 825 insertions(+), 246 deletions(-)

diff --git a/packages/serverless-logic-web-tools/src/AppConstants.ts b/packages/serverless-logic-web-tools/src/AppConstants.ts
index 4c8316aa70..8124e259f5 100644
--- a/packages/serverless-logic-web-tools/src/AppConstants.ts
+++ b/packages/serverless-logic-web-tools/src/AppConstants.ts
@@ -15,3 +15,5 @@
  */
 
 export const APP_NAME = "Serverless Logic Web Tools";
+export const SERVERLESS_LOGIC_WEBTOOLS_DOCUMENTATION_URL =
+  "https://kiegroup.github.io/kogito-docs/serverlessworkflow/latest/tooling/serverless-logic-web-tools/serverless-logic-web-tools-overview.html";
diff --git a/packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx b/packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx
index 27d5cdebb4..50a4dc4635 100644
--- a/packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx
@@ -1313,7 +1313,7 @@ If you are, it means that creating this Gist failed and it can safely be deleted
                   <Button
                     className={"kie-tools--masthead-hoverable"}
                     variant={ButtonVariant.plain}
-                    onClick={() => history.push({ pathname: routes.recentModels.path({}) })}
+                    onClick={() => history.push({ pathname: routes.workspaceWithFiles.path(props.workspaceFile) })}
                   >
                     <AngleLeftIcon />
                   </Button>
@@ -1512,7 +1512,7 @@ If you are, it means that creating this Gist failed and it can safely be deleted
                         toggle={
                           <DropdownToggle
                             onToggle={setNewFileDropdownMenuOpen}
-                            isPrimary={true}
+                            toggleVariant="primary"
                             toggleIndicator={CaretDownIcon}
                           >
                             <PlusIcon />
diff --git a/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx
index b49ecb1f3a..ac72570919 100644
--- a/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx
@@ -36,6 +36,7 @@ import { CardHeader, CardHeaderMain, CardTitle } from "@patternfly/react-core/di
 import { List, ListItem } from "@patternfly/react-core/dist/js/components/List";
 import { QuickStartContext, QuickStartContextValues } from "@patternfly/quickstarts";
 import { ExternalLinkAltIcon } from "@patternfly/react-icons/dist/js/icons";
+import { SERVERLESS_LOGIC_WEBTOOLS_DOCUMENTATION_URL } from "../../AppConstants";
 
 export function Overview(props: { isNavOpen: boolean }) {
   const routes = useRoutes();
@@ -106,7 +107,7 @@ export function Overview(props: { isNavOpen: boolean }) {
               target="_blank"
               iconPosition="right"
               icon={<ExternalLinkAltIcon />}
-              href="https://kiegroup.github.io/kogito-docs/serverlessworkflow/latest/index.html"
+              href={SERVERLESS_LOGIC_WEBTOOLS_DOCUMENTATION_URL}
               variant={ButtonVariant.secondary}
               component="a"
             >
diff --git a/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx b/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
index 7d481676b1..e37a20feb0 100644
--- a/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
@@ -17,7 +17,6 @@
 import * as React from "react";
 import { QuickStartContainer, QuickStartContainerProps } from "@patternfly/quickstarts";
 import { Brand } from "@patternfly/react-core/dist/js/components/Brand";
-import { Button } from "@patternfly/react-core/dist/js/components/Button";
 import {
   Masthead,
   MastheadBrand,
@@ -28,7 +27,7 @@ import {
 import { PageSidebar } from "@patternfly/react-core/dist/js/components/Page/PageSidebar";
 import { SkipToContent } from "@patternfly/react-core/dist/js/components/SkipToContent";
 import { Toolbar, ToolbarContent, ToolbarGroup, ToolbarItem } from "@patternfly/react-core/dist/js/components/Toolbar";
-import { Page } from "@patternfly/react-core/dist/js/components/Page";
+import { Page, PageToggleButton } from "@patternfly/react-core/dist/js/components/Page";
 import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
 import { BarsIcon, ExclamationIcon } from "@patternfly/react-icons/dist/js/icons";
 import { useMemo, useState } from "react";
@@ -45,6 +44,7 @@ import {
 } from "../../quickstarts-data";
 import { SettingsButton } from "../../settings/SettingsButton";
 import { HomePageNav } from "../uiNav/HomePageNav";
+import { APP_NAME } from "../../AppConstants";
 
 export type OnlineEditorPageProps = {
   children?: React.ReactNode;
@@ -57,9 +57,6 @@ export function OnlineEditorPage(props: OnlineEditorPageProps) {
   const history = useHistory();
   const routes = useRoutes();
   const isRouteInSettingsSection = useRouteMatch(routes.settings.home.path({}));
-  const navToggle = () => {
-    props.setIsNavOpen(!props.isNavOpen);
-  };
   const [activeQuickStartID, setActiveQuickStartID] = useState("");
   const [allQuickStartStates, setAllQuickStartStates] = useState({});
 
@@ -120,27 +117,17 @@ export function OnlineEditorPage(props: OnlineEditorPageProps) {
   const masthead = (
     <Masthead>
       <MastheadToggle>
-        <Button
-          id="nav-toggle"
-          variant="plain"
-          aria-label="Global NAV"
-          onClick={navToggle}
-          aria-expanded={props.isNavOpen}
-          aria-controls=""
-        >
+        <PageToggleButton variant="plain" aria-label="Global NAV">
           <BarsIcon />
-        </Button>
+        </PageToggleButton>
       </MastheadToggle>
       <MastheadMain>
         <MastheadBrand
           onClick={() => history.push({ pathname: routes.home.path({}) })}
           style={{ textDecoration: "none" }}
         >
-          <Brand
-            className="kogito-tools-common--brand"
-            src="images/kogito_log_workbranch.svg"
-            alt="kogito_logo_white.png"
-          ></Brand>
+          <Brand className="kogito-tools-common--brand" src="favicon.svg" alt="Kie logo"></Brand>
+          <div className="brand-name">{APP_NAME}</div>
         </MastheadBrand>
       </MastheadMain>
       <MastheadContent>{headerToolbar}</MastheadContent>
@@ -158,7 +145,7 @@ export function OnlineEditorPage(props: OnlineEditorPageProps) {
     [location, isRouteInSettingsSection]
   );
 
-  const sidebar = <PageSidebar nav={pageNav} isNavOpen={props.isNavOpen} theme="dark" />;
+  const sidebar = <PageSidebar nav={pageNav} theme="dark" />;
   const mainContainerId = "main-content-page-layout-tertiary-nav";
 
   const pageSkipToContent = <SkipToContent href={`#${mainContainerId}`}>Skip to content</SkipToContent>;
diff --git a/packages/serverless-logic-web-tools/src/homepage/recentModels/ConfirmDeleteModal.tsx b/packages/serverless-logic-web-tools/src/homepage/recentModels/ConfirmDeleteModal.tsx
deleted file mode 100644
index 4d260c06af..0000000000
--- a/packages/serverless-logic-web-tools/src/homepage/recentModels/ConfirmDeleteModal.tsx
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright 2023 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-import * as React from "react";
-import { WorkspaceDescriptor } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceDescriptor";
-import { Button, Checkbox, Modal, ModalProps, Skeleton } from "@patternfly/react-core/dist/js";
-import { useCallback, useEffect, useMemo, useState } from "react";
-import { useWorkspaces } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
-import { splitFiles } from "../../extension";
-
-export function ConfirmDeleteModal(
-  props: {
-    onDelete: () => void;
-    selectedWorkspaceIds: WorkspaceDescriptor["workspaceId"][];
-  } & Pick<ModalProps, "isOpen" | "onClose">
-) {
-  const { selectedWorkspaceIds, isOpen, onClose, onDelete } = props;
-  const [isDeleteCheck, setIsDeleteCheck] = useState(false);
-  const [firstSelectedWorkspaceName, setFirstSelectedWorkspaceName] = useState("");
-  const [selectedFoldersCount, setSelectedFoldersCount] = useState(0);
-  const [elementsTypeName, setElementsTypeName] = useState("models");
-  const [dataLoaded, setDataLoaded] = useState(false);
-  const [fetchError, setFetchError] = useState(false);
-  const workspaces = useWorkspaces();
-
-  const isPlural = useMemo(() => selectedWorkspaceIds.length > 1, [selectedWorkspaceIds]);
-
-  const isWsFolder = useCallback(
-    async (workspaceId: WorkspaceDescriptor["workspaceId"]) => {
-      const { editableFiles, readonlyFiles } = splitFiles(await workspaces.getFiles({ workspaceId }));
-      return editableFiles.length > 1 || readonlyFiles.length > 0;
-    },
-    [workspaces]
-  );
-
-  const getWorkspaceName = useCallback(
-    async (workspaceId: WorkspaceDescriptor["workspaceId"]) => {
-      if (selectedWorkspaceIds.length !== 1) {
-        return "";
-      }
-      const workspaceData = await workspaces.getWorkspace({ workspaceId });
-      return (await isWsFolder(workspaceId))
-        ? workspaceData.name
-        : (await workspaces.getFiles({ workspaceId }))[0].nameWithoutExtension;
-    },
-    [isWsFolder, selectedWorkspaceIds, workspaces]
-  );
-
-  const onDeleteCheckChange = useCallback((checked: boolean) => {
-    setIsDeleteCheck(checked);
-  }, []);
-
-  useEffect(() => {
-    if (!isOpen) {
-      return;
-    }
-
-    const allPromises: Promise<void>[] = [];
-
-    setIsDeleteCheck(false);
-    setDataLoaded(false);
-    setFetchError(false);
-
-    if (selectedWorkspaceIds.length === 1) {
-      allPromises.push(getWorkspaceName(selectedWorkspaceIds[0]).then(setFirstSelectedWorkspaceName));
-    }
-
-    allPromises.push(
-      Promise.all(selectedWorkspaceIds.map(isWsFolder)).then((results) => {
-        const foldersCount = results.filter((r) => r).length;
-        setSelectedFoldersCount(foldersCount);
-        if (isPlural) {
-          setElementsTypeName(foldersCount ? "workspaces" : "models");
-        } else {
-          setElementsTypeName(foldersCount ? "workspace" : "model");
-        }
-      })
-    );
-
-    Promise.all(allPromises)
-      .then(() => setDataLoaded(true))
-      .catch((error) => {
-        console.error("Error retrieving workspace data:", error);
-        setFetchError(true);
-      });
-  }, [selectedWorkspaceIds, isWsFolder, isOpen, getWorkspaceName, isPlural]);
-
-  return (
-    <>
-      <Modal
-        title={`Delete ${elementsTypeName}`}
-        titleIconVariant={"warning"}
-        isOpen={isOpen && !fetchError}
-        onClose={onClose}
-        aria-describedby="modal-custom-icon-description"
-        actions={[
-          dataLoaded ? (
-            <Button key="confirm" variant="danger" onClick={onDelete} isDisabled={!isDeleteCheck} aria-label="Delete">
-              Delete {elementsTypeName}
-            </Button>
-          ) : (
-            <Skeleton width="100px" key="confirm-skeleton" />
-          ),
-          <Button key="cancel" variant="link" onClick={onClose} aria-label="Cancel">
-            Cancel
-          </Button>,
-        ]}
-        variant="small"
-      >
-        {dataLoaded ? (
-          <span id="modal-custom-icon-description">
-            Deleting {isPlural ? "these" : "this"}{" "}
-            <b>{isPlural ? selectedWorkspaceIds.length : firstSelectedWorkspaceName}</b> {elementsTypeName}
-            {selectedFoldersCount ? ` removes the ${elementsTypeName} and all the models inside.` : "."}
-          </span>
-        ) : (
-          <Skeleton width="80%" />
-        )}
-        <br />
-        <br />
-        <Checkbox
-          label="I understand that this action cannot be undone."
-          id="delete-model-check"
-          isChecked={isDeleteCheck}
-          onChange={onDeleteCheckChange}
-          aria-label="Confirm checkbox delete model"
-        />
-      </Modal>
-
-      <Modal
-        title={`Error retrieving data`}
-        titleIconVariant={"danger"}
-        isOpen={isOpen && fetchError}
-        onClose={onClose}
-        aria-describedby="modal-custom-icon-description"
-        variant="small"
-      >
-        <span id="modal-custom-icon-description">An error occurred while loading the data!</span>
-      </Modal>
-    </>
-  );
-}
diff --git a/packages/serverless-logic-web-tools/src/homepage/recentModels/RecentModels.tsx b/packages/serverless-logic-web-tools/src/homepage/recentModels/RecentModels.tsx
index 964fce3616..c184cce16c 100644
--- a/packages/serverless-logic-web-tools/src/homepage/recentModels/RecentModels.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/recentModels/RecentModels.tsx
@@ -15,12 +15,11 @@
  */
 
 import { PromiseStateWrapper } from "@kie-tools-core/react-hooks/dist/PromiseState";
+import { useController } from "@kie-tools-core/react-hooks/dist/useController";
 import { useWorkspaces } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
 import { useWorkspaceDescriptorsPromise } from "@kie-tools-core/workspaces-git-fs/dist/hooks/WorkspacesHooks";
 import { WorkspaceDescriptor } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceDescriptor";
-import { PerPageOptions } from "@patternfly/react-core/dist/js/components/Pagination";
-import { Alert, AlertActionCloseButton, AlertProps } from "@patternfly/react-core/dist/js/components/Alert";
-import { AlertGroup } from "@patternfly/react-core/dist/js/components/AlertGroup";
+import { Alert, AlertActionCloseButton } from "@patternfly/react-core/dist/js/components/Alert";
 import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
 import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
 import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
@@ -28,39 +27,76 @@ import { Title } from "@patternfly/react-core/dist/js/components/Title";
 import { Bullseye } from "@patternfly/react-core/dist/js/layouts/Bullseye";
 import { CubesIcon } from "@patternfly/react-icons/dist/js/icons/cubes-icon";
 import * as React from "react";
-import { useCallback, useState } from "react";
-import { ConfirmDeleteModal } from "./ConfirmDeleteModal";
+import { useCallback, useEffect, useMemo, useState } from "react";
+import { Alerts, AlertsController, useAlert } from "../../alerts/Alerts";
+import { splitFiles } from "../../extension";
+import { ConfirmDeleteModal } from "../../table/ConfirmDeleteModal";
+import { defaultPerPageOptions, TablePagination } from "../../table/TablePagination";
 import { TableToolbar } from "../../table/TableToolbar";
 import { WorkspacesTable } from "./WorkspacesTable";
-import { TablePagination } from "../../table/TablePagination";
-
-const perPageOptions: PerPageOptions[] = [5, 10, 20, 50, 100].map((n) => ({
-  title: n.toString(),
-  value: n,
-}));
 
 export function RecentModels() {
   const workspaceDescriptorsPromise = useWorkspaceDescriptorsPromise();
   const [selectedWorkspaceIds, setSelectedWorkspaceIds] = useState<WorkspaceDescriptor["workspaceId"][]>([]);
   const [isConfirmDeleteModalOpen, setIsConfirmDeleteModalOpen] = useState(false);
-  const [alerts, setAlerts] = useState<Partial<AlertProps>[]>([]);
   const [searchValue, setSearchValue] = React.useState("");
   const [page, setPage] = React.useState(1);
   const [perPage, setPerPage] = React.useState(5);
   const workspaces = useWorkspaces();
+  const [selectedFoldersCount, setSelectedFoldersCount] = useState(0);
+  const [firstSelectedWorkspaceName, setFirstSelectedWorkspaceName] = useState("");
+  const [deleteModalDataLoaded, setDeleteModalDataLoaded] = useState(false);
+  const [deleteModalFetchError, setDeleteModalFetchError] = useState(false);
+  const [alerts, alertsRef] = useController<AlertsController>();
+  const isSelectedWorkspacePlural = useMemo(() => selectedWorkspaceIds.length > 1, [selectedWorkspaceIds]);
+
+  const selectedElementTypesName = useMemo(() => {
+    if (selectedWorkspaceIds.length > 1) {
+      return selectedFoldersCount ? "workspaces" : "models";
+    }
+    return selectedFoldersCount ? "workspace" : "model";
+  }, [selectedFoldersCount, selectedWorkspaceIds]);
+
+  const deleteModalMessage = useMemo(
+    () => (
+      <>
+        Deleting {isSelectedWorkspacePlural ? "these" : "this"}{" "}
+        <b>{isSelectedWorkspacePlural ? selectedWorkspaceIds.length : firstSelectedWorkspaceName}</b>{" "}
+        {selectedElementTypesName}
+        {selectedFoldersCount ? ` removes the ${selectedElementTypesName} and all the models inside.` : "."}
+      </>
+    ),
+    [
+      isSelectedWorkspacePlural,
+      selectedWorkspaceIds,
+      firstSelectedWorkspaceName,
+      selectedElementTypesName,
+      selectedFoldersCount,
+    ]
+  );
 
   const onConfirmDeleteModalClose = useCallback(() => setIsConfirmDeleteModalOpen(false), []);
 
-  const addAlert = useCallback(
-    (title: string, variant: AlertProps["variant"], key: React.Key = new Date().getTime()) => {
-      setAlerts((prevAlerts) => [...prevAlerts, { title, variant, key }]);
-    },
-    []
+  const deleteSuccessAlert = useAlert<{ modelsWord: string }>(
+    alerts,
+    useCallback(({ close }, { modelsWord }) => {
+      return <Alert variant="success" title={`${capitalizeString(modelsWord)} deleted successfully`} />;
+    }, []),
+    { durationInSeconds: 2 }
   );
 
-  const removeAlert = useCallback((key: React.Key) => {
-    setAlerts((prevAlerts) => [...prevAlerts.filter((alert) => alert.key !== key)]);
-  }, []);
+  const deleteErrorAlert = useAlert<{ modelsWord: string }>(
+    alerts,
+    useCallback(({ close }, { modelsWord }) => {
+      return (
+        <Alert
+          variant="danger"
+          title={`Oops, something went wrong while trying to delete the selected ${modelsWord}. Please refresh the page and try again. If the problem persists, you can try deleting site data for this application in your browser's settings.`}
+          actionClose={<AlertActionCloseButton onClose={close} />}
+        />
+      );
+    }, [])
+  );
 
   const onConfirmDeleteModalDelete = useCallback(
     async (workspaceDescriptors: WorkspaceDescriptor[]) => {
@@ -73,20 +109,17 @@ export function RecentModels() {
           .map((w) => workspaces.deleteWorkspace(w))
       )
         .then(() => {
-          addAlert(`${modelsWord} deleted successfully`, "success");
+          deleteSuccessAlert.show({ modelsWord });
         })
         .catch((e) => {
           console.error(e);
-          addAlert(
-            `Oops, something went wrong while trying to delete the selected ${modelsWord}. Please refresh the page and try again. If the problem persists, you can try deleting site data for this application in your browser's settings.`,
-            "danger"
-          );
+          deleteErrorAlert.show({ modelsWord });
         })
         .finally(() => {
           setSelectedWorkspaceIds([]);
         });
     },
-    [selectedWorkspaceIds, addAlert, workspaces]
+    [selectedWorkspaceIds, workspaces, deleteErrorAlert, deleteSuccessAlert]
   );
 
   const onWsToggle = useCallback((workspaceId: WorkspaceDescriptor["workspaceId"], checked: boolean) => {
@@ -104,6 +137,39 @@ export function RecentModels() {
     setSearchValue("");
   }, []);
 
+  const isWsFolder = useCallback(
+    async (workspaceId: WorkspaceDescriptor["workspaceId"]) => {
+      const { editableFiles, readonlyFiles } = splitFiles(await workspaces.getFiles({ workspaceId }));
+      return editableFiles.length > 1 || readonlyFiles.length > 0;
+    },
+    [workspaces]
+  );
+
+  const getWorkspaceName = useCallback(
+    async (workspaceId: WorkspaceDescriptor["workspaceId"]) => {
+      if (selectedWorkspaceIds.length !== 1) {
+        return "";
+      }
+      const workspaceData = await workspaces.getWorkspace({ workspaceId });
+      return (await isWsFolder(workspaceId))
+        ? workspaceData.name
+        : (await workspaces.getFiles({ workspaceId }))[0].nameWithoutExtension;
+    },
+    [isWsFolder, selectedWorkspaceIds, workspaces]
+  );
+
+  useEffect(() => {
+    Promise.all([
+      Promise.all(selectedWorkspaceIds.map(isWsFolder)).then((results) => {
+        const foldersCount = results.filter((r) => r).length;
+        setSelectedFoldersCount(foldersCount);
+      }),
+      getWorkspaceName(selectedWorkspaceIds[0]).then(setFirstSelectedWorkspaceName),
+    ])
+      .then(() => setDeleteModalDataLoaded(true))
+      .catch(() => setDeleteModalFetchError(true));
+  }, [getWorkspaceName, selectedWorkspaceIds, isWsFolder]);
+
   return (
     <PromiseStateWrapper
       promise={workspaceDescriptorsPromise}
@@ -113,27 +179,7 @@ export function RecentModels() {
 
         return (
           <>
-            <AlertGroup isToast isLiveRegion>
-              {alerts.map(
-                ({ key, variant, title }) =>
-                  key && (
-                    <Alert
-                      variant={variant}
-                      title={title}
-                      timeout
-                      onTimeout={() => removeAlert(key)}
-                      actionClose={
-                        <AlertActionCloseButton
-                          title={title as string}
-                          variantLabel={`${variant} alert`}
-                          onClose={() => removeAlert(key)}
-                        />
-                      }
-                      key={key}
-                    />
-                  )
-              )}
-            </AlertGroup>
+            <Alerts ref={alertsRef} width={"500px"} />
             <Page>
               <PageSection variant={"light"}>
                 <TextContent>
@@ -157,7 +203,7 @@ export function RecentModels() {
                         setSearchValue={setSearchValue}
                         page={page}
                         perPage={perPage}
-                        perPageOptions={perPageOptions}
+                        perPageOptions={defaultPerPageOptions}
                         setPage={setPage}
                         setPerPage={setPerPage}
                       />
@@ -174,7 +220,7 @@ export function RecentModels() {
                         itemCount={itemCount}
                         page={page}
                         perPage={perPage}
-                        perPageOptions={perPageOptions}
+                        perPageOptions={defaultPerPageOptions}
                         setPage={setPage}
                         setPerPage={setPerPage}
                         variant="bottom"
@@ -196,10 +242,13 @@ export function RecentModels() {
               </PageSection>
             </Page>
             <ConfirmDeleteModal
-              selectedWorkspaceIds={selectedWorkspaceIds}
               isOpen={isConfirmDeleteModalOpen}
               onClose={onConfirmDeleteModalClose}
               onDelete={() => onConfirmDeleteModalDelete(workspaceDescriptors)}
+              elementsTypeName={selectedElementTypesName}
+              deleteMessage={deleteModalMessage}
+              dataLoaded={deleteModalDataLoaded}
+              fetchError={deleteModalFetchError}
             />
           </>
         );
@@ -207,3 +256,5 @@ export function RecentModels() {
     />
   );
 }
+
+const capitalizeString = (value: string) => value.charAt(0).toUpperCase() + value.slice(1);
diff --git a/packages/serverless-logic-web-tools/src/homepage/recentModels/WorkspacesTable.tsx b/packages/serverless-logic-web-tools/src/homepage/recentModels/WorkspacesTable.tsx
index 9ae35c5f1a..11fde904d4 100644
--- a/packages/serverless-logic-web-tools/src/homepage/recentModels/WorkspacesTable.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/recentModels/WorkspacesTable.tsx
@@ -90,11 +90,12 @@ export function WorkspacesTable(props: WorkspacesTableProps) {
       allWorkspacePromises.status !== PromiseStateStatus.RESOLVED
         ? []
         : workspaceDescriptors.map((workspace, index) => {
-            const { editableFiles, readonlyFiles } = splitFiles(allWorkspacePromises.data[index] ?? []);
+            const allFiles = allWorkspacePromises.data[index];
+            const { editableFiles, readonlyFiles } = splitFiles(allFiles ?? []);
             const isWsFolder =
               editableFiles.length > 1 || readonlyFiles.length > 0 || workspace.origin.kind !== WorkspaceKind.LOCAL;
-            const hasErrors = !editableFiles || !editableFiles[0];
-            const name = getWorkspaceName(workspace, isWsFolder, hasErrors, editableFiles);
+            const hasErrors = !allFiles[0];
+            const name = getWorkspaceName(workspace, isWsFolder, hasErrors, allFiles);
 
             return {
               createdDateISO: workspace.createdDateISO,
diff --git a/packages/serverless-logic-web-tools/src/homepage/recentModels/WorkspacesTableRow.tsx b/packages/serverless-logic-web-tools/src/homepage/recentModels/WorkspacesTableRow.tsx
index 68eb97634b..84a47ae038 100644
--- a/packages/serverless-logic-web-tools/src/homepage/recentModels/WorkspacesTableRow.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/recentModels/WorkspacesTableRow.tsx
@@ -22,7 +22,6 @@ import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-co
 import { Popover } from "@patternfly/react-core/dist/js/components/Popover";
 import { Title } from "@patternfly/react-core/dist/js/components/Title";
 import { Skeleton } from "@patternfly/react-core/dist/js/components/Skeleton";
-import "@patternfly/react-core/dist/styles/base.css";
 import { ExclamationTriangleIcon, OutlinedQuestionCircleIcon, SearchIcon } from "@patternfly/react-icons/dist/js/icons";
 import { FolderIcon } from "@patternfly/react-icons/dist/js/icons/folder-icon";
 import { TaskIcon } from "@patternfly/react-icons/dist/js/icons/task-icon";
@@ -56,12 +55,14 @@ export function WorkspacesTableRow(props: WorkspacesTableRowProps) {
 
   const linkTo = useMemo(
     () =>
-      routes.workspaceWithFilePath.path({
-        workspaceId: editableFiles[0].workspaceId,
-        fileRelativePath: editableFiles[0].relativePathWithoutExtension,
-        extension: editableFiles[0].extension,
-      }),
-    [editableFiles]
+      !isWsFolder
+        ? routes.workspaceWithFilePath.path({
+            workspaceId,
+            fileRelativePath: editableFiles[0].relativePathWithoutExtension,
+            extension: editableFiles[0].extension,
+          })
+        : routes.workspaceWithFiles.path({ workspaceId }),
+    [editableFiles, isWsFolder, workspaceId]
   );
 
   return (
@@ -77,7 +78,7 @@ export function WorkspacesTableRow(props: WorkspacesTableRowProps) {
         {isWsFolder ? (
           <>
             <FolderIcon />
-            &nbsp;&nbsp;&nbsp;{name}
+            &nbsp;&nbsp;&nbsp;<Link to={linkTo}>{name}</Link>
           </>
         ) : (
           <>
diff --git a/packages/serverless-logic-web-tools/src/homepage/recentModels/workspaceFiles/WorkspaceFiles.tsx b/packages/serverless-logic-web-tools/src/homepage/recentModels/workspaceFiles/WorkspaceFiles.tsx
new file mode 100644
index 0000000000..e97d8b00be
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/homepage/recentModels/workspaceFiles/WorkspaceFiles.tsx
@@ -0,0 +1,304 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { PromiseStateWrapper } from "@kie-tools-core/react-hooks/dist/PromiseState";
+import { useController } from "@kie-tools-core/react-hooks/dist/useController";
+import { useWorkspaces, WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+import { useWorkspacePromise } from "@kie-tools-core/workspaces-git-fs/dist/hooks/WorkspaceHooks";
+import { ActiveWorkspace } from "@kie-tools-core/workspaces-git-fs/dist/model/ActiveWorkspace";
+import { Breadcrumb } from "@patternfly/react-core/components/Breadcrumb";
+import { BreadcrumbItem, Checkbox, Dropdown, DropdownToggle, ToolbarItem } from "@patternfly/react-core/dist/js";
+import { Alert, AlertActionCloseButton } from "@patternfly/react-core/dist/js/components/Alert";
+import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
+import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
+import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
+import { Title } from "@patternfly/react-core/dist/js/components/Title";
+import { Bullseye } from "@patternfly/react-core/dist/js/layouts/Bullseye";
+import { CaretDownIcon, PlusIcon } from "@patternfly/react-icons/dist/js/icons";
+import { CubesIcon } from "@patternfly/react-icons/dist/js/icons/cubes-icon";
+import * as React from "react";
+import { useCallback, useEffect, useMemo, useState } from "react";
+import { useHistory } from "react-router";
+import { Alerts, AlertsController, useAlert } from "../../../alerts/Alerts";
+import { NewFileDropdownMenu } from "../../../editor/NewFileDropdownMenu";
+import { splitFiles } from "../../../extension";
+import { routes } from "../../../navigation/Routes";
+import { ConfirmDeleteModal } from "../../../table/ConfirmDeleteModal";
+import { defaultPerPageOptions, TablePagination } from "../../../table/TablePagination";
+import { TableToolbar } from "../../../table/TableToolbar";
+import { WorkspaceFilesTable } from "./WorkspaceFilesTable";
+
+export interface Props {
+  workspaceId: string;
+}
+
+export function WorkspaceFiles(props: Props) {
+  const { workspaceId } = props;
+  const workspacePromise = useWorkspacePromise(workspaceId);
+  const [selectedWorkspaceFiles, setSelectedWorkspaceFiles] = useState<WorkspaceFile[]>([]);
+  const [isConfirmDeleteModalOpen, setIsConfirmDeleteModalOpen] = useState(false);
+  const [searchValue, setSearchValue] = React.useState("");
+  const [page, setPage] = React.useState(1);
+  const [perPage, setPerPage] = React.useState(5);
+  const [isViewRoFilesChecked, setIsViewRoFilesChecked] = useState(false);
+  const [isNewFileDropdownMenuOpen, setNewFileDropdownMenuOpen] = useState(false);
+  const workspaces = useWorkspaces();
+  const history = useHistory();
+  const [alerts, alertsRef] = useController<AlertsController>();
+  const isSelectedWorkspaceFilesPlural = useMemo(() => selectedWorkspaceFiles.length > 1, [selectedWorkspaceFiles]);
+  const selectedElementTypesName = useMemo(
+    () => (isSelectedWorkspaceFilesPlural ? "files" : "file"),
+    [isSelectedWorkspaceFilesPlural]
+  );
+
+  const deleteModalMessage = useMemo(
+    () => (
+      <>
+        Deleting {isSelectedWorkspaceFilesPlural ? "these" : "this"}{" "}
+        <b>{isSelectedWorkspaceFilesPlural ? selectedWorkspaceFiles.length : selectedWorkspaceFiles[0]?.name}</b>{" "}
+        {selectedElementTypesName}
+      </>
+    ),
+    [isSelectedWorkspaceFilesPlural, selectedWorkspaceFiles, selectedElementTypesName]
+  );
+
+  const onConfirmDeleteModalClose = useCallback(() => setIsConfirmDeleteModalOpen(false), []);
+
+  const deleteSuccessAlert = useAlert<{ selectedElementTypesName: string }>(
+    alerts,
+    useCallback(({ close }, { selectedElementTypesName }) => {
+      return <Alert variant="success" title={`${capitalizeString(selectedElementTypesName)} deleted successfully`} />;
+    }, []),
+    { durationInSeconds: 2 }
+  );
+
+  const deleteErrorAlert = useAlert<{ selectedElementTypesName: string }>(
+    alerts,
+    useCallback(({ close }, { selectedElementTypesName }) => {
+      return (
+        <Alert
+          variant="danger"
+          title={`Oops, something went wrong while trying to delete the selected ${selectedElementTypesName}. Please refresh the page and try again. If the problem persists, you can try deleting site data for this application in your browser's settings.`}
+          actionClose={<AlertActionCloseButton onClose={close} />}
+        />
+      );
+    }, [])
+  );
+
+  const onConfirmDeleteModalDelete = useCallback(
+    async (totalFilesCount: number) => {
+      setIsConfirmDeleteModalOpen(false);
+
+      if (selectedWorkspaceFiles.length === totalFilesCount) {
+        workspaces.deleteWorkspace({ workspaceId });
+        history.push({ pathname: routes.recentModels.path({}) });
+        deleteSuccessAlert.show({ selectedElementTypesName });
+        return;
+      }
+
+      Promise.all(selectedWorkspaceFiles.map((file) => workspaces.deleteFile({ file })))
+        .then(() => {
+          deleteSuccessAlert.show({ selectedElementTypesName });
+        })
+        .catch((e) => {
+          console.error(e);
+          deleteErrorAlert.show({ selectedElementTypesName });
+        })
+        .finally(() => {
+          setSelectedWorkspaceFiles([]);
+        });
+    },
+    [
+      selectedWorkspaceFiles,
+      workspaces,
+      history,
+      workspaceId,
+      deleteErrorAlert,
+      deleteSuccessAlert,
+      selectedElementTypesName,
+    ]
+  );
+
+  const onFileToggle = useCallback((workspaceFile: WorkspaceFile, checked: boolean) => {
+    setSelectedWorkspaceFiles((prevSelected) => {
+      const otherSelectedFiles = [...prevSelected.filter((f) => f !== workspaceFile)];
+      return checked ? [...otherSelectedFiles, workspaceFile] : otherSelectedFiles;
+    });
+  }, []);
+
+  const onToggleAllElements = useCallback((checked: boolean, files: WorkspaceFile[]) => {
+    setSelectedWorkspaceFiles(checked ? files : []);
+  }, []);
+
+  const handleViewRoCheckboxChange = useCallback((checked: boolean) => {
+    setIsViewRoFilesChecked(checked);
+  }, []);
+
+  useEffect(() => {
+    setSelectedWorkspaceFiles([]);
+  }, [workspacePromise]);
+
+  return (
+    <PromiseStateWrapper
+      promise={workspacePromise}
+      rejected={(e) => <>Error fetching workspaces: {e + ""}</>}
+      resolved={(workspace: ActiveWorkspace) => {
+        const allFiles = splitFiles(workspace.files);
+        const isViewRoFilesDisabled = !allFiles.editableFiles.length || !allFiles.readonlyFiles.length;
+        const isViewRoFilesCheckedInternal = isViewRoFilesDisabled ? true : isViewRoFilesChecked;
+        const files = [...allFiles.editableFiles, ...(isViewRoFilesCheckedInternal ? allFiles.readonlyFiles : [])];
+        const filesCount = files.length;
+        const allFilesCount = workspace.files.length;
+
+        return (
+          <>
+            <Alerts ref={alertsRef} width={"500px"} />
+            <Page
+              breadcrumb={
+                <Breadcrumb>
+                  <BreadcrumbItem to={"#" + routes.recentModels.path({})}>Recent Models</BreadcrumbItem>
+                  <BreadcrumbItem to="#" isActive>
+                    {workspace.descriptor.name}
+                  </BreadcrumbItem>
+                </Breadcrumb>
+              }
+            >
+              <PageSection variant={"light"}>
+                <TextContent>
+                  <Text component={TextVariants.h1}>Files in &lsquo;{workspace.descriptor.name}&rsquo;</Text>
+                  <Text component={TextVariants.p}>
+                    Use your recent models from GitHub Repository, a GitHub Gist or saved in your browser.
+                  </Text>
+                </TextContent>
+              </PageSection>
+
+              <PageSection isFilled aria-label="workspaces-table-section">
+                <PageSection variant={"light"} padding={{ default: "noPadding" }}>
+                  {filesCount > 0 && (
+                    <>
+                      <TableToolbar
+                        itemCount={filesCount}
+                        onDeleteActionButtonClick={() => setIsConfirmDeleteModalOpen(true)}
+                        onToggleAllElements={(checked) => onToggleAllElements(checked, files)}
+                        searchValue={searchValue}
+                        selectedElementsCount={selectedWorkspaceFiles.length}
+                        setSearchValue={setSearchValue}
+                        page={page}
+                        perPage={perPage}
+                        perPageOptions={defaultPerPageOptions}
+                        setPage={setPage}
+                        setPerPage={setPerPage}
+                        additionalComponents={
+                          <>
+                            <ToolbarItem>
+                              <Dropdown
+                                position={"right"}
+                                isOpen={isNewFileDropdownMenuOpen}
+                                toggle={
+                                  <DropdownToggle
+                                    onToggle={setNewFileDropdownMenuOpen}
+                                    toggleIndicator={CaretDownIcon}
+                                    toggleVariant="primary"
+                                  >
+                                    <PlusIcon />
+                                    &nbsp;&nbsp;New file
+                                  </DropdownToggle>
+                                }
+                              >
+                                <NewFileDropdownMenu
+                                  alerts={alerts}
+                                  workspaceId={workspaceId}
+                                  destinationDirPath={""}
+                                  onAddFile={async (file) => {
+                                    setNewFileDropdownMenuOpen(false);
+                                    if (!file) {
+                                      return;
+                                    }
+
+                                    history.push({
+                                      pathname: routes.workspaceWithFilePath.path({
+                                        workspaceId: file.workspaceId,
+                                        fileRelativePath: file.relativePathWithoutExtension,
+                                        extension: file.extension,
+                                      }),
+                                    });
+                                  }}
+                                />
+                              </Dropdown>
+                            </ToolbarItem>
+                            <ToolbarItem>
+                              <Checkbox
+                                id="viewRoFiles"
+                                label="View readonly files"
+                                isChecked={isViewRoFilesCheckedInternal}
+                                isDisabled={isViewRoFilesDisabled}
+                                onChange={handleViewRoCheckboxChange}
+                              ></Checkbox>
+                            </ToolbarItem>
+                          </>
+                        }
+                      />
+
+                      <WorkspaceFilesTable
+                        page={page}
+                        perPage={perPage}
+                        onFileToggle={onFileToggle}
+                        searchValue={searchValue}
+                        selectedWorkspaceFiles={selectedWorkspaceFiles}
+                        totalFilesCount={allFilesCount}
+                        workspaceFiles={files}
+                      />
+
+                      <TablePagination
+                        itemCount={filesCount}
+                        page={page}
+                        perPage={perPage}
+                        perPageOptions={defaultPerPageOptions}
+                        setPage={setPage}
+                        setPerPage={setPerPage}
+                        variant="bottom"
+                      />
+                    </>
+                  )}
+                  {files.length === 0 && (
+                    <Bullseye>
+                      <EmptyState>
+                        <EmptyStateIcon icon={CubesIcon} />
+                        <Title headingLevel="h4" size="lg">
+                          {`Nothing here`}
+                        </Title>
+                        <EmptyStateBody>{`Start by adding a new model`}</EmptyStateBody>
+                      </EmptyState>
+                    </Bullseye>
+                  )}
+                </PageSection>
+              </PageSection>
+            </Page>
+            <ConfirmDeleteModal
+              isOpen={isConfirmDeleteModalOpen}
+              onClose={onConfirmDeleteModalClose}
+              onDelete={() => onConfirmDeleteModalDelete(workspace.files.length)}
+              elementsTypeName={selectedElementTypesName}
+              deleteMessage={deleteModalMessage}
+            />
+          </>
+        );
+      }}
+    />
+  );
+}
+
+const capitalizeString = (value: string) => value.charAt(0).toUpperCase() + value.slice(1);
diff --git a/packages/serverless-logic-web-tools/src/homepage/recentModels/workspaceFiles/WorkspaceFilesTable.tsx b/packages/serverless-logic-web-tools/src/homepage/recentModels/workspaceFiles/WorkspaceFilesTable.tsx
new file mode 100644
index 0000000000..c21d7a034a
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/homepage/recentModels/workspaceFiles/WorkspaceFilesTable.tsx
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import * as React from "react";
+import { WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+import "@patternfly/react-core/dist/styles/base.css";
+import {
+  TableComposable,
+  Tbody,
+  Th,
+  Thead,
+  ThProps,
+  Tr,
+} from "@patternfly/react-table/dist/js/components/TableComposable";
+import { useCallback, useMemo, useState } from "react";
+import { isEditable } from "../../../extension";
+import { TablePaginationProps } from "../../../table/TablePagination";
+import { WorkspaceFilesTableRow } from "./WorkspaceFilesTableRow";
+
+export const columnNames = {
+  name: "Name",
+  type: "Type",
+  isEditable: "Editable",
+};
+
+export type WorkspaceFilesTableProps = Pick<TablePaginationProps, "page" | "perPage"> & {
+  onFileToggle: (workspaceFile: WorkspaceFile, checked: boolean) => void;
+  searchValue: string;
+  selectedWorkspaceFiles: WorkspaceFile[];
+  /**
+   * total files count
+   */
+  totalFilesCount: number;
+  workspaceFiles: WorkspaceFile[];
+};
+
+export type WorkspaceFilesTableRowData = Pick<WorkspaceFile, "extension"> & {
+  fileDescriptor: WorkspaceFile;
+  isEditable: boolean;
+  name: string;
+};
+
+export function WorkspaceFilesTable(props: WorkspaceFilesTableProps) {
+  const { workspaceFiles, selectedWorkspaceFiles, searchValue, page, perPage, totalFilesCount } = props;
+  const [activeSortIndex, setActiveSortIndex] = useState<number>(0);
+  const [activeSortDirection, setActiveSortDirection] = useState<"asc" | "desc">("desc");
+
+  const tableData = useMemo<WorkspaceFilesTableRowData[]>(
+    () =>
+      workspaceFiles.map((f) => ({
+        extension: f.extension,
+        fileDescriptor: f,
+        isEditable: isEditable(f.relativePath),
+        name: f.nameWithoutExtension,
+        relativePath: f.relativePath,
+        workspaceId: f.workspaceId,
+      })),
+    [workspaceFiles]
+  );
+
+  const filteredTableData = useMemo<WorkspaceFilesTableRowData[]>(() => {
+    const searchRegex = new RegExp(searchValue, "i");
+    return searchValue ? tableData.filter((e) => e.name.search(searchRegex) >= 0) : tableData;
+  }, [searchValue, tableData]);
+
+  const sortedTableData = useMemo<WorkspaceFilesTableRowData[]>(
+    () =>
+      // slice() here is needed to create a copy of filteredTableData and sort the data
+      filteredTableData.slice().sort((a, b) => {
+        const aValue = getSortableRowValues(a)[activeSortIndex];
+        const bValue = getSortableRowValues(b)[activeSortIndex];
+        if (typeof aValue === "number" || typeof aValue === "boolean") {
+          return activeSortDirection === "asc"
+            ? (aValue as number) - (bValue as number)
+            : (bValue as number) - (aValue as number);
+        } else {
+          return activeSortDirection === "asc"
+            ? (aValue as string).localeCompare(bValue as string)
+            : (bValue as string).localeCompare(aValue as string);
+        }
+      }),
+    [filteredTableData, activeSortIndex, activeSortDirection]
+  );
+
+  const visibleTableData = useMemo<WorkspaceFilesTableRowData[]>(
+    () => sortedTableData.slice((page - 1) * perPage, page * perPage),
+    [sortedTableData, page, perPage]
+  );
+
+  const getSortParams = useCallback(
+    (columnIndex: number): ThProps["sort"] => ({
+      sortBy: {
+        index: activeSortIndex,
+        direction: activeSortDirection,
+        defaultDirection: "asc",
+      },
+      onSort: (_event, index, direction) => {
+        setActiveSortIndex(index);
+        setActiveSortDirection(direction);
+      },
+      columnIndex,
+    }),
+    [activeSortIndex, activeSortDirection]
+  );
+
+  const isFileCheckboxChecked = useCallback(
+    (rowData: WorkspaceFilesTableRowData) =>
+      selectedWorkspaceFiles.some(
+        (f) =>
+          f.workspaceId === rowData.fileDescriptor.workspaceId && f.relativePath === rowData.fileDescriptor.relativePath
+      ),
+    [selectedWorkspaceFiles]
+  );
+
+  return (
+    <>
+      <TableComposable aria-label="Selectable table">
+        <Thead>
+          <Tr>
+            <Th>&nbsp;</Th>
+            <Th sort={getSortParams(0)}>{columnNames.name}</Th>
+            <Th sort={getSortParams(1)}>{columnNames.type}</Th>
+            <Th sort={getSortParams(2)}>{columnNames.isEditable}</Th>
+            <Th></Th>
+          </Tr>
+        </Thead>
+        <Tbody>
+          {visibleTableData.map((rowData, rowIndex) => (
+            <WorkspaceFilesTableRow
+              totalFilesCount={totalFilesCount}
+              isSelected={isFileCheckboxChecked(rowData)}
+              key={rowIndex}
+              onToggle={(checked) => props.onFileToggle(rowData.fileDescriptor, checked)}
+              rowData={rowData}
+              rowIndex={rowIndex}
+            />
+          ))}
+        </Tbody>
+      </TableComposable>
+    </>
+  );
+}
+
+function getSortableRowValues(tableData: WorkspaceFilesTableRowData): (string | number | boolean)[] {
+  const { name, extension, isEditable } = tableData;
+  return [name, extension, isEditable];
+}
diff --git a/packages/serverless-logic-web-tools/src/homepage/recentModels/workspaceFiles/WorkspaceFilesTableRow.tsx b/packages/serverless-logic-web-tools/src/homepage/recentModels/workspaceFiles/WorkspaceFilesTableRow.tsx
new file mode 100644
index 0000000000..0b74f4926c
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/homepage/recentModels/workspaceFiles/WorkspaceFilesTableRow.tsx
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import * as React from "react";
+import { useWorkspaces } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+import { BanIcon, CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons";
+import { TaskIcon } from "@patternfly/react-icons/dist/js/icons/task-icon";
+import { ActionsColumn, Td, Tr } from "@patternfly/react-table/dist/esm";
+import { TdSelectType } from "@patternfly/react-table/dist/esm/components/Table/base";
+import { useCallback, useMemo } from "react";
+import { Link, useHistory } from "react-router-dom";
+import { routes } from "../../../navigation/Routes";
+import "../../../table/Table.css";
+import { FileLabel } from "../../../workspace/components/FileLabel";
+import { columnNames, WorkspaceFilesTableRowData } from "./WorkspaceFilesTable";
+
+export const workspacesTableRowErrorContent = "Error obtaining workspace information";
+
+export type WorkspaceFilesTableRowProps = {
+  /**
+   * total files count
+   */
+  totalFilesCount: number;
+  isSelected: boolean;
+  /**
+   * event fired when the Checkbox is toggled
+   */
+  onToggle: (selected: boolean) => void;
+  rowIndex: TdSelectType["rowIndex"];
+  rowData: WorkspaceFilesTableRowData;
+};
+
+export function WorkspaceFilesTableRow(props: WorkspaceFilesTableRowProps) {
+  const { isSelected, rowIndex, totalFilesCount } = props;
+  const { name, extension, isEditable, fileDescriptor } = props.rowData;
+  const workspaces = useWorkspaces();
+  const history = useHistory();
+
+  const linkTo = useMemo(
+    () =>
+      routes.workspaceWithFilePath.path({
+        workspaceId: fileDescriptor.workspaceId,
+        fileRelativePath: fileDescriptor.relativePathWithoutExtension,
+        extension: fileDescriptor.extension,
+      }),
+    [fileDescriptor]
+  );
+
+  const onDelete = useCallback(async () => {
+    if (totalFilesCount > 1) {
+      return await workspaces.deleteFile({ file: fileDescriptor });
+    }
+    workspaces.deleteWorkspace({ workspaceId: fileDescriptor.workspaceId });
+    history.push({ pathname: routes.recentModels.path({}) });
+  }, [fileDescriptor, history, workspaces, totalFilesCount]);
+
+  return (
+    <Tr key={name}>
+      <Td
+        select={{
+          rowIndex,
+          onSelect: (_event, checked) => props.onToggle(checked),
+          isSelected,
+        }}
+      />
+      <Td dataLabel={columnNames.name}>
+        <TaskIcon />
+        &nbsp;&nbsp;&nbsp;<Link to={linkTo}>{name}</Link>
+      </Td>
+      <Td dataLabel={columnNames.type}>
+        <FileLabel extension={extension} />
+      </Td>
+      <Td dataLabel={columnNames.isEditable}>
+        {isEditable ? <CheckCircleIcon className="success-icon"></CheckCircleIcon> : <BanIcon></BanIcon>}
+      </Td>
+      <Td isActionCell>
+        <ActionsColumn
+          items={[
+            {
+              title: "Delete",
+              onClick: onDelete,
+            },
+          ]}
+        />
+      </Td>
+    </Tr>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx b/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx
index 896194c6cc..78aae5a70f 100644
--- a/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx
@@ -27,6 +27,7 @@ import { NewWorkspaceWithEmptyFilePage } from "../../workspace/components/NewWor
 import { EditorPage } from "../../editor/EditorPage";
 import { NoMatchPage } from "../../navigation/NoMatchPage";
 import { Showcase } from "../../home/sample/Showcase";
+import { WorkspaceFiles } from "../recentModels/workspaceFiles/WorkspaceFiles";
 
 export function HomePageRoutes(props: { isNavOpen: boolean }) {
   const routes = useRoutes();
@@ -64,6 +65,9 @@ export function HomePageRoutes(props: { isNavOpen: boolean }) {
       <Route path={routes.recentModels.path({})}>
         <RecentModels />
       </Route>
+      <Route path={routes.workspaceWithFiles.path({ workspaceId: ":workspaceId" })}>
+        {({ match }) => <WorkspaceFiles workspaceId={match!.params.workspaceId!} />}
+      </Route>
       <Route path={routes.sampleCatalog.path({})}>
         <Showcase />
       </Route>
diff --git a/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx b/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx
index 209a55f0d7..dca5bfeac4 100644
--- a/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx
@@ -16,21 +16,29 @@
 
 import * as React from "react";
 import { Nav, NavItem, NavList } from "@patternfly/react-core/dist/js/components/Nav";
-import { Link } from "react-router-dom";
+import { Link, matchPath } from "react-router-dom";
 import { ExternalLinkAltIcon } from "@patternfly/react-icons/dist/js/icons";
 import { routes } from "../../navigation/Routes";
+import { SERVERLESS_LOGIC_WEBTOOLS_DOCUMENTATION_URL } from "../../AppConstants";
 
 export function HomePageNav(props: { pathname: string }) {
   return (
     <>
-      <div className="chr-c-app-title">Serverless Logic Web Tools</div>
       <Nav aria-label="Global NAV" theme="dark">
         <NavList>
           <NavItem itemId={0} key={"Overview-nav"} isActive={props.pathname === routes.home.path({})}>
             <Link to={routes.home.path({})}>Overview</Link>
           </NavItem>
 
-          <NavItem itemId={1} key={"Recent-models-nav"} isActive={props.pathname === routes.recentModels.path({})}>
+          <NavItem
+            itemId={1}
+            key={"Recent-models-nav"}
+            isActive={
+              props.pathname === routes.recentModels.path({}) ||
+              matchPath(props.pathname, { path: routes.workspaceWithFiles.path({ workspaceId: ":workspaceId" }) })
+                ?.isExact
+            }
+          >
             <Link to={routes.recentModels.path({})}>Recent Models</Link>
           </NavItem>
 
@@ -39,10 +47,7 @@ export function HomePageNav(props: { pathname: string }) {
           </NavItem>
 
           <NavItem itemId={3} key={"Documentation-nav"} className="chr-c-navigation__additional-links">
-            <a
-              href="https://kiegroup.github.io/kogito-docs/serverlessworkflow/latest/tooling/serverless-logic-web-tools/serverless-logic-web-tools-overview.html"
-              target="_blank"
-            >
+            <a href={SERVERLESS_LOGIC_WEBTOOLS_DOCUMENTATION_URL} target="_blank">
               Documentation
               <ExternalLinkAltIcon />
             </a>
diff --git a/packages/serverless-logic-web-tools/src/navigation/Routes.ts b/packages/serverless-logic-web-tools/src/navigation/Routes.ts
index 0d2f7000b2..0c36e8c953 100644
--- a/packages/serverless-logic-web-tools/src/navigation/Routes.ts
+++ b/packages/serverless-logic-web-tools/src/navigation/Routes.ts
@@ -132,6 +132,10 @@ export const routes = {
       `/${workspaceId}/file/${fileRelativePath}${extension ? "." + extension : ""}`
   ),
 
+  workspaceWithFiles: new Route<{
+    pathParams: PathParams.WORKSPACE_ID;
+  }>(({ workspaceId }) => `/${workspaceId}/files`),
+
   recentModels: new Route<{}>(() => `/RecentModels`),
   sampleCatalog: new Route<{}>(() => `/SampleCatalog`),
 
diff --git a/packages/serverless-logic-web-tools/src/table/ConfirmDeleteModal.tsx b/packages/serverless-logic-web-tools/src/table/ConfirmDeleteModal.tsx
new file mode 100644
index 0000000000..1b29c29f2d
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/table/ConfirmDeleteModal.tsx
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { Button, Checkbox, Modal, ModalProps, Skeleton } from "@patternfly/react-core/dist/js";
+import * as React from "react";
+import { useCallback, useEffect, useState } from "react";
+
+export type ConfirmDeleteModalProps = Pick<ModalProps, "isOpen" | "onClose"> & {
+  /**
+   * set to false to manage the loading. Default is true.
+   */
+  dataLoaded?: boolean;
+
+  deleteMessage: React.ReactNode;
+
+  elementsTypeName: string;
+
+  /**
+   * set to true if there has been error loading the data.
+   */
+  fetchError?: boolean;
+
+  onDelete: () => void;
+};
+
+export function ConfirmDeleteModal(props: ConfirmDeleteModalProps) {
+  const { isOpen, onClose, onDelete, elementsTypeName, deleteMessage, dataLoaded = true, fetchError = false } = props;
+  const [isDeleteCheck, setIsDeleteCheck] = useState(false);
+
+  const onDeleteCheckChange = useCallback((checked: boolean) => {
+    setIsDeleteCheck(checked);
+  }, []);
+
+  useEffect(() => {
+    setIsDeleteCheck(false);
+  }, [isOpen]);
+
+  return (
+    <>
+      <Modal
+        title={`Delete ${elementsTypeName}`}
+        titleIconVariant={"warning"}
+        isOpen={isOpen && !fetchError}
+        onClose={onClose}
+        aria-describedby="modal-custom-icon-description"
+        actions={[
+          dataLoaded ? (
+            <Button key="confirm" variant="danger" onClick={onDelete} isDisabled={!isDeleteCheck} aria-label="Delete">
+              Delete {elementsTypeName}
+            </Button>
+          ) : (
+            <Skeleton width="100px" key="confirm-skeleton" />
+          ),
+          <Button key="cancel" variant="link" onClick={onClose} aria-label="Cancel">
+            Cancel
+          </Button>,
+        ]}
+        variant="small"
+      >
+        {dataLoaded ? <span id="modal-custom-icon-description">{deleteMessage}</span> : <Skeleton width="80%" />}
+        <br />
+        <br />
+        <Checkbox
+          label="I understand that this action cannot be undone."
+          id="delete-model-check"
+          isChecked={isDeleteCheck}
+          onChange={onDeleteCheckChange}
+          aria-label="Confirm checkbox delete model"
+        />
+      </Modal>
+
+      <Modal
+        title={`Error retrieving data`}
+        titleIconVariant={"danger"}
+        isOpen={isOpen && fetchError}
+        onClose={onClose}
+        aria-describedby="modal-custom-icon-description"
+        variant="small"
+      >
+        <span id="modal-custom-icon-description">An error occurred while loading the data!</span>
+      </Modal>
+    </>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/table/TablePagination.tsx b/packages/serverless-logic-web-tools/src/table/TablePagination.tsx
index d438703838..fec23e2675 100644
--- a/packages/serverless-logic-web-tools/src/table/TablePagination.tsx
+++ b/packages/serverless-logic-web-tools/src/table/TablePagination.tsx
@@ -14,10 +14,20 @@
  * limitations under the License.
  */
 import * as React from "react";
-import { OnPerPageSelect, Pagination, PaginationProps } from "@patternfly/react-core/dist/js/components/Pagination";
+import {
+  OnPerPageSelect,
+  Pagination,
+  PaginationProps,
+  PerPageOptions,
+} from "@patternfly/react-core/dist/js/components/Pagination";
 import "@patternfly/react-core/dist/styles/base.css";
 import { useCallback } from "react";
 
+export const defaultPerPageOptions: PerPageOptions[] = [5, 10, 20, 50, 100].map((n) => ({
+  title: n.toString(),
+  value: n,
+}));
+
 export type TablePaginationProps = Pick<PaginationProps, "variant" | "isCompact" | "perPageOptions"> & {
   itemCount: number;
   page: number;
diff --git a/packages/serverless-logic-web-tools/src/table/TableToolbar.tsx b/packages/serverless-logic-web-tools/src/table/TableToolbar.tsx
index 84286b5f64..31cb56d3ee 100644
--- a/packages/serverless-logic-web-tools/src/table/TableToolbar.tsx
+++ b/packages/serverless-logic-web-tools/src/table/TableToolbar.tsx
@@ -33,6 +33,7 @@ export type TableToolbarProps = TablePaginationProps & {
   searchValue: string;
   selectedElementsCount: number;
   setSearchValue: React.Dispatch<React.SetStateAction<string>>;
+  additionalComponents?: React.ReactNode;
 };
 
 export function TableToolbar(props: TableToolbarProps) {
@@ -48,6 +49,7 @@ export function TableToolbar(props: TableToolbarProps) {
     perPageOptions,
     setPage,
     setPerPage,
+    additionalComponents,
   } = props;
   const [isBulkDropDownOpen, setIsBulkDropDownOpen] = useState(false);
   const [isActionDropdownOpen, setIsActionDropdownOpen] = React.useState(false);
@@ -143,6 +145,7 @@ export function TableToolbar(props: TableToolbarProps) {
             dropdownItems={actionDropdownItems}
           />
         </ToolbarItem>
+        {additionalComponents}
         <ToolbarItem variant="pagination">
           <TablePagination
             itemCount={itemCount}
diff --git a/packages/serverless-logic-web-tools/static/resources/style.css b/packages/serverless-logic-web-tools/static/resources/style.css
index 9d002919ea..482b25a9d2 100644
--- a/packages/serverless-logic-web-tools/static/resources/style.css
+++ b/packages/serverless-logic-web-tools/static/resources/style.css
@@ -659,6 +659,11 @@ section.kie-tools--settings-tab {
 .pf-c-menu__item-description {
   word-break: normal !important;
 }
+.brand-name {
+  color: #fff;
+  padding: 0 var(--pf-global--spacer--sm) 0 var(--pf-global--spacer--sm);
+  font-weight: var(--pf-global--FontWeight--semi-bold);
+}
 .chr-c-app-title {
   color: #fff;
   padding: var(--pf-global--spacer--md) var(--pf-global--spacer--sm) var(--pf-global--spacer--md)


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 04/27: KOGITO-8149: Refactor Home (now Overview) according to UX redesign (#1449)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit 888e11c9f61769d6b8b7089da9f9c4fa5b336382
Author: Fabrizio Antonangeli <fa...@gmail.com>
AuthorDate: Thu Feb 9 10:27:50 2023 +0100

    KOGITO-8149: Refactor Home (now Overview) according to UX redesign (#1449)
    
    * Add top banner
    
    * Add sidebar title
    
    * manage Buttons responsiveness
    
    * Fix "New Dashboard" button overlap when sidebar is open on breakpoint lg
    
    * Refactored import card
    
    * Video section
    
    * FIX: Overview: visualization issues with sidebar and quickstarts open
    
    * Add kie-docs button
    
    * Empty commit
    
    * -resize logo
    -add ExternalLinkAltIcon to "document" button
    -replaced placeholder with real video
    -fix typo
    -add reference in application-services.css comment
    
    * Uptaded YT video
    
    * Removed "/Documentation" route
---
 .../src/homepage/overView/ImportFromUrlCard.tsx    |   3 +-
 .../src/homepage/overView/NewModelCard.tsx         |  40 +--
 .../homepage/overView/NewServerlessModelCard.tsx   |  51 +--
 .../src/homepage/overView/Overview.tsx             | 206 ++++++++----
 .../src/homepage/overView/UploadCard.tsx           |   2 +-
 .../src/homepage/pageTemplate/OnlineEditorPage.tsx |  14 +-
 .../src/homepage/routes/HomePageRoutes.tsx         |  11 +-
 .../src/homepage/uiNav/HomePageNav.tsx             |  44 ++-
 packages/serverless-logic-web-tools/src/index.tsx  |   1 +
 .../src/navigation/RoutesSwitch.tsx                |  11 +-
 .../static/images/overview-banner-bg.png           | Bin 0 -> 52155 bytes
 .../static/resources/application-services.css      | 350 +++++++++++++++++++++
 .../static/resources/style.css                     |   3 +
 13 files changed, 597 insertions(+), 139 deletions(-)

diff --git a/packages/serverless-logic-web-tools/src/homepage/overView/ImportFromUrlCard.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/ImportFromUrlCard.tsx
index f644bea22f..6379023cda 100644
--- a/packages/serverless-logic-web-tools/src/homepage/overView/ImportFromUrlCard.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/overView/ImportFromUrlCard.tsx
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-import { SupportedFileExtensions } from "../../extension";
 import * as React from "react";
 import { useRoutes } from "../../navigation/Hooks";
 import { useHistory } from "react-router";
@@ -54,7 +53,7 @@ export function ImportFromUrlCard() {
   }, [importableUrl]);
 
   return (
-    <Card isFullHeight={true} isLarge={true} isPlain={true} isSelected={url.length > 0}>
+    <Card isFullHeight={true} isPlain={true} isSelected={url.length > 0} isCompact>
       <CardTitle>
         <TextContent>
           <Text component={TextVariants.h2}>
diff --git a/packages/serverless-logic-web-tools/src/homepage/overView/NewModelCard.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/NewModelCard.tsx
index ab39d58ade..81fd7da2c3 100644
--- a/packages/serverless-logic-web-tools/src/homepage/overView/NewModelCard.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/overView/NewModelCard.tsx
@@ -14,38 +14,38 @@
  * limitations under the License.
  */
 
-import { SupportedFileExtensions } from "../../extension";
-import * as React from "react";
-import { useRoutes } from "../../navigation/Hooks";
+import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
 import { Card, CardBody, CardFooter, CardTitle } from "@patternfly/react-core/dist/js/components/Card";
-import { FileLabel } from "../../workspace/components/FileLabel";
 import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
-import { Grid } from "@patternfly/react-core/dist/js/layouts/Grid";
+import { GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
+import * as React from "react";
 import { Link } from "react-router-dom";
-import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
+import { SupportedFileExtensions } from "../../extension";
+import { useRoutes } from "../../navigation/Hooks";
+import { FileLabel } from "../../workspace/components/FileLabel";
 
 export function NewModelCard(props: { title: string; extension: SupportedFileExtensions; description: string }) {
   const routes = useRoutes();
 
   return (
-    <Card isFullHeight={true} isPlain={true} isLarge={true}>
-      <CardTitle>
-        <FileLabel style={{ fontSize: "0.6em" }} extension={props.extension} />
-      </CardTitle>
-      <CardBody>
-        <TextContent>
-          <Text component={TextVariants.p}>{props.description}</Text>
-        </TextContent>
-      </CardBody>
-      <CardFooter>
-        <Grid>
+    <GridItem sm={12} md={4}>
+      <Card isFullHeight={true} isPlain={true} isCompact>
+        <CardTitle>
+          <FileLabel style={{ fontSize: "0.6em" }} extension={props.extension} />
+        </CardTitle>
+        <CardBody>
+          <TextContent>
+            <Text component={TextVariants.p}>{props.description}</Text>
+          </TextContent>
+        </CardBody>
+        <CardFooter>
           <Link to={{ pathname: routes.newModel.path({ extension: props.extension }) }}>
             <Button variant={ButtonVariant.secondary} ouiaId={`new-${props.extension}-button`}>
               New {props.title}
             </Button>
           </Link>
-        </Grid>
-      </CardFooter>
-    </Card>
+        </CardFooter>
+      </Card>
+    </GridItem>
   );
 }
diff --git a/packages/serverless-logic-web-tools/src/homepage/overView/NewServerlessModelCard.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/NewServerlessModelCard.tsx
index 406c3825fe..a7141523cf 100644
--- a/packages/serverless-logic-web-tools/src/homepage/overView/NewServerlessModelCard.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/overView/NewServerlessModelCard.tsx
@@ -14,15 +14,16 @@
  * limitations under the License.
  */
 
+import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
+import { Card, CardBody, CardFooter, CardTitle } from "@patternfly/react-core/dist/js/components/Card";
+import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
+import { Flex } from "@patternfly/react-core/dist/js/layouts/Flex";
+import { GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
 import * as React from "react";
+import { Link } from "react-router-dom";
 import { SupportedFileExtensions } from "../../extension";
 import { useRoutes } from "../../navigation/Hooks";
-import { Card, CardBody, CardFooter, CardTitle } from "@patternfly/react-core/dist/js/components/Card";
 import { FileLabel } from "../../workspace/components/FileLabel";
-import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
-import { Grid, GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
-import { Link } from "react-router-dom";
-import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
 
 export function NewServerlessModelCard(props: {
   title: string;
@@ -33,34 +34,36 @@ export function NewServerlessModelCard(props: {
   const routes = useRoutes();
 
   return (
-    <Card isFullHeight={true} isPlain={true} isLarge={true}>
-      <CardTitle>
-        <FileLabel style={{ fontSize: "0.6em" }} extension={props.jsonExtension} />
-      </CardTitle>
-      <CardBody>
-        <TextContent>
-          <Text component={TextVariants.p}>{props.description}</Text>
-        </TextContent>
-      </CardBody>
-      <CardFooter>
-        <Grid hasGutter>
-          <GridItem span={12}>New {props.title}</GridItem>
-          <GridItem span={6}>
+    <GridItem sm={12} md={4}>
+      <Card isFullHeight={true} isPlain={true} isCompact={true}>
+        <CardTitle>
+          <FileLabel style={{ fontSize: "0.6em" }} extension={props.jsonExtension} />
+        </CardTitle>
+        <CardBody>
+          <TextContent>
+            <Text component={TextVariants.p}>{props.description}</Text>
+          </TextContent>
+        </CardBody>
+        <CardFooter>
+          <TextContent>
+            <Text component={TextVariants.p}>
+              <b>New {props.title}</b>
+            </Text>
+          </TextContent>
+          <Flex>
             <Link to={{ pathname: routes.newModel.path({ extension: props.jsonExtension }) }}>
               <Button variant={ButtonVariant.secondary} ouiaId={`new-${props.jsonExtension}-button`}>
                 JSON
               </Button>
             </Link>
-          </GridItem>
-          <GridItem span={6}>
             <Link to={{ pathname: routes.newModel.path({ extension: props.yamlExtension }) }}>
               <Button variant={ButtonVariant.secondary} ouiaId={`new-${props.yamlExtension}-button`}>
                 YAML
               </Button>
             </Link>
-          </GridItem>
-        </Grid>
-      </CardFooter>
-    </Card>
+          </Flex>
+        </CardFooter>
+      </Card>
+    </GridItem>
   );
 }
diff --git a/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx
index 2cdb5eda27..e286bc94c0 100644
--- a/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx
@@ -20,23 +20,34 @@ import { Grid, GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
 import { Gallery } from "@patternfly/react-core/dist/js/layouts/Gallery";
 import { PageSection } from "@patternfly/react-core/dist/js/components/Page";
 import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
-import { Divider } from "@patternfly/react-core/dist/js/components/Divider";
 import { NewServerlessModelCard } from "./NewServerlessModelCard";
-import { Card } from "@patternfly/react-core";
+import { Button, ButtonVariant, Card, CardBody } from "@patternfly/react-core/dist/js";
 import { ImportFromUrlCard } from "./ImportFromUrlCard";
 import { UploadCard } from "./UploadCard";
 import { useRoutes } from "../../navigation/Hooks";
 import { useHistory } from "react-router";
 import { useQueryParam, useQueryParams } from "../../queryParams/QueryParamsContext";
 import { QueryParams } from "../../navigation/Routes";
-import { useCallback } from "react";
+import { useCallback, useContext, useMemo } from "react";
 import { NewModelCard } from "./NewModelCard";
+import { Title } from "@patternfly/react-core/dist/js/components/Title";
+import { Stack, StackItem } from "@patternfly/react-core/dist/js/layouts/Stack";
+import { CardHeader, CardHeaderMain, CardTitle } from "@patternfly/react-core/dist/js/components/Card";
+import { List, ListItem } from "@patternfly/react-core/dist/js/components/List";
+import { QuickStartContext, QuickStartContextValues } from "@patternfly/quickstarts";
+import { ExternalLinkAltIcon } from "@patternfly/react-icons/dist/js/icons";
 
-export function Overview() {
+export function Overview(props: { isNavOpen: boolean }) {
   const routes = useRoutes();
   const history = useHistory();
   const expandedWorkspaceId = useQueryParam(QueryParams.EXPAND);
   const queryParams = useQueryParams();
+  const qsContext = useContext<QuickStartContextValues>(QuickStartContext);
+
+  const force12Cols = useMemo(
+    () => props.isNavOpen && !!qsContext.activeQuickStartID,
+    [props.isNavOpen, qsContext.activeQuickStartID]
+  );
 
   const closeExpandedWorkspace = useCallback(() => {
     history.replace({
@@ -60,63 +71,140 @@ export function Overview() {
     },
     [closeExpandedWorkspace, history, routes, expandedWorkspaceId]
   );
+
   return (
-    <Grid hasGutter>
-      <GridItem sm={12} xl={6}>
-        <PageSection variant={"light"} isFilled={true} style={{ height: "100%" }}>
-          <Card className="Dev-ui__card-size">
+    <>
+      <PageSection
+        className="appsrv-marketing--banner"
+        style={
+          {
+            "--appsrv-marketing--banner--before--BackgroundImage": "url(images/overview-banner-bg.png)",
+            "--appsrv-marketing--banner--before--BackgroundPositionY": "-99px",
+            "--appsrv-marketing--banner--before--BackgroundRepeat": "no-repeat",
+            "--appsrv-marketing--banner--before--BackgroundSize": "478px",
+          } as React.CSSProperties
+        }
+        variant={"light"}
+      >
+        <Stack hasGutter>
+          <Title headingLevel="h1" size="2xl">
+            Welcome to Serverless Logic Web Tools
+          </Title>
+          <StackItem>
+            <Text className="appsrv-marketing--banner__tagline pf-u-color-200">
+              Add-on service to create and synchronize your Serverless Workflow, Decision files, and Dashbuilder files
+            </Text>
+            <Text component={TextVariants.p}>
+              The Serverless Logic Web Tools is a web application that enables you to create and synchronize your
+              Serverless Workflow, Decision files, and Dashbuilder files in a single interface. Also, the Serverless
+              Logic Web Tools application provides the integrations that are needed to deploy and test the Serverless
+              Workflow models in development mode.
+            </Text>
+          </StackItem>
+          <StackItem>
+            <Button
+              target="_blank"
+              iconPosition="right"
+              icon={<ExternalLinkAltIcon />}
+              href="https://kiegroup.github.io/kogito-docs/serverlessworkflow/latest/index.html"
+              variant={ButtonVariant.secondary}
+              component="a"
+            >
+              Get Started with Serverless Logic Web Tools
+            </Button>
+          </StackItem>
+        </Stack>
+      </PageSection>
+      <PageSection className="appsrv-marketing--page-section--marketing" isWidthLimited>
+        <Grid hasGutter>
+          <GridItem xl={12} xl2={force12Cols ? 12 : 6}>
+            <Card className="Dev-ui__card-size" style={{ height: "100%" }}>
+              <CardHeader>
+                <CardHeaderMain>
+                  <CardTitle>
+                    <Title headingLevel="h2">Create</Title>
+                  </CardTitle>
+                </CardHeaderMain>
+              </CardHeader>
+              <CardBody>
+                <Grid>
+                  <NewServerlessModelCard
+                    title={"Workflow"}
+                    jsonExtension={FileTypes.SW_JSON}
+                    yamlExtension={FileTypes.SW_YAML}
+                    description={"Serverless Workflow files are used to define orchestration logic for services."}
+                  />
+                  <NewServerlessModelCard
+                    title={"Decision"}
+                    jsonExtension={FileTypes.YARD_JSON}
+                    yamlExtension={FileTypes.YARD_YAML}
+                    description={"Serverless Decision files are used to define decision logic for services."}
+                  />
+                  <NewModelCard
+                    title={"Dashboard"}
+                    extension={FileTypes.DASH_YAML}
+                    description={
+                      "Dashboard files are used to define data visualization from data extracted from applications."
+                    }
+                  />
+                </Grid>
+              </CardBody>
+            </Card>
+          </GridItem>
+          <GridItem xl={12} xl2={force12Cols ? 12 : 6}>
+            <Card className="Dev-ui__card-size" style={{ height: "100%" }}>
+              <CardHeader>
+                <CardHeaderMain>
+                  <CardTitle>
+                    <Title headingLevel="h2">Import</Title>
+                  </CardTitle>
+                </CardHeaderMain>
+              </CardHeader>
+              <CardBody>
+                <Gallery
+                  hasGutter={true}
+                  // 16px is the "Gutter" width.
+                  minWidths={{ sm: "calc(50% - 16px)", default: "100%" }}
+                  style={{ height: "calc(100% - 32px)" }}
+                >
+                  <ImportFromUrlCard />
+                  <UploadCard expandWorkspace={expandWorkspace} />
+                </Gallery>
+              </CardBody>
+            </Card>
+          </GridItem>
+        </Grid>
+      </PageSection>
+
+      <PageSection isWidthLimited className="appsrv-marketing--page-section--marketing" variant="light">
+        <Title className="pf-u-mb-lg" size="xl" headingLevel="h3">
+          Use Serverless Logic Web Tools
+        </Title>
+        <Grid hasGutter>
+          <GridItem md={7}>
+            <Card className="appsrv-marketing--video">
+              <iframe
+                width="560"
+                height="315"
+                src="https://www.youtube.com/embed/t3ahWJjiGoU"
+                title="YouTube video player"
+                allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
+                allowFullScreen
+              ></iframe>
+            </Card>
+          </GridItem>
+          <GridItem md={5}>
             <TextContent>
-              <Text component={TextVariants.h1}>Create</Text>
+              <Text className="pf-u-color-200 pf-u-ml-md">In this video, you&apos;ll learn how to:</Text>
+              <List className="app-services-ui--icon-list">
+                <ListItem>Create a Serverless Workflow, a Dashboard or a Decision.</ListItem>
+                <ListItem>Import a project into Serveless Logic Web Tools.</ListItem>
+                <ListItem>Deploy and run your project into an OpenShift instance.</ListItem>
+              </List>
             </TextContent>
-            <br />
-            <Divider inset={{ default: "insetXl" }} />
-            <Gallery
-              hasGutter={true}
-              // 16px is the "Gutter" width.
-              minWidths={{ sm: "calc(33% - 16px)", default: "100%" }}
-              style={{ height: "calc(100% - 32px)" }}
-            >
-              <NewServerlessModelCard
-                title={"Workflow"}
-                jsonExtension={FileTypes.SW_JSON}
-                yamlExtension={FileTypes.SW_YAML}
-                description={"Serverless Workflow files are used to define orchestration logic for services."}
-              />
-              <NewServerlessModelCard
-                title={"Decision"}
-                jsonExtension={FileTypes.YARD_JSON}
-                yamlExtension={FileTypes.YARD_YAML}
-                description={"Serverless Decision files are used to define decision logic for services."}
-              />
-              <NewModelCard
-                title={"Dashboard"}
-                extension={FileTypes.DASH_YAML}
-                description={
-                  "Dashboard files are used to define data visualization from data extracted from applications."
-                }
-              />
-            </Gallery>
-          </Card>
-        </PageSection>
-      </GridItem>
-      <GridItem sm={12} xl={6}>
-        <PageSection variant={"light"} isFilled={true} style={{ height: "100%" }}>
-          <TextContent>
-            <Text component={TextVariants.h1}>Import</Text>
-          </TextContent>
-          <br />
-          <Divider inset={{ default: "insetXl" }} />
-          <Gallery
-            hasGutter={true}
-            // 16px is the "Gutter" width.
-            minWidths={{ sm: "calc(50% - 16px)", default: "100%" }}
-            style={{ height: "calc(100% - 32px)" }}
-          >
-            <ImportFromUrlCard />
-            <UploadCard expandWorkspace={expandWorkspace} />
-          </Gallery>
-        </PageSection>
-      </GridItem>
-    </Grid>
+          </GridItem>
+        </Grid>
+      </PageSection>
+    </>
   );
 }
diff --git a/packages/serverless-logic-web-tools/src/homepage/overView/UploadCard.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/UploadCard.tsx
index aabae9ea32..c63221d06b 100644
--- a/packages/serverless-logic-web-tools/src/homepage/overView/UploadCard.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/overView/UploadCard.tsx
@@ -183,7 +183,7 @@ export function UploadCard(props: { expandWorkspace: (workspaceId: string) => vo
         </div>
       )}
       <input id={"upload-field"} {...getInputProps()} />
-      <Card isFullHeight={true} isLarge={true} isPlain={true}>
+      <Card isFullHeight={true} isPlain={true} isCompact={true}>
         <CardTitle>
           <TextContent>
             <Text component={TextVariants.h2}>
diff --git a/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx b/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
index a6bf24d405..af763471da 100644
--- a/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
@@ -49,15 +49,19 @@ import {
 import { SettingsButton } from "../../settings/SettingsButton";
 import { HomePageNav } from "../uiNav/HomePageNav";
 
-export type OnlineEditorPageProps = { children?: React.ReactNode; pageContainerRef: React.RefObject<HTMLDivElement> };
+export type OnlineEditorPageProps = {
+  children?: React.ReactNode;
+  pageContainerRef: React.RefObject<HTMLDivElement>;
+  isNavOpen: boolean;
+  setIsNavOpen: (value: boolean) => void;
+};
 
 export function OnlineEditorPage(props: OnlineEditorPageProps) {
   const history = useHistory();
   const routes = useRoutes();
-  const [isNavOpen, setIsNavOpen] = useState(true);
   const isRouteInSettingsSection = useRouteMatch(routes.settings.home.path({}));
   const navToggle = () => {
-    setIsNavOpen(!isNavOpen);
+    props.setIsNavOpen(!props.isNavOpen);
   };
   const [activeQuickStartID, setActiveQuickStartID] = useState("");
   const [allQuickStartStates, setAllQuickStartStates] = useState({});
@@ -124,7 +128,7 @@ export function OnlineEditorPage(props: OnlineEditorPageProps) {
           variant="plain"
           aria-label="Global NAV"
           onClick={navToggle}
-          aria-expanded={isNavOpen}
+          aria-expanded={props.isNavOpen}
           aria-controls=""
         >
           <BarsIcon />
@@ -157,7 +161,7 @@ export function OnlineEditorPage(props: OnlineEditorPageProps) {
     [location, isRouteInSettingsSection]
   );
 
-  const sidebar = <PageSidebar nav={pageNav} isNavOpen={isNavOpen} theme="dark" />;
+  const sidebar = <PageSidebar nav={pageNav} isNavOpen={props.isNavOpen} theme="dark" />;
   const mainContainerId = "main-content-page-layout-tertiary-nav";
 
   const pageSkipToContent = <SkipToContent href={`#${mainContainerId}`}>Skip to content</SkipToContent>;
diff --git a/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx b/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx
index 8ddd74cdf8..2a2f17cf6e 100644
--- a/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx
@@ -27,7 +27,7 @@ import { NewWorkspaceFromUrlPage } from "../../workspace/components/NewWorkspace
 import { EditorPage } from "../../editor/EditorPage";
 import { NoMatchPage } from "../../navigation/NoMatchPage";
 
-export function HomePageRoutes() {
+export function HomePageRoutes(props: { isNavOpen: boolean }) {
   const routes = useRoutes();
   const supportedExtensions = useMemo(() => supportedFileExtensionArray.join("|"), []);
   return (
@@ -55,7 +55,7 @@ export function HomePageRoutes() {
         )}
       </Route>
       <Route path="/" exact>
-        <Overview />
+        <Overview isNavOpen={props.isNavOpen} />
       </Route>
       <Route path="/ServerlessModels">
         <ServerlessModels />
@@ -63,13 +63,6 @@ export function HomePageRoutes() {
       <Route path="/SampleCatalog">
         <SampleCatalog />
       </Route>
-      <Route
-        path="/Documentation"
-        component={() => {
-          window.open("https://kiegroup.github.io/kogito-docs/serverlessworkflow/latest/index.html");
-          return null;
-        }}
-      />
       <Route component={NoMatchPage} />
     </Switch>
   );
diff --git a/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx b/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx
index b0bcf908fa..29d1ffbab9 100644
--- a/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx
@@ -17,27 +17,39 @@
 import * as React from "react";
 import { Nav, NavItem, NavList } from "@patternfly/react-core";
 import { Link } from "react-router-dom";
+import { ExternalLinkAltIcon } from "@patternfly/react-icons/dist/js/icons";
 
 export function HomePageNav(props: { pathname: string }) {
   return (
-    <Nav aria-label="Global NAV" theme="dark">
-      <NavList>
-        <NavItem itemId={0} key={"Overview-nav"} isActive={props.pathname === "/"}>
-          <Link to="/">Overview</Link>
-        </NavItem>
+    <>
+      <div className="chr-c-app-title">Serverless Logic Web Tools</div>
+      <Nav aria-label="Global NAV" theme="dark">
+        <NavList>
+          <NavItem itemId={0} key={"Overview-nav"} isActive={props.pathname === "/"}>
+            <Link to="/">Overview</Link>
+          </NavItem>
 
-        <NavItem itemId={1} key={"Serverless-models-nav"} isActive={props.pathname === "/ServerlessModels"}>
-          <Link to="/ServerlessModels">Serverless Models</Link>
-        </NavItem>
+          <NavItem itemId={1} key={"Serverless-models-nav"} isActive={props.pathname === "/ServerlessModels"}>
+            <Link to="/ServerlessModels">Serverless Models</Link>
+          </NavItem>
 
-        <NavItem itemId={2} key={"SampleCatalog-nav"} isActive={props.pathname === "/SampleCatalog"}>
-          <Link to="/SampleCatalog">Sample Catalog</Link>
-        </NavItem>
+          <NavItem itemId={2} key={"SampleCatalog-nav"} isActive={props.pathname === "/SampleCatalog"}>
+            <Link to="/SampleCatalog">Sample Catalog</Link>
+          </NavItem>
 
-        <NavItem itemId={3} key={"Documentation-nav"} isActive={props.pathname === "/Documentation"}>
-          <Link to="/Documentation">Documentation</Link>
-        </NavItem>
-      </NavList>
-    </Nav>
+          <NavItem
+            itemId={3}
+            key={"Documentation-nav"}
+            className="chr-c-navigation__additional-links"
+            isActive={props.pathname === "/Documentation"}
+          >
+            <a href="https://kiegroup.github.io/kogito-docs/serverlessworkflow/latest/index.html" target="_blank">
+              Documentation
+              <ExternalLinkAltIcon />
+            </a>
+          </NavItem>
+        </NavList>
+      </Nav>
+    </>
   );
 }
diff --git a/packages/serverless-logic-web-tools/src/index.tsx b/packages/serverless-logic-web-tools/src/index.tsx
index d23a1dc5e6..db8f193bdd 100644
--- a/packages/serverless-logic-web-tools/src/index.tsx
+++ b/packages/serverless-logic-web-tools/src/index.tsx
@@ -20,6 +20,7 @@ import * as React from "react";
 import * as ReactDOM from "react-dom";
 import { App } from "./App";
 import "../static/resources/style.css";
+import "../static/resources/application-services.css";
 import * as incompatibleBrowser from "./workspace/startupBlockers/IncompatibleBrowser";
 import * as fsChanged from "./workspace/startupBlockers/FsChanged";
 
diff --git a/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx b/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx
index ad68babfe9..e4a33a202d 100644
--- a/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx
+++ b/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx
@@ -15,7 +15,7 @@
  */
 
 import * as React from "react";
-import { useMemo, useRef } from "react";
+import { useMemo, useRef, useState } from "react";
 import { Route, Switch, useRouteMatch } from "react-router-dom";
 import { useRoutes } from "./Hooks";
 import { OnlineEditorPage } from "../homepage/pageTemplate/OnlineEditorPage";
@@ -30,6 +30,7 @@ export function RoutesSwitch() {
     return process.env["WEBPACK_REPLACE__buildInfo"];
   }, []);
   const pageContainerRef = useRef<HTMLDivElement>(null);
+  const [isNavOpen, setIsNavOpen] = useState(true);
 
   const renderPage = (routeProps: {
     location: {
@@ -46,8 +47,12 @@ export function RoutesSwitch() {
     };
   }) => {
     return (
-      <OnlineEditorPage pageContainerRef={pageContainerRef}>
-        {!isRouteInSettingsSection ? <HomePageRoutes /> : <SettingsPageRoutes pageContainerRef={pageContainerRef} />}
+      <OnlineEditorPage pageContainerRef={pageContainerRef} isNavOpen={isNavOpen} setIsNavOpen={setIsNavOpen}>
+        {!isRouteInSettingsSection ? (
+          <HomePageRoutes isNavOpen={isNavOpen} />
+        ) : (
+          <SettingsPageRoutes pageContainerRef={pageContainerRef} />
+        )}
         {buildInfo && (
           <div className={"kie-tools--build-info"}>
             <Label>{buildInfo}</Label>
diff --git a/packages/serverless-logic-web-tools/static/images/overview-banner-bg.png b/packages/serverless-logic-web-tools/static/images/overview-banner-bg.png
new file mode 100644
index 0000000000..9d2ffbc5de
Binary files /dev/null and b/packages/serverless-logic-web-tools/static/images/overview-banner-bg.png differ
diff --git a/packages/serverless-logic-web-tools/static/resources/application-services.css b/packages/serverless-logic-web-tools/static/resources/application-services.css
new file mode 100644
index 0000000000..cb1afe1004
--- /dev/null
+++ b/packages/serverless-logic-web-tools/static/resources/application-services.css
@@ -0,0 +1,350 @@
+/* original CSS: https://console.redhat.com/beta/apps/application-services/6f315189.css */
+
+main.applicationServices {
+  height: 100%;
+}
+
+.pf-c-page__main-section.appsrv-marketing--banner {
+  --appsrv-marketing--banner--before--GridTemplateColumns: 1fr;
+  --appsrv-marketing--banner--ColumnGap: var(--pf-global--spacer--2xl);
+  --appsrv-marketing--banner__tagline--Color: var(--pf-global--Color--light-300);
+  --appsrv-marketing--banner--Padding: var(--pf-global--spacer--lg);
+  --appsrv-marketing--banner--PaddingTop: var(--appsrv-marketing--banner--Padding);
+  --appsrv-marketing--banner--PaddingRight: var(--appsrv-marketing--banner--Padding);
+  --appsrv-marketing--banner--PaddingBottom: var(--appsrv-marketing--banner--Padding);
+  --appsrv-marketing--banner--PaddingLeft: var(--appsrv-marketing--banner--Padding);
+  --appsrv-marketing--banner--before--Offset--top: calc(var(--appsrv-marketing--banner--PaddingTop) * -1);
+  --appsrv-marketing--banner--before--Offset--bottom: calc(var(--appsrv-marketing--banner--PaddingBottom) * -1);
+  --appsrv-marketing--banner--before--Offset--right: calc(var(--appsrv-marketing--banner--PaddingRight) * -1);
+  --appsrv-marketing--banner--before--Offset--left: calc(var(--appsrv-marketing--banner--PaddingLeft) * -1);
+  grid-gap: var(--appsrv-marketing--banner--ColumnGap);
+  display: grid;
+  grid-template-areas: "content";
+  grid-template-columns: var(--appsrv-marketing--banner--before--GridTemplateColumns);
+  padding: var(--appsrv-marketing--banner--PaddingTop) var(--appsrv-marketing--banner--PaddingRight)
+    var(--appsrv-marketing--banner--PaddingBottom) var(--appsrv-marketing--banner--PaddingLeft);
+}
+
+@media screen and (min-width: 768px) {
+  .pf-c-page__main-section.appsrv-marketing--banner {
+    --appsrv-marketing--banner--Padding: var(--pf-global--spacer--2xl);
+    --appsrv-marketing--banner--before--Opacity: 0.65;
+    --appsrv-marketing--banner--before--GridTemplateColumns: 2fr 1fr;
+    grid-template-areas: "content graphic";
+  }
+}
+
+@media screen and (min-width: 992px) {
+  .pf-c-page__main-section.appsrv-marketing--banner {
+    --appsrv-marketing--banner--before--GridTemplateColumns: 2fr 1fr;
+  }
+}
+
+@media screen and (min-width: 1200px) {
+  .pf-c-page__main-section.appsrv-marketing--banner {
+    --appsrv-marketing--banner--before--Opacity: 1;
+  }
+}
+
+.pf-c-page__main-section.appsrv-marketing--banner:before {
+  background-image: var(--appsrv-marketing--banner--before--BackgroundImage);
+  background-position-y: var(--appsrv-marketing--banner--before--BackgroundPositionY);
+  background-repeat: var(--appsrv-marketing--banner--before--BackgroundRepeat);
+  background-size: var(--appsrv-marketing--banner--before--BackgroundSize);
+  content: "";
+  grid-area: graphic;
+  margin-bottom: var(--appsrv-marketing--banner--before--Offset--bottom);
+  margin-right: var(--appsrv-marketing--banner--before--Offset--right);
+  margin-top: var(--appsrv-marketing--banner--before--Offset--top);
+  opacity: var(--appsrv-marketing--banner--before--Opacity);
+}
+
+.pf-c-page__main-section.appsrv-marketing--banner[class*="pf-m-dark-"].pf-c-page__main-section
+  .pf-c-button.pf-m-primary {
+  background-color: var(--pf-global--palette--blue-400);
+  color: var(--pf-global--primary-color-100);
+}
+
+.pf-c-page__main-section.appsrv-marketing--banner[class*="pf-m-dark-"].pf-c-page__main-section
+  .pf-c-button.pf-m-primary:active,
+.pf-c-page__main-section.appsrv-marketing--banner[class*="pf-m-dark-"].pf-c-page__main-section
+  .pf-c-button.pf-m-primary:focus,
+.pf-c-page__main-section.appsrv-marketing--banner[class*="pf-m-dark-"].pf-c-page__main-section
+  .pf-c-button.pf-m-primary:hover {
+  background-color: var(--pf-global--palette--blue-500);
+  color: var(--pf-global--primary-color-100);
+}
+
+.appsrv-marketing--banner--text-only {
+  font-size: var(--pf-global--FontSize--xl);
+  max-width: 800px;
+  text-align: center;
+}
+
+.appsrv-marketing--page-section--marketing,
+.appsrv-marketing--page-section--video {
+  --pf-c-page__main-section--PaddingTop: var(--pf-global--spacer--xl);
+  --pf-c-page__main-section--PaddingRight: var(--pf-global--spacer--lg);
+  --pf-c-page__main-section--PaddingBottom: var(--pf-global--spacer--xl);
+  --pf-c-page__main-section--PaddingLeft: var(--pf-global--spacer--lg);
+}
+
+.appsrv-marketing--page-section--marketing .pf-l-grid.pf-m-gutter,
+.appsrv-marketing--page-section--video .pf-l-grid.pf-m-gutter {
+  --pf-l-grid--m-gutter--GridGap: var(--pf-global--spacer--lg);
+}
+
+@media screen and (min-width: pf-global--breakpoint--md) {
+  .appsrv-marketing--page-section--marketing,
+  .appsrv-marketing--page-section--video {
+    --pf-c-page__main-section--PaddingRight: var(--pf-global--spacer--2xl);
+    --pf-c-page__main-section--PaddingLeft: var(--pf-global--spacer--2xl);
+  }
+}
+
+.appsrv-marketing--banner__tagline {
+  color: var(--appsrv-marketing--banner__tagline--Color);
+  font-size: var(--pf-global--FontSize--lg);
+  margin-bottom: var(--pf-global--spacer--lg);
+}
+
+.appsrv-marketing--video {
+  height: 0;
+  padding-bottom: 56.25% !important;
+  position: relative;
+}
+
+.appsrv-marketing--video iframe {
+  height: 100%;
+  left: 0;
+  position: absolute;
+  top: 0;
+  width: 100%;
+}
+
+.kafka-overview--page-section--marketing {
+  --pf-c-page__main-section--PaddingTop: 0;
+  --pf-c-page__main-section--PaddingRight: var(--pf-global--spacer--lg);
+  --pf-c-page__main-section--PaddingBottom: var(--pf-global--spacer--xl);
+  --pf-c-page__main-section--PaddingLeft: var(--pf-global--spacer--lg);
+}
+
+.appserv-devpreview {
+  height: 100%;
+}
+
+.appserv-devpreview__button {
+  --pf-c-button--m-link--Color: var(--pf-global--Color--dark-100) !important;
+  text-decoration: underline;
+}
+
+.pf-c-empty-state.pf-m-xl {
+  --pf-c-empty-state__content--MaxWidth: 624px;
+}
+
+tr.mas--ResponsiveTable__Tr--deleted > td {
+  color: var(--pf-global--Color--200);
+}
+
+.kafka-ui-form-group--readonly .pf-c-form-control[readonly] {
+  --pf-c-form-control--readonly--BackgroundColor: transparent;
+  --pf-c-form-control--readonly--focus--PaddingBottom: 0;
+  border: none;
+  padding: 0;
+}
+
+.kafka-ui-form-group--readonly .pf-c-form__group-label {
+  --pf-c-form__group-label--PaddingBottom: 0;
+}
+
+.mas--CreateKafkaInstance__sidebar .pf-c-content dl {
+  display: block;
+}
+
+.mas--CreateKafkaInstance__sidebar dt {
+  font-size: var(--pf-global--FontSize--sm);
+}
+
+.mas--CreateKafkaInstance__creationTimeAlert {
+  margin-top: var(--pf-global--spacer--md);
+}
+
+.mas--details__drawer--tab-content {
+  padding-bottom: var(--pf-global--spacer--lg);
+  padding-top: var(--pf-global--spacer--lg);
+}
+
+.mas-c-status.pf-l-split.pf-m-gutter > :not(:last-child) {
+  --pf-l-split--m-gutter--MarginRight: var(--pf-global--spacer--sm);
+}
+
+.mas-m-ready {
+  color: var(--pf-global--success-color--100);
+}
+
+.mas-m-degraded,
+.mas-m-ready {
+  font-size: var(--pf-global--icon--FontSize--md);
+}
+
+.mas-m-degraded {
+  color: var(--pf-global--warning-color--100);
+}
+
+.mas-m-deleting {
+  color: var(--pf-global--Color--200);
+}
+
+.mas-KafkaMessageBrowser-Toolbar {
+  z-index: 999;
+}
+
+.mas-KafkaMessageBrowser-Toolbar .pf-c-toolbar__content-section,
+.mas-KafkaMessageBrowser-Toolbar .pf-c-toolbar__group {
+  align-items: flex-start;
+}
+
+.pf-c-label.mas-m-solid {
+  --pf-c-label__content--before--BorderColor: transparent;
+  --pf-c-label--BackgroundColor: var(--pf-global--palette--black-600);
+  --pf-c-label__content--Color: var(--pf-global--palette--white);
+  align-items: center;
+  display: inline-flex;
+  font-weight: var(--pf-global--FontWeight--bold);
+  justify-content: center;
+  min-width: calc(
+    var(--pf-c-label--FontSize) * var(--pf-global--LineHeight--md) + var(--pf-c-label--PaddingTop) +
+      var(--pf-c-label--PaddingBottom)
+  );
+}
+
+.pf-c-label.mas-m-solid.pf-m-blue {
+  --pf-c-label--BackgroundColor: var(--pf-global--palette--blue-400);
+  --pf-c-label__content--Color: var(--pf-global--palette--white);
+  --pf-c-label__content--before--BorderColor: transparent;
+}
+
+.pf-c-label.mas-m-solid.pf-m-green {
+  --pf-c-label--BackgroundColor: var(--pf-global--palette--green-500);
+  --pf-c-label__content--Color: var(--pf-global--palette--white);
+  --pf-c-label__content--before--BorderColor: transparent;
+}
+
+.pf-c-label.mas-m-solid.pf-m-orange {
+  --pf-c-label--BackgroundColor: var(--pf-global--palette--orange-400);
+  --pf-c-label__content--Color: var(--pf-global--palette--white);
+  --pf-c-label__content--before--BorderColor: transparent;
+}
+
+.appserv-metrics-filterbytopic .pf-c-select__menu-wrapper {
+  max-width: min(100vw, 300px);
+}
+
+.appserv-metrics-filterbytopic .pf-c-select__menu-item {
+  word-wrap: normal;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  width: 100%;
+}
+
+#custom-offset-input {
+  width: 10rem;
+}
+
+.mas--ConsumerGroupResetOffset__formTitle {
+  padding-top: var(--pf-c-form--m-horizontal__group-label--md--PaddingTop);
+}
+
+.mas--ConsumerGroupResetOffset-form-group--readonly .pf-c-form-control[readonly] {
+  --pf-c-form-control--readonly--BackgroundColor: transparent;
+  --pf-c-form-control--readonly--focus--PaddingBottom: 0;
+  border: none;
+  padding: 0;
+}
+
+.mas--ConsumerGroupResetOffset-form-group--readonly .pf-c-form__group-label {
+  --pf-c-form__group-label--PaddingBottom: 0;
+}
+
+.consumer-group-drawer__top-label {
+  margin-bottom: 0 !important;
+}
+
+.consumer-group-drawer__title {
+  margin-top: 0 !important;
+}
+
+.consumer-group-drawer__drawer-content-body {
+  display: flex;
+  flex-direction: column;
+}
+
+.mas--settings__card {
+  max-width: 55rem;
+}
+
+.pf-u-color-200 {
+  color: var(--pf-global--Color--200) !important;
+}
+
+.pf-u-mb-lg {
+  margin-bottom: var(--pf-global--spacer--lg) !important;
+}
+.pf-u-ml-auto {
+  margin-left: auto !important;
+}
+
+.pf-u-ml-0 {
+  margin-left: 0 !important;
+}
+
+.pf-u-ml-xs {
+  margin-left: var(--pf-global--spacer--xs) !important;
+}
+
+.pf-u-ml-sm {
+  margin-left: var(--pf-global--spacer--sm) !important;
+}
+
+.pf-u-ml-md {
+  margin-left: var(--pf-global--spacer--md) !important;
+}
+
+.pf-u-ml-lg {
+  margin-left: var(--pf-global--spacer--lg) !important;
+}
+
+.pf-u-ml-xl {
+  margin-left: var(--pf-global--spacer--xl) !important;
+}
+
+.pf-u-ml-2xl {
+  margin-left: var(--pf-global--spacer--2xl) !important;
+}
+
+.pf-u-ml-3xl {
+  margin-left: var(--pf-global--spacer--3xl) !important;
+}
+
+.pf-u-ml-4xl {
+  margin-left: var(--pf-global--spacer--4xl) !important;
+}
+.pf-u-color-100 {
+  color: var(--pf-global--Color--100) !important;
+}
+
+.pf-u-color-200 {
+  color: var(--pf-global--Color--200) !important;
+}
+
+.pf-u-color-300 {
+  color: var(--pf-global--Color--300) !important;
+}
+
+.pf-u-color-400 {
+  color: var(--pf-global--Color--400) !important;
+}
+.chr-c-navigation__additional-links svg {
+  margin-left: var(--pf-global--spacer--sm);
+}
diff --git a/packages/serverless-logic-web-tools/static/resources/style.css b/packages/serverless-logic-web-tools/static/resources/style.css
index a75c5b5755..f25e834600 100644
--- a/packages/serverless-logic-web-tools/static/resources/style.css
+++ b/packages/serverless-logic-web-tools/static/resources/style.css
@@ -600,6 +600,9 @@ section.kie-tools--settings-tab {
 #editor-page-masthead-files-dropdown-toggle {
   padding-left: 0;
 }
+.kogito-tools-common--brand {
+  height: 28.6px;
+}
 
 .pf-c-expandable-section.plain .pf-c-expandable-section__toggle {
   color: black;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 11/27: NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1529)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit 1ffcadda8811af01ac6efadb4d95eafa9f922e17
Author: Fabrizio Antonangeli <fa...@gmail.com>
AuthorDate: Tue Mar 21 00:01:51 2023 +0100

    NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1529)
    
    Signed-off-by: dependabot[bot] <su...@github.com>
    Co-authored-by: Handreyrc <47...@users.noreply.github.com>
    Co-authored-by: Roger Martinez <ro...@gmail.com>
    Co-authored-by: Tiago Bento <15...@users.noreply.github.com>
    Co-authored-by: Kumar Aditya Raj <se...@gmail.com>
    Co-authored-by: Kirill Gaevskii <kg...@redhat.com>
    Co-authored-by: William Antônio Siqueira <wi...@gmail.com>
    Co-authored-by: Jaime Enriquez <ja...@inodesoft.com>
    Co-authored-by: Luiz João Motta <lu...@gmail.com>
    Co-authored-by: Zbyněk Drápela <61...@users.noreply.github.com>
    Co-authored-by: Manaswini Das <da...@gmail.com>
    Co-authored-by: Pere Fernández <pe...@users.noreply.github.com>
    Co-authored-by: Paulo Martins <pa...@gmail.com>
    Co-authored-by: Guilherme Caponetto <63...@users.noreply.github.com>
    Co-authored-by: Thiago Lugli <th...@users.noreply.github.com>
    Co-authored-by: Daniel J dos Santos <da...@users.noreply.github.com>
    Co-authored-by: Daniel J dos Santos <da...@ibm.com>
    Co-authored-by: Lubo Terifaj <lu...@gmail.com>
    Co-authored-by: dependabot[bot] <49...@users.noreply.github.com>
    Co-authored-by: Barbora Kapustova (Siskova) <ba...@users.noreply.github.com>
    Co-authored-by: Saravana Balaji Srinivasan <40...@users.noreply.github.com>
    Co-authored-by: Bai Xiaofeng <bx...@gmail.com>
    Co-authored-by: Kbowers <92...@users.noreply.github.com>
    Co-authored-by: Kennedy Bowers <ke...@ibm.com>
    Co-authored-by: Ajay Jaganathan <36...@users.noreply.github.com>
    Co-authored-by: Jan Stastny <st...@gmail.com>
    Co-authored-by: jstastny-cz <ja...@ibm.com>
    Co-authored-by: Tiago <ti...@gmail.com>
---
 .github/workflows/release_build.yml                |     4 +-
 .../base64png-editor-vscode-extension/package.json |     2 +-
 examples/base64png-editor/src/Base64PngEditor.tsx  |     6 +-
 examples/commit-message-validation-service/go.mod  |     8 +-
 examples/commit-message-validation-service/go.sum  |    15 +-
 .../todo-list-view-vscode-extension/package.json   |     2 +-
 examples/uniforms-patternfly/src/App.tsx           |     4 +-
 examples/webapp/src/App.tsx                        |     4 +-
 examples/webapp/src/Home.tsx                       |     3 +-
 .../src/Pages/Base64Png/Base64PngGallery.tsx       |     4 +-
 .../webapp/src/Pages/Base64Png/Base64PngPage.tsx   |     2 +-
 .../webapp/src/Pages/KogitoEditors/BpmnPage.tsx    |     2 +-
 .../webapp/src/Pages/KogitoEditors/DmnPage.tsx     |     2 +-
 .../webapp/src/Pages/KogitoEditors/Sidebar.tsx     |     3 +-
 .../Angular/PingPongAngularDivViewsPage.tsx        |     2 +-
 .../Angular/PingPongAngularIFrameViewsPage.tsx     |     2 +-
 .../PingPong/Mixed/PingPongMixedViewsPage.tsx      |     2 +-
 .../PingPong/React/PingPongReactDivViewsPage.tsx   |     2 +-
 .../React/PingPongReactIFrameViewsPage.tsx         |     2 +-
 .../webapp/src/Pages/PingPong/StatsSidebar.tsx     |     4 +-
 .../StandaloneEditors/DmnStandaloneEditorPage.tsx  |     2 +-
 .../SwfStandaloneDiagramOnlyEditorPage.tsx         |     2 +-
 .../StandaloneEditors/SwfStandaloneEditorPage.tsx  |     2 +-
 .../SwfStandaloneTextOnlyEditorPage.tsx            |     2 +-
 .../webapp/src/Pages/TodoList/TodoListViewPage.tsx |     4 +-
 .../boxed-expression-component/showcase/index.tsx  |     3 +-
 .../DecisionTableExpression/HitPolicySelector.tsx  |     2 +-
 .../EditExpressionMenu/DataTypeSelector.tsx        |     3 +-
 .../EditExpressionMenu/EditExpressionMenu.tsx      |     2 +-
 .../FunctionExpression/EditParameters.tsx          |     2 +-
 .../FunctionExpression/FunctionKindSelector.tsx    |     2 +-
 .../LiteralExpression/PMMLLiteralExpression.tsx    |     2 +-
 .../LogicTypeSelector/LogicTypeSelector.tsx        |     2 +-
 .../src/components/PopoverMenu/PopoverMenu.tsx     |     2 +-
 .../src/components/Table/TableHandler.tsx          |     2 +-
 .../src/components/Table/TableHandlerMenu.tsx      |     2 +-
 .../src/FilteredTable.tsx                          |     4 +-
 .../src/UniformsComponent.tsx                      |     2 +-
 .../src/VictoryChartComponent.tsx                  |     2 +-
 .../webpack.config.js                              |     4 +
 .../external/ExternalDataSetClientProvider.java    |    23 +-
 .../services/RuntimeDataSetClientServices.java     |     2 +-
 .../dashbuilder/displayer/DisplayerSettings.java   |     2 +-
 .../dataset/json/ExternalDataSetJSONParser.java    |    23 +-
 packages/eslint/.eslintrc.js                       |    21 +
 packages/i18n-common-dictionary/src/CommonI18n.ts  |     1 +
 packages/i18n-common-dictionary/src/locales/en.ts  |     1 +
 .../ImportJavaClasses/ImportJavaClassesWizard.tsx  |     5 +-
 .../ImportJavaClassesWizardFieldListTable.tsx      |     2 +-
 .../ImportJavaClassesWizardFirstStep.tsx           |    16 +-
 .../ImportJavaClassesWizardSecondStep.tsx          |     3 +-
 packages/kie-sandbox-image/README.md               |    85 +-
 packages/kn-plugin-workflow/env/index.js           |     2 +-
 packages/kn-plugin-workflow/go.mod                 |     2 +-
 packages/kn-plugin-workflow/go.sum                 |     4 +-
 packages/online-editor/build/defaultEnvJson.ts     |    11 +
 packages/online-editor/package.json                |     2 +
 .../src/accelerators/AcceleratorsApi.ts            |    41 +
 .../src/accelerators/AcceleratorsHooks.tsx         |   413 +
 .../src/authSessions/AuthSessionSelect.tsx         |     3 +-
 packages/online-editor/src/editor/EditorPage.tsx   |     2 +-
 .../online-editor/src/editor/EditorToolbar.tsx     |  2237 --
 .../Toolbar/Accelerators/AcceleratorIcon.tsx}      |    20 +-
 .../Toolbar/Accelerators/AcceleratorIndicator.tsx  |    63 +
 .../Toolbar/Accelerators/AcceleratorModal.tsx      |   125 +
 .../Toolbar/Accelerators/AcceleratorsDropdown.tsx  |   109 +
 .../src/editor/Toolbar/EditorToolbar.tsx           |   438 +
 .../Toolbar/EditorToolbarContextProvider.tsx       |   207 +
 .../src/editor/Toolbar/FileStatus.tsx              |   121 +
 .../src/editor/{ => Toolbar}/FileSwitcher.tsx      |   802 +-
 .../GitIntegration}/CreateGistOrSnippetModal.tsx   |    46 +-
 .../GitIntegration}/CreateGitRepositoryModal.tsx   |    35 +-
 .../GitIntegration/GitIntegrationAlerts.tsx        |   396 +
 .../GitIntegrationContextProvider.tsx              |   630 +
 .../GitIntegration}/LoadOrganizationsSelect.tsx    |    50 +-
 .../GitIntegration/PushToGitAlertActionLinks.tsx   |    90 +
 .../src/editor/Toolbar/KebabDropdown.tsx           |    46 +
 .../editor/{ => Toolbar}/NewFileDropdownMenu.tsx   |   106 +-
 .../editor/Toolbar/Share/DownloadDropdownGroup.tsx |   112 +
 .../editor/Toolbar/Share/EmbedDropdownGroup.tsx    |    63 +
 .../src/editor/{ => Toolbar/Share}/EmbedModal.tsx  |     4 +-
 .../src/editor/Toolbar/Share/GitDropdownGroup.tsx  |   161 +
 .../src/editor/Toolbar/SyncDropdownMenu.tsx        |   279 +
 .../src/editor/Toolbar/VsCodeDropdownMenu.tsx      |   160 +
 .../src/editor/Toolbar/Workspace/Hooks.tsx         |   154 +
 .../editor/Toolbar/Workspace/WorkspaceToolbar.tsx  |   177 +
 packages/online-editor/src/env/EnvJson.ts          |     2 +
 .../EditorEnvelopeLocatorFactory.ts                |    70 +-
 .../online-editor/src/filesList/FileDataList.tsx   |   139 +-
 packages/online-editor/src/home/HomePage.tsx       |    24 +-
 packages/online-editor/src/i18n/OnlineI18n.ts      |    28 +
 packages/online-editor/src/i18n/locales/en.ts      |    37 +-
 .../importFromUrl/ImportFromUrlHomePageCard.tsx    |     3 +-
 .../src/pageTemplate/OnlineEditorPage.tsx          |     3 +-
 .../components/GitStatusIndicatorActions.tsx       |   479 +
 .../src/workspace/components/PromiseModal.tsx      |    30 +-
 .../workspace/components/WorkspaceCommitModal.tsx  |    12 +-
 .../components/WorkspaceStatusIndicator.tsx        |   286 +-
 ...ontextProviderWithCustomCommitMessagesModal.tsx |    17 +-
 packages/online-editor/static/resources/style.css  |    70 +-
 .../it-tests/e2e/CreateNewFile.cy.ts               |     4 +-
 packages/serverless-logic-web-tools/package.json   |     2 +
 .../src/editor/EditorPage.tsx                      |    13 +-
 .../src/editor/EditorPageErrorPage.tsx             |     2 +-
 .../src/editor/FileSwitcher.tsx                    |    16 +-
 .../src/editor/NewFileDropdownMenu.tsx             |    20 +-
 .../src/editor/api/WebToolsSwfLanguageService.ts   |    23 +-
 .../src/homepage/breadcrumb/HomepageBreadcrumb.tsx |     2 +-
 .../src/homepage/pageTemplate/OnlineEditorPage.tsx |    15 +-
 .../src/homepage/uiNav/HomePageNav.tsx             |     2 +-
 .../KieSandboxExtendedServicesSettings.tsx         |     4 +-
 .../src/settings/github/GitHubSettings.tsx         |     5 +-
 .../src/settings/kafka/ApacheKafkaSettings.tsx     |     4 +-
 .../src/settings/openshift/OpenShiftSettings.tsx   |     4 +-
 .../serviceAccount/ServiceAccountSettings.tsx      |     4 +-
 .../serviceRegistry/ServiceRegistrySettings.tsx    |     4 +-
 .../src/settings/uiNav/SettingsPageNav.tsx         |     2 +-
 .../components/WorkspaceStatusIndicator.tsx        |     2 +-
 .../static/resources/style.css                     |     4 +
 .../common/stunner/sw/autolayout/AutoLayout.java   |   149 +-
 .../stunner/sw/resources/i18n/SWConstants.java     |    60 +
 .../sw/resources/i18n/SWConstants.properties       |    22 +
 .../stunner/sw/autolayout/AutoLayoutTest.java      |    13 +-
 .../sw/client/CanvasShortcutsControlImpl.java      |     4 +-
 .../common/stunner/sw/client/ShapeFactory.java     |     9 +-
 .../sw/client/shapes/CallbackStateShape.java       |    41 +-
 .../common/stunner/sw/client/shapes/EndShape.java  |     8 +-
 .../stunner/sw/client/shapes/EndShapeView.java     |     4 +-
 .../stunner/sw/client/shapes/EventStateShape.java  |    33 +-
 .../sw/client/shapes/ForEachStateShape.java        |    38 +-
 .../stunner/sw/client/shapes/HasActions.java       |    79 +
 .../stunner/sw/client/shapes/HasDataFilter.java    |    49 +
 .../stunner/sw/client/shapes/HasTranslation.java}  |    11 +-
 .../stunner/sw/client/shapes/InjectStateShape.java |    28 +-
 .../sw/client/shapes/OperationStateShape.java      |    44 +-
 .../sw/client/shapes/ParallelStateShape.java       |    30 +-
 .../sw/client/shapes/ServerlessWorkflowShape.java  |    25 +-
 .../stunner/sw/client/shapes/SleepStateShape.java  |    17 +-
 .../stunner/sw/client/shapes/StartShape.java       |     8 +-
 .../stunner/sw/client/shapes/StartShapeView.java   |     4 +-
 .../stunner/sw/client/shapes/StateShape.java       |    41 +-
 .../stunner/sw/client/shapes/StateShapeView.java   |    21 +-
 .../stunner/sw/client/shapes/SwitchStateShape.java |    30 +-
 .../stunner/sw/client/shapes/TransitionShape.java  |     4 +-
 .../sw/client/shapes/icons/BottomDepiction.java    |    63 +
 .../stunner/sw/client/shapes/icons/CornerIcon.java |    29 +-
 .../stunner/sw/client/shapes/icons/IconPath.java   |     3 +
 .../sw/client/shapes/icons/IconPosition.java       |     1 +
 .../stunner/sw/client/shapes/HasActionsTest.java   |   182 +
 .../sw/client/shapes/HasDataFilterTest.java        |   123 +
 .../client/shapes/HasTranslationGeneralTest.java   |    66 +
 .../stunner/sw/client/shapes/StateShapeTest.java   |    20 +-
 .../sw/client/selenium/SWEditorSeleniumIT.java     |   164 +-
 .../stunner/sw/client/selenium/LoanBroker.sw.json  |   215 +
 .../serverless-workflow-jq-expressions/README.md   |     1 +
 .../env/index.js}                                  |    15 +-
 .../jest.config.js}                                |    41 +-
 .../package.json                                   |    10 +-
 .../src/api/JqExpressionReadSchemas.ts}            |    13 +-
 .../src/api}/index.ts                              |    10 +-
 .../src/api/types.ts}                              |    13 +-
 .../src/impl/JqExpressionReadSchemasImpl.ts        |    89 +
 .../src/impl}/index.ts                             |     9 +-
 .../src/utils/JqBuiltInFunctions.ts                |   575 +
 .../src/utils}/index.ts                            |    10 +-
 .../src/utils/utils.ts}                            |    23 +-
 .../tests/JqExpressionReadSchemasImpl.test.ts      |    72 +
 .../tests/mockSchema.ts                            |    20 +
 .../tests/utils.test.ts}                           |    22 +-
 .../tsconfig.json                                  |     8 +
 .../package.json                                   |     1 +
 .../empty-workflow-completions.ts}                 |    21 +-
 .../src/assets/code-completions/index.ts           |     1 +
 .../src/channel/SwfLanguageService.ts              |    95 +-
 .../channel/SwfLanguageServiceCodeCompletion.ts    |   296 +-
 .../src/channel/SwfYamlLanguageService.ts          |    16 +-
 .../src/channel/types.ts                           |    14 +
 .../tests/SwfJqExpressionTestUtils.ts              |    80 +
 .../tests/SwfJsonLanguageService.test.ts           |   378 +-
 .../tests/SwfLanguageServiceConfigs.ts             |     8 +-
 .../tests/SwfYamlLanguageService.test.ts           |   301 +-
 .../SwfJsonLanguageService.test.ts.snap            | 20886 ++++++++++++++++++-
 .../SwfYamlLanguageService.test.ts.snap            | 17330 ++++++++++++++-
 .../tests/findNodesAtLocation.test.ts              |    14 +-
 .../tests/getNodeFormat.test.ts                    |     4 +-
 .../tests/matchNodeWithLocation.test.ts            |    15 +-
 .../tests/nodeUpUntilType.test.ts                  |     4 +-
 .../tests/refValidations.test.ts                   |     3 +
 .../tests/testUtils.ts                             |     1 -
 .../package.json                                   |     1 +
 .../src/api/types.ts                               |     3 +
 .../src/channel/parsers/impl/asyncapi/asyncapi.ts  |     1 -
 .../parsers/impl/camelRoutes/CamelRoutesParser.ts  |    30 +
 .../parsers/impl/camelRoutes/camelRoutes.ts        |    94 +
 .../src/channel/parsers/impl/camelRoutes/types.ts  |    52 +
 .../parsers/impl/jsonschema/JsonSchemaParser.ts}   |    16 +-
 .../channel/parsers/impl/jsonschema/jsonschema.ts  |    71 +
 .../src/channel/parsers/impl/openapi/openapi.ts    |    20 +-
 .../src/channel/parsers/index.ts                   |     2 +
 .../src/channel/parsers/parseApiContent.ts         |    15 +-
 .../parsers/camelRoutes/camelRoutes.test.ts        |    79 +
 .../tests/channel/parsers/examples/expression.json |    20 +
 .../channel/parsers/examples/numberToWords.yaml    |    22 +
 .../channel/parsers/examples/sendMessage.yaml      |     7 +
 .../channel/parsers/jsonschema/jsonschema.test.ts  |    62 +
 .../tests/channel/parsers/parseApiContent.test.ts  |     9 +-
 .../package.json                                   |     1 +
 .../getLanguageServiceChannelApi.ts                |    22 +
 .../dev-webapp/App.tsx                             |   108 +-
 .../dev-webapp/HistoryButtons.tsx                  |    72 +-
 .../channel/DevWebAppSwfLanguageService.ts}        |    23 +-
 .../channel/SwfLanguageServiceChannelApiImpl.ts    |    39 +
 .../channel/SwfTextEditorChannelApiImpl.ts         |   156 +
 .../serverless-workflow-text-editor/package.json   |     1 +
 .../textEditor/augmentation/completion/index.ts    |     4 +-
 .../expressions/types/list/AddListRowCommand.java  |     4 +-
 .../common/dmn/client/graph/DMNSizeHandler.java    |    41 +
 .../client/widgets/toolbar/DMNGraphProcessor.java  |   194 +-
 .../widgets/toolbar/DMNSugiyamaLayoutService.java  |    16 +-
 .../types/list/AddListRowCommandTest.java          |     4 +-
 .../dmn/client/graph/DMNSizeHandlerTest.java       |    75 +
 .../widgets/toolbar/DMNGraphProcessorTest.java     |   414 +-
 .../client/editor/AbstractDMNDiagramEditor.java    |     7 +-
 .../editor/AbstractDMNDiagramEditorTest.java       |     6 +-
 .../showcase/client/editor/DMNDiagramEditor.java   |     4 +-
 .../dmn13-expected/0082-feel-coercion.dmn          |  2061 +-
 .../dmn13-expected/0085-decision-services.dmn      |  2627 +--
 .../dmn13-expected/0088-no-decision-logic.dmn      |   485 +-
 .../graph/processing/layout/GraphProcessor.java    |    77 +
 .../graph/processing/layout/LayoutExecutor.java    |     3 +-
 .../graph/processing/layout/LayoutService.java     |     7 +
 .../{LayoutExecutor.java => SizeHandler.java}      |    12 +-
 .../layout/sugiyama/step04/VertexPositioning.java  |     8 +-
 .../client/components/layout/LayoutHelper.java     |     5 +-
 .../layout/OpenDiagramLayoutExecutor.java          |    32 +-
 .../components/layout/UndoableLayoutExecutor.java  |     3 +-
 .../client/components/layout/LayoutHelperTest.java |     4 +-
 .../layout/UndoableLayoutExecutorTest.java         |     6 +-
 .../processing/layout/sugiyama/LayeredGraph.java   |     3 +-
 .../layout/sugiyama/SugiyamaLayoutService.java     |   102 +-
 .../sugiyama/step04/DefaultVertexPositioning.java  |    83 +-
 .../graph/processing/layout/IntegrationTests.java  |     9 +-
 .../layout/sugiyama/SugiyamaLayoutServiceTest.java |     6 +-
 .../step04/DefaultVertexPositioningTest.java       |   206 +-
 .../converters/tostunner/DefinitionResolver.java   |    19 +
 .../processes/BaseRootProcessConverter.java        |     2 +-
 .../marshall/service/BPMNClientMarshalling.java    |     6 +-
 .../tostunner/DefinitionResolverTest.java          |    14 +
 packages/uniforms-patternfly/src/BaseForm.tsx      |     2 +-
 packages/unitables/src/Unitables.tsx               |     2 +-
 packages/vscode-extension-backend/package.json     |     2 +-
 packages/vscode-extension-bpmn-editor/package.json |     2 +-
 .../.mocharc.json                                  |     7 +
 .../CHANGELOG.md                                   |    13 +
 .../dashbuilder-editor-extension-smoke.test.ts     |    78 +
 .../it-tests/helpers/VSCodeTestHelper.ts           |   219 +
 .../dashbuilder/DashbuilderEditorTestHelper.ts     |    50 +
 .../DashbuilderTextEditorTestHelper.ts}            |    16 +-
 .../smoke-test/empty-dashbuilder-example.dash.yaml |     0
 .../smoke-test/simple-dashbuilder-example.dash.yml |    36 +
 .../it-tests/settings.json                         |     2 +-
 .../mocha-reporter-config.json                     |    15 +
 .../package.json                                   |    19 +-
 .../tsconfig.it-tests.json                         |    11 +
 packages/vscode-extension-dmn-editor/package.json  |     2 +-
 .../vscode-extension-kie-ba-bundle/package.json    |     2 +-
 .../vscode-extension-kogito-bundle/package.json    |     2 +-
 .../it-tests/settings.json                         |     1 +
 .../package.json                                   |     6 +-
 packages/vscode-extension-pmml-editor/package.json |     2 +-
 .../package.json                                   |     2 +-
 .../CHANGELOG.md                                   |    11 +
 .../emptyworkflow_autocompletion.sw.json           |     0
 .../emptyworkflow_autocompletion.sw.json.result    |    11 +
 ...orkflow-editor-extension-autocompletion.test.ts |    24 +-
 ...low-editor-extension-diagram-navigation.test.ts |     6 +-
 .../it-tests/settings.json                         |     1 +
 .../package.json                                   |    12 +-
 .../builtInVsCodeEditorSwfContributions.ts         |     3 +-
 .../src/extension/configuration.ts                 |    24 +
 .../fs/JqExpressionsReadSchemaFromFs.ts            |    62 +
 .../languageService/VsCodeSwfLanguageService.ts    |    55 +-
 .../SwfServiceCatalogSupportActions.ts             |    15 +-
 .../fs/FsWatchingServiceCatalogRelativeStore.ts    |   113 +-
 .../it-tests/settings.json                         |     1 +
 packages/vscode-extension-yard-editor/package.json |     6 +-
 .../src/context/WorkspacesContext.tsx              |    24 +-
 .../src/context/WorkspacesContextProvider.tsx      |    78 +-
 .../src/hooks/WorkspaceFileHooks.tsx               |     3 +
 .../workspaces-git-fs/src/hooks/WorkspaceHooks.tsx |    38 +-
 .../workspaces-git-fs/src/services/GitService.tsx  |    77 +-
 .../src/services/WorkspaceDescriptorService.tsx    |     5 -
 .../src/worker/WorkspacesWorkerApiImpl.ts          |   127 +-
 .../src/worker/api/WorkspaceBroadcastEvents.ts     |     4 +-
 .../src/worker/api/WorkspacesWorkerGitApi.ts       |    25 +-
 packages/yard-editor/src/editor/YardEditor.tsx     |     8 +-
 packages/yard-editor/src/uiEditor/YardUIEditor.tsx |    19 +-
 pnpm-lock.yaml                                     |   604 +-
 repo/graph.dot                                     |     6 +-
 repo/graph.json                                    |     9 +-
 300 files changed, 53517 insertions(+), 6607 deletions(-)

diff --git a/.github/workflows/release_build.yml b/.github/workflows/release_build.yml
index 9ff10c30c6..2007fdd061 100644
--- a/.github/workflows/release_build.yml
+++ b/.github/workflows/release_build.yml
@@ -184,7 +184,7 @@ jobs:
       KIE_SANDBOX__imageAccount: "kie-tools"
       KIE_SANDBOX__imageName: "kie-sandbox-image"
       KIE_SANDBOX__imageBuildTags: "latest ${{ inputs.tag }}"
-      ONLINE_EDITOR__buildInfo: ""
+      ONLINE_EDITOR__buildInfo: "${{ inputs.tag }}"
       ONLINE_EDITOR__kieSandboxExtendedServicesDownloadUrlLinux: "https://github.com/kiegroup/kie-tools/releases/download/${{ inputs.tag }}/kie_sandbox_extended_services_linux_${{ inputs.tag }}.tar.gz"
       ONLINE_EDITOR__kieSandboxExtendedServicesDownloadUrlMacOs: "https://github.com/kiegroup/kie-tools/releases/download/${{ inputs.tag }}/kie_sandbox_extended_services_macos_${{ inputs.tag }}.dmg"
       ONLINE_EDITOR__kieSandboxExtendedServicesDownloadUrlWindows: "https://github.com/kiegroup/kie-tools/releases/download/${{ inputs.tag }}/kie_sandbox_extended_services_windows_${{ inputs.tag }}.exe"
@@ -384,7 +384,7 @@ jobs:
 
   online_editor:
     env:
-      ONLINE_EDITOR__buildInfo: ""
+      ONLINE_EDITOR__buildInfo: "${{ inputs.tag }}"
       ONLINE_EDITOR__kieSandboxExtendedServicesDownloadUrlLinux: "https://github.com/kiegroup/kie-tools/releases/download/${{ inputs.tag }}/kie_sandbox_extended_services_linux_${{ inputs.tag }}.tar.gz"
       ONLINE_EDITOR__kieSandboxExtendedServicesDownloadUrlMacOs: "https://github.com/kiegroup/kie-tools/releases/download/${{ inputs.tag }}/kie_sandbox_extended_services_macos_${{ inputs.tag }}.dmg"
       ONLINE_EDITOR__kieSandboxExtendedServicesDownloadUrlWindows: "https://github.com/kiegroup/kie-tools/releases/download/${{ inputs.tag }}/kie_sandbox_extended_services_windows_${{ inputs.tag }}.exe"
diff --git a/examples/base64png-editor-vscode-extension/package.json b/examples/base64png-editor-vscode-extension/package.json
index a0e10c5119..adfdd211be 100644
--- a/examples/base64png-editor-vscode-extension/package.json
+++ b/examples/base64png-editor-vscode-extension/package.json
@@ -35,7 +35,7 @@
     "@kie-tools/root-env": "workspace:*",
     "@kie-tools/tsconfig": "workspace:*",
     "@types/vscode": "^1.66.0",
-    "@vscode/vsce": "^2.15.0",
+    "@vscode/vsce": "^2.18.0",
     "rimraf": "^3.0.2",
     "typescript": "^4.4.2",
     "webpack": "^5.36.2",
diff --git a/examples/base64png-editor/src/Base64PngEditor.tsx b/examples/base64png-editor/src/Base64PngEditor.tsx
index 426567c628..cc9efd7c55 100644
--- a/examples/base64png-editor/src/Base64PngEditor.tsx
+++ b/examples/base64png-editor/src/Base64PngEditor.tsx
@@ -17,7 +17,11 @@
 import * as React from "react";
 import { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from "react";
 import { EditorApi, KogitoEditorEnvelopeContextType } from "@kie-tools-core/editor/dist/api";
-import { EmptyState, EmptyStateIcon, Nav, NavItem, NavList, Page, Switch, Title } from "@patternfly/react-core";
+import { EmptyState, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
+import { Nav, NavItem, NavList } from "@patternfly/react-core/dist/js/components/Nav";
+import { Page } from "@patternfly/react-core/dist/js/components/Page";
+import { Switch } from "@patternfly/react-core/dist/js/components/Switch";
+import { Title } from "@patternfly/react-core/dist/js/components/Title";
 import { DEFAULT_RECT } from "@kie-tools-core/guided-tour/dist/api";
 import CubesIcon from "@patternfly/react-icons/dist/js/icons/cubes-icon";
 import "./styles.scss";
diff --git a/examples/commit-message-validation-service/go.mod b/examples/commit-message-validation-service/go.mod
index d13caea2e9..6a934889d1 100644
--- a/examples/commit-message-validation-service/go.mod
+++ b/examples/commit-message-validation-service/go.mod
@@ -20,10 +20,10 @@ require (
 	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/pelletier/go-toml/v2 v2.0.6 // indirect
 	github.com/ugorji/go/codec v1.2.7 // indirect
-	golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 // indirect
-	golang.org/x/net v0.4.0 // indirect
-	golang.org/x/sys v0.3.0 // indirect
-	golang.org/x/text v0.5.0 // indirect
+	golang.org/x/crypto v0.1.0 // indirect
+	golang.org/x/net v0.7.0 // indirect
+	golang.org/x/sys v0.5.0 // indirect
+	golang.org/x/text v0.7.0 // indirect
 	google.golang.org/protobuf v1.28.1 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 )
diff --git a/examples/commit-message-validation-service/go.sum b/examples/commit-message-validation-service/go.sum
index 5e818b70f5..0270bb7889 100644
--- a/examples/commit-message-validation-service/go.sum
+++ b/examples/commit-message-validation-service/go.sum
@@ -67,26 +67,27 @@ github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6
 github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0=
 github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY=
 golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 h1:0es+/5331RGQPcXlMfP+WrnIIS6dNnNRe0WB02W0F4M=
 golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU=
+golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU=
-golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
+golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
+golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=
-golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM=
-golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
diff --git a/examples/todo-list-view-vscode-extension/package.json b/examples/todo-list-view-vscode-extension/package.json
index f22dfa6049..e2c73d5e44 100644
--- a/examples/todo-list-view-vscode-extension/package.json
+++ b/examples/todo-list-view-vscode-extension/package.json
@@ -33,7 +33,7 @@
     "@kie-tools/root-env": "workspace:*",
     "@kie-tools/tsconfig": "workspace:*",
     "@types/vscode": "^1.66.0",
-    "@vscode/vsce": "^2.15.0",
+    "@vscode/vsce": "^2.18.0",
     "rimraf": "^3.0.2",
     "typescript": "^4.4.2",
     "webpack": "^5.36.2",
diff --git a/examples/uniforms-patternfly/src/App.tsx b/examples/uniforms-patternfly/src/App.tsx
index 1edc8c61c0..fd21a4408e 100644
--- a/examples/uniforms-patternfly/src/App.tsx
+++ b/examples/uniforms-patternfly/src/App.tsx
@@ -18,7 +18,9 @@ import "@patternfly/react-core/dist/styles/base.css";
 import * as React from "react";
 import "../static/resources/styles.css";
 import { useState } from "react";
-import { Brand, Nav, NavItem, NavList, Page, PageHeader } from "@patternfly/react-core";
+import { Brand } from "@patternfly/react-core/dist/js/components/Brand";
+import { Nav, NavItem, NavList } from "@patternfly/react-core/dist/js/components/Nav";
+import { Page, PageHeader } from "@patternfly/react-core/dist/js/components/Page";
 import { Form } from "./Form";
 
 export enum SchemaType {
diff --git a/examples/webapp/src/App.tsx b/examples/webapp/src/App.tsx
index ddf0de2c78..5c841d4085 100644
--- a/examples/webapp/src/App.tsx
+++ b/examples/webapp/src/App.tsx
@@ -17,7 +17,9 @@
 import "@patternfly/react-core/dist/styles/base.css";
 import * as React from "react";
 import { useEffect, useState } from "react";
-import { Brand, Nav, NavItem, NavList, Page, PageHeader } from "@patternfly/react-core";
+import { Brand } from "@patternfly/react-core/dist/js/components/Brand";
+import { Nav, NavItem, NavList } from "@patternfly/react-core/dist/js/components/Nav";
+import { Page, PageHeader } from "@patternfly/react-core/dist/js/components/Page";
 import { HashRouter as Router, Link, Route, Switch } from "react-router-dom";
 import { Base64PngPage } from "./Pages/Base64Png/Base64PngPage";
 import { BpmnPage } from "./Pages/KogitoEditors/BpmnPage";
diff --git a/examples/webapp/src/Home.tsx b/examples/webapp/src/Home.tsx
index 76f394f426..7c5ba9f840 100644
--- a/examples/webapp/src/Home.tsx
+++ b/examples/webapp/src/Home.tsx
@@ -15,7 +15,8 @@
  */
 
 import * as React from "react";
-import { Page, PageSection, Text, TextContent } from "@patternfly/react-core";
+import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
+import { Text, TextContent } from "@patternfly/react-core/dist/js/components/Text";
 
 export function Home() {
   return (
diff --git a/examples/webapp/src/Pages/Base64Png/Base64PngGallery.tsx b/examples/webapp/src/Pages/Base64Png/Base64PngGallery.tsx
index c1b42ff7ce..585cffcdd2 100644
--- a/examples/webapp/src/Pages/Base64Png/Base64PngGallery.tsx
+++ b/examples/webapp/src/Pages/Base64Png/Base64PngGallery.tsx
@@ -16,7 +16,9 @@
 
 import * as React from "react";
 import { useCallback, useEffect, useState } from "react";
-import { Nav, NavItem, Title, Card, NavList } from "@patternfly/react-core";
+import { Nav, NavItem, NavList } from "@patternfly/react-core/dist/js/components/Nav";
+import { Title } from "@patternfly/react-core/dist/js/components/Title";
+import { Card } from "@patternfly/react-core/dist/js/components/Card";
 import { EmbeddedEditorFile } from "@kie-tools-core/editor/dist/channel";
 
 const samplePaths = [
diff --git a/examples/webapp/src/Pages/Base64Png/Base64PngPage.tsx b/examples/webapp/src/Pages/Base64Png/Base64PngPage.tsx
index dc745abdf9..4548b4562b 100644
--- a/examples/webapp/src/Pages/Base64Png/Base64PngPage.tsx
+++ b/examples/webapp/src/Pages/Base64Png/Base64PngPage.tsx
@@ -18,7 +18,7 @@ import { ChannelType, EnvelopeContentType } from "@kie-tools-core/editor/dist/ap
 import * as React from "react";
 import { EditorEnvelopeLocator, EnvelopeMapping } from "@kie-tools-core/editor/dist/api";
 import { useMemo, useState } from "react";
-import { Page } from "@patternfly/react-core";
+import { Page } from "@patternfly/react-core/dist/js/components/Page";
 import { EmbeddedEditor } from "@kie-tools-core/editor/dist/embedded";
 import { EmbeddedEditorFile } from "@kie-tools-core/editor/dist/channel";
 import { Base64PngGallery } from "./Base64PngGallery";
diff --git a/examples/webapp/src/Pages/KogitoEditors/BpmnPage.tsx b/examples/webapp/src/Pages/KogitoEditors/BpmnPage.tsx
index a38503343d..d9750f9790 100644
--- a/examples/webapp/src/Pages/KogitoEditors/BpmnPage.tsx
+++ b/examples/webapp/src/Pages/KogitoEditors/BpmnPage.tsx
@@ -18,7 +18,7 @@ import { ChannelType, EnvelopeContentType } from "@kie-tools-core/editor/dist/ap
 import * as React from "react";
 import { EditorEnvelopeLocator, EnvelopeMapping } from "@kie-tools-core/editor/dist/api";
 import { useMemo, useState } from "react";
-import { Page } from "@patternfly/react-core";
+import { Page } from "@patternfly/react-core/dist/js/components/Page";
 import { EmbeddedEditor, useEditorRef } from "@kie-tools-core/editor/dist/embedded";
 import { EmbeddedEditorFile } from "@kie-tools-core/editor/dist/channel";
 import { Sidebar } from "./Sidebar";
diff --git a/examples/webapp/src/Pages/KogitoEditors/DmnPage.tsx b/examples/webapp/src/Pages/KogitoEditors/DmnPage.tsx
index ba228d153d..0629922dd7 100644
--- a/examples/webapp/src/Pages/KogitoEditors/DmnPage.tsx
+++ b/examples/webapp/src/Pages/KogitoEditors/DmnPage.tsx
@@ -18,7 +18,7 @@ import { ChannelType, EnvelopeContentType } from "@kie-tools-core/editor/dist/ap
 import * as React from "react";
 import { EditorEnvelopeLocator, EnvelopeMapping } from "@kie-tools-core/editor/dist/api";
 import { useMemo, useState } from "react";
-import { Page } from "@patternfly/react-core";
+import { Page } from "@patternfly/react-core/dist/js/components/Page";
 import { EmbeddedEditor, useEditorRef } from "@kie-tools-core/editor/dist/embedded";
 import { EmbeddedEditorFile } from "@kie-tools-core/editor/dist/channel";
 import { Sidebar } from "./Sidebar";
diff --git a/examples/webapp/src/Pages/KogitoEditors/Sidebar.tsx b/examples/webapp/src/Pages/KogitoEditors/Sidebar.tsx
index 601890e738..136add7b14 100644
--- a/examples/webapp/src/Pages/KogitoEditors/Sidebar.tsx
+++ b/examples/webapp/src/Pages/KogitoEditors/Sidebar.tsx
@@ -17,7 +17,8 @@
 import * as React from "react";
 import { EditorEnvelopeLocator } from "@kie-tools-core/editor/dist/api";
 import { useCallback, useRef, useState } from "react";
-import { Nav, NavItem, NavList, TextInput } from "@patternfly/react-core";
+import { Nav, NavItem, NavList } from "@patternfly/react-core/dist/js/components/Nav";
+import { TextInput } from "@patternfly/react-core/dist/js/components/TextInput";
 import { EmbeddedEditorRef, useDirtyState } from "@kie-tools-core/editor/dist/embedded";
 import { EmbeddedEditorFile } from "@kie-tools-core/editor/dist/channel";
 
diff --git a/examples/webapp/src/Pages/PingPong/Angular/PingPongAngularDivViewsPage.tsx b/examples/webapp/src/Pages/PingPong/Angular/PingPongAngularDivViewsPage.tsx
index bee3e610af..270a1a09e9 100644
--- a/examples/webapp/src/Pages/PingPong/Angular/PingPongAngularDivViewsPage.tsx
+++ b/examples/webapp/src/Pages/PingPong/Angular/PingPongAngularDivViewsPage.tsx
@@ -16,7 +16,7 @@
 
 import * as React from "react";
 import { useMemo, useRef } from "react";
-import { Page, PageSection } from "@patternfly/react-core";
+import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
 import { EmbeddedDivPingPong } from "@kie-tools-examples/ping-pong-view/dist/embedded";
 import { StatsSidebar } from "../StatsSidebar";
 import { pingPongEnvelopViewRenderDiv } from "@kie-tools-examples/ping-pong-view-angular/dist/wc/lib";
diff --git a/examples/webapp/src/Pages/PingPong/Angular/PingPongAngularIFrameViewsPage.tsx b/examples/webapp/src/Pages/PingPong/Angular/PingPongAngularIFrameViewsPage.tsx
index 46f4d709b1..79081b24f5 100644
--- a/examples/webapp/src/Pages/PingPong/Angular/PingPongAngularIFrameViewsPage.tsx
+++ b/examples/webapp/src/Pages/PingPong/Angular/PingPongAngularIFrameViewsPage.tsx
@@ -16,7 +16,7 @@
 
 import * as React from "react";
 import { useMemo, useRef } from "react";
-import { Page, PageSection } from "@patternfly/react-core";
+import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
 import { EmbeddedIFramePingPong } from "@kie-tools-examples/ping-pong-view/dist/embedded";
 import { PingPongApi } from "@kie-tools-examples/ping-pong-view/dist/api";
 import { StatsSidebar } from "../StatsSidebar";
diff --git a/examples/webapp/src/Pages/PingPong/Mixed/PingPongMixedViewsPage.tsx b/examples/webapp/src/Pages/PingPong/Mixed/PingPongMixedViewsPage.tsx
index 4a4ce9b9e5..8e8a40937b 100644
--- a/examples/webapp/src/Pages/PingPong/Mixed/PingPongMixedViewsPage.tsx
+++ b/examples/webapp/src/Pages/PingPong/Mixed/PingPongMixedViewsPage.tsx
@@ -16,7 +16,7 @@
 
 import * as React from "react";
 import { useMemo, useRef } from "react";
-import { Page, PageSection } from "@patternfly/react-core";
+import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
 import { EmbeddedDivPingPong, EmbeddedIFramePingPong } from "@kie-tools-examples/ping-pong-view/dist/embedded";
 import { PingPongApi } from "@kie-tools-examples/ping-pong-view/dist/api";
 import { StatsSidebar } from "../StatsSidebar";
diff --git a/examples/webapp/src/Pages/PingPong/React/PingPongReactDivViewsPage.tsx b/examples/webapp/src/Pages/PingPong/React/PingPongReactDivViewsPage.tsx
index c57701d3e6..26e2de395b 100644
--- a/examples/webapp/src/Pages/PingPong/React/PingPongReactDivViewsPage.tsx
+++ b/examples/webapp/src/Pages/PingPong/React/PingPongReactDivViewsPage.tsx
@@ -16,7 +16,7 @@
 
 import * as React from "react";
 import { useMemo, useRef } from "react";
-import { Page, PageSection } from "@patternfly/react-core";
+import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
 import { EmbeddedDivPingPong } from "@kie-tools-examples/ping-pong-view/dist/embedded";
 import { PingPongApi } from "@kie-tools-examples/ping-pong-view/dist/api";
 import { pingPongEnvelopViewRenderDiv } from "@kie-tools-examples/ping-pong-view-react";
diff --git a/examples/webapp/src/Pages/PingPong/React/PingPongReactIFrameViewsPage.tsx b/examples/webapp/src/Pages/PingPong/React/PingPongReactIFrameViewsPage.tsx
index 172377dd90..e87b24be16 100644
--- a/examples/webapp/src/Pages/PingPong/React/PingPongReactIFrameViewsPage.tsx
+++ b/examples/webapp/src/Pages/PingPong/React/PingPongReactIFrameViewsPage.tsx
@@ -16,7 +16,7 @@
 
 import * as React from "react";
 import { useMemo, useRef } from "react";
-import { Page, PageSection } from "@patternfly/react-core";
+import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
 import { EmbeddedIFramePingPong } from "@kie-tools-examples/ping-pong-view/dist/embedded";
 import { PingPongApi } from "@kie-tools-examples/ping-pong-view/dist/api";
 import { StatsSidebar } from "../StatsSidebar";
diff --git a/examples/webapp/src/Pages/PingPong/StatsSidebar.tsx b/examples/webapp/src/Pages/PingPong/StatsSidebar.tsx
index faf0d7c3eb..9bb3db22c7 100644
--- a/examples/webapp/src/Pages/PingPong/StatsSidebar.tsx
+++ b/examples/webapp/src/Pages/PingPong/StatsSidebar.tsx
@@ -16,7 +16,9 @@
 
 import * as React from "react";
 import { useState, useEffect } from "react";
-import { Label, Nav, NavItem, NavList, Title } from "@patternfly/react-core";
+import { Label } from "@patternfly/react-core/dist/js/components/Label";
+import { Nav, NavItem, NavList } from "@patternfly/react-core/dist/js/components/Nav";
+import { Title } from "@patternfly/react-core/dist/js/components/Title";
 
 interface Props {
   lastPing: string;
diff --git a/examples/webapp/src/Pages/StandaloneEditors/DmnStandaloneEditorPage.tsx b/examples/webapp/src/Pages/StandaloneEditors/DmnStandaloneEditorPage.tsx
index 346057e875..ee3530897b 100644
--- a/examples/webapp/src/Pages/StandaloneEditors/DmnStandaloneEditorPage.tsx
+++ b/examples/webapp/src/Pages/StandaloneEditors/DmnStandaloneEditorPage.tsx
@@ -16,7 +16,7 @@
 
 import * as React from "react";
 import { useEffect, useRef } from "react";
-import { Page } from "@patternfly/react-core";
+import { Page } from "@patternfly/react-core/dist/js/components/Page";
 import * as DmnEditor from "@kie-tools/kie-editors-standalone/dist/dmn";
 
 export function DmnStandaloneEditorPage() {
diff --git a/examples/webapp/src/Pages/StandaloneEditors/SwfStandaloneDiagramOnlyEditorPage.tsx b/examples/webapp/src/Pages/StandaloneEditors/SwfStandaloneDiagramOnlyEditorPage.tsx
index 2fad41e470..67412f63c0 100644
--- a/examples/webapp/src/Pages/StandaloneEditors/SwfStandaloneDiagramOnlyEditorPage.tsx
+++ b/examples/webapp/src/Pages/StandaloneEditors/SwfStandaloneDiagramOnlyEditorPage.tsx
@@ -16,7 +16,7 @@
 
 import * as React from "react";
 import { useEffect, useRef, useState, useCallback } from "react";
-import { Page, PageSection } from "@patternfly/react-core";
+import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
 import * as SwfEditor from "@kie-tools/serverless-workflow-standalone-editor/dist/swf";
 import { ServerlessWorkflowEmptyState } from "./SwfEditorEmptyState";
 import { StandaloneEditorApi } from "@kie-tools/serverless-workflow-standalone-editor/dist/common/Editor";
diff --git a/examples/webapp/src/Pages/StandaloneEditors/SwfStandaloneEditorPage.tsx b/examples/webapp/src/Pages/StandaloneEditors/SwfStandaloneEditorPage.tsx
index 856491dfd2..13ea211147 100644
--- a/examples/webapp/src/Pages/StandaloneEditors/SwfStandaloneEditorPage.tsx
+++ b/examples/webapp/src/Pages/StandaloneEditors/SwfStandaloneEditorPage.tsx
@@ -16,7 +16,7 @@
 
 import * as React from "react";
 import { useEffect, useRef, useState, useCallback } from "react";
-import { Page, PageSection } from "@patternfly/react-core";
+import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
 import * as SwfEditor from "@kie-tools/serverless-workflow-standalone-editor/dist/swf";
 import { ServerlessWorkflowEmptyState } from "./SwfEditorEmptyState";
 import {
diff --git a/examples/webapp/src/Pages/StandaloneEditors/SwfStandaloneTextOnlyEditorPage.tsx b/examples/webapp/src/Pages/StandaloneEditors/SwfStandaloneTextOnlyEditorPage.tsx
index 9d579c69e0..773bd86f94 100644
--- a/examples/webapp/src/Pages/StandaloneEditors/SwfStandaloneTextOnlyEditorPage.tsx
+++ b/examples/webapp/src/Pages/StandaloneEditors/SwfStandaloneTextOnlyEditorPage.tsx
@@ -16,7 +16,7 @@
 
 import * as React from "react";
 import { useEffect, useRef, useState, useCallback } from "react";
-import { Page, PageSection } from "@patternfly/react-core";
+import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
 import * as SwfEditor from "@kie-tools/serverless-workflow-standalone-editor/dist/swf";
 import { ServerlessWorkflowEmptyState } from "./SwfEditorEmptyState";
 import {
diff --git a/examples/webapp/src/Pages/TodoList/TodoListViewPage.tsx b/examples/webapp/src/Pages/TodoList/TodoListViewPage.tsx
index d625f7d32b..8d23304ead 100644
--- a/examples/webapp/src/Pages/TodoList/TodoListViewPage.tsx
+++ b/examples/webapp/src/Pages/TodoList/TodoListViewPage.tsx
@@ -16,7 +16,9 @@
 
 import * as React from "react";
 import { useCallback, useMemo, useRef, useState } from "react";
-import { Nav, NavItem, NavList, Page, PageSection, Title } from "@patternfly/react-core";
+import { Nav, NavItem, NavList } from "@patternfly/react-core/dist/js/components/Nav";
+import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
+import { Title } from "@patternfly/react-core/dist/js/components/Title";
 import { EmbeddedTodoList, EmbeddedTodoListRef } from "@kie-tools-examples/todo-list-view/dist/embedded";
 import { useStateAsSharedValue } from "@kie-tools-core/envelope-bus/dist/hooks";
 
diff --git a/packages/boxed-expression-component/showcase/index.tsx b/packages/boxed-expression-component/showcase/index.tsx
index c4dd801878..c11fcebdbb 100644
--- a/packages/boxed-expression-component/showcase/index.tsx
+++ b/packages/boxed-expression-component/showcase/index.tsx
@@ -32,7 +32,8 @@ import {
   RelationProps,
 } from "../src/api";
 import { BoxedExpressionEditor } from "../src/components";
-import { Button, Modal } from "@patternfly/react-core";
+import { Button } from "@patternfly/react-core/dist/js/components/Button";
+import { Modal } from "@patternfly/react-core/dist/js/components/Modal";
 import { PenIcon } from "@patternfly/react-icons/dist/js/icons/pen-icon";
 import "../src/components/BoxedExpressionEditor/base-no-reset-wrapped.css";
 import ReactJson from "react-json-view";
diff --git a/packages/boxed-expression-component/src/components/DecisionTableExpression/HitPolicySelector.tsx b/packages/boxed-expression-component/src/components/DecisionTableExpression/HitPolicySelector.tsx
index 9eeefa5f13..960032b464 100644
--- a/packages/boxed-expression-component/src/components/DecisionTableExpression/HitPolicySelector.tsx
+++ b/packages/boxed-expression-component/src/components/DecisionTableExpression/HitPolicySelector.tsx
@@ -19,7 +19,7 @@ import { BuiltinAggregation, getEnumKeyByEnumValue, HitPolicy } from "../../api"
 import * as React from "react";
 import { useCallback, useState } from "react";
 import { PopoverMenu } from "../PopoverMenu";
-import { Select, SelectOption, SelectVariant } from "@patternfly/react-core";
+import { Select, SelectOption, SelectVariant } from "@patternfly/react-core/dist/js/components/Select";
 import * as _ from "lodash";
 import { useBoxedExpressionEditorI18n } from "../../i18n";
 import { useBoxedExpression } from "../../context";
diff --git a/packages/boxed-expression-component/src/components/EditExpressionMenu/DataTypeSelector.tsx b/packages/boxed-expression-component/src/components/EditExpressionMenu/DataTypeSelector.tsx
index 4ede8db56b..f237a194b7 100644
--- a/packages/boxed-expression-component/src/components/EditExpressionMenu/DataTypeSelector.tsx
+++ b/packages/boxed-expression-component/src/components/EditExpressionMenu/DataTypeSelector.tsx
@@ -14,7 +14,8 @@
  * limitations under the License.
  */
 
-import { Divider, Select, SelectGroup, SelectOption, SelectVariant } from "@patternfly/react-core";
+import { Divider } from "@patternfly/react-core/dist/js/components/Divider";
+import { Select, SelectGroup, SelectOption, SelectVariant } from "@patternfly/react-core/dist/js/components/Select";
 import * as React from "react";
 import { useCallback, useState, useRef, useEffect } from "react";
 import { useBoxedExpressionEditorI18n } from "../../i18n";
diff --git a/packages/boxed-expression-component/src/components/EditExpressionMenu/EditExpressionMenu.tsx b/packages/boxed-expression-component/src/components/EditExpressionMenu/EditExpressionMenu.tsx
index ce01ea8a7e..3f073718fc 100644
--- a/packages/boxed-expression-component/src/components/EditExpressionMenu/EditExpressionMenu.tsx
+++ b/packages/boxed-expression-component/src/components/EditExpressionMenu/EditExpressionMenu.tsx
@@ -23,7 +23,7 @@ import { DataType, ExpressionProps } from "../../api";
 import { useBoxedExpression } from "../../context";
 import { DataTypeSelector } from "./DataTypeSelector";
 import { CogIcon } from "@patternfly/react-icons/dist/js/icons/cog-icon";
-import { Button } from "@patternfly/react-core";
+import { Button } from "@patternfly/react-core/dist/js/components/Button";
 import { NavigationKeysUtils } from "../common";
 
 export interface EditExpressionMenuProps {
diff --git a/packages/boxed-expression-component/src/components/FunctionExpression/EditParameters.tsx b/packages/boxed-expression-component/src/components/FunctionExpression/EditParameters.tsx
index 3cad24c345..9afc481ebf 100644
--- a/packages/boxed-expression-component/src/components/FunctionExpression/EditParameters.tsx
+++ b/packages/boxed-expression-component/src/components/FunctionExpression/EditParameters.tsx
@@ -17,7 +17,7 @@
 import "./EditParameters.css";
 import * as _ from "lodash";
 import { DataTypeSelector } from "../EditExpressionMenu";
-import { Button } from "@patternfly/react-core";
+import { Button } from "@patternfly/react-core/dist/js/components/Button";
 import { OutlinedTrashAltIcon } from "@patternfly/react-icons/dist/js/icons/outlined-trash-alt-icon";
 import * as React from "react";
 import { ChangeEvent, useCallback } from "react";
diff --git a/packages/boxed-expression-component/src/components/FunctionExpression/FunctionKindSelector.tsx b/packages/boxed-expression-component/src/components/FunctionExpression/FunctionKindSelector.tsx
index ca42bf5123..b1febab4ba 100644
--- a/packages/boxed-expression-component/src/components/FunctionExpression/FunctionKindSelector.tsx
+++ b/packages/boxed-expression-component/src/components/FunctionExpression/FunctionKindSelector.tsx
@@ -15,7 +15,7 @@
  */
 
 import { PopoverMenu } from "../PopoverMenu";
-import { Menu, MenuItem, MenuList } from "@patternfly/react-core";
+import { Menu, MenuItem, MenuList } from "@patternfly/react-core/dist/js/components/Menu";
 import * as _ from "lodash";
 import * as React from "react";
 import { useCallback } from "react";
diff --git a/packages/boxed-expression-component/src/components/LiteralExpression/PMMLLiteralExpression.tsx b/packages/boxed-expression-component/src/components/LiteralExpression/PMMLLiteralExpression.tsx
index 35cfd1365d..972acd3517 100644
--- a/packages/boxed-expression-component/src/components/LiteralExpression/PMMLLiteralExpression.tsx
+++ b/packages/boxed-expression-component/src/components/LiteralExpression/PMMLLiteralExpression.tsx
@@ -18,7 +18,7 @@ import "./PMMLLiteralExpression.css";
 import * as React from "react";
 import { useCallback, useRef, useState } from "react";
 import { PMMLLiteralExpressionProps } from "../../api";
-import { Select, SelectOption, SelectVariant } from "@patternfly/react-core";
+import { Select, SelectOption, SelectVariant } from "@patternfly/react-core/dist/js/components/Select";
 import * as _ from "lodash";
 import { useBoxedExpression } from "../../context";
 
diff --git a/packages/boxed-expression-component/src/components/LogicTypeSelector/LogicTypeSelector.tsx b/packages/boxed-expression-component/src/components/LogicTypeSelector/LogicTypeSelector.tsx
index 3e8345c410..529b7b12c6 100644
--- a/packages/boxed-expression-component/src/components/LogicTypeSelector/LogicTypeSelector.tsx
+++ b/packages/boxed-expression-component/src/components/LogicTypeSelector/LogicTypeSelector.tsx
@@ -37,7 +37,7 @@ import { RelationExpression } from "../RelationExpression";
 import { ContextExpression } from "../ContextExpression";
 import { useBoxedExpressionEditorI18n } from "../../i18n";
 import { PopoverMenu } from "../PopoverMenu";
-import { Menu, MenuGroup, MenuItem, MenuList } from "@patternfly/react-core";
+import { Menu, MenuGroup, MenuItem, MenuList } from "@patternfly/react-core/dist/js/components/Menu";
 import * as _ from "lodash";
 import { useContextMenuHandler } from "../../hooks";
 import { useBoxedExpression } from "../../context";
diff --git a/packages/boxed-expression-component/src/components/PopoverMenu/PopoverMenu.tsx b/packages/boxed-expression-component/src/components/PopoverMenu/PopoverMenu.tsx
index 074075b9d0..4aa5a40def 100644
--- a/packages/boxed-expression-component/src/components/PopoverMenu/PopoverMenu.tsx
+++ b/packages/boxed-expression-component/src/components/PopoverMenu/PopoverMenu.tsx
@@ -16,7 +16,7 @@
 
 import * as React from "react";
 import { useCallback, useState, useImperativeHandle } from "react";
-import { Popover } from "@patternfly/react-core";
+import { Popover } from "@patternfly/react-core/dist/js/components/Popover";
 import "./PopoverMenu.css";
 import { useBoxedExpression } from "../../context";
 import { NavigationKeysUtils } from "../common";
diff --git a/packages/boxed-expression-component/src/components/Table/TableHandler.tsx b/packages/boxed-expression-component/src/components/Table/TableHandler.tsx
index 2323044cd8..bfb6033f74 100644
--- a/packages/boxed-expression-component/src/components/Table/TableHandler.tsx
+++ b/packages/boxed-expression-component/src/components/Table/TableHandler.tsx
@@ -19,7 +19,7 @@ import { useCallback, useEffect, useMemo, useState } from "react";
 import { DataType, generateUuid, TableHandlerConfiguration, TableOperation } from "../../api";
 import * as _ from "lodash";
 import { Column, ColumnInstance, DataRecord } from "react-table";
-import { Popover } from "@patternfly/react-core";
+import { Popover } from "@patternfly/react-core/dist/js/components/Popover";
 import { TableHandlerMenu } from "./TableHandlerMenu";
 import { useBoxedExpression } from "../../context";
 import { getColumnsAtLastLevel, getColumnSearchPredicate } from "./Table";
diff --git a/packages/boxed-expression-component/src/components/Table/TableHandlerMenu.tsx b/packages/boxed-expression-component/src/components/Table/TableHandlerMenu.tsx
index d723c27f9f..93066a7b13 100644
--- a/packages/boxed-expression-component/src/components/Table/TableHandlerMenu.tsx
+++ b/packages/boxed-expression-component/src/components/Table/TableHandlerMenu.tsx
@@ -16,7 +16,7 @@
 
 import "./TableHandlerMenu.css";
 import * as React from "react";
-import { Menu, MenuGroup, MenuItem, MenuList } from "@patternfly/react-core";
+import { Menu, MenuGroup, MenuItem, MenuList } from "@patternfly/react-core/dist/js/components/Menu";
 import { AllowedOperations, GroupOperations, TableOperation } from "../../api";
 import * as _ from "lodash";
 
diff --git a/packages/dashbuilder-component-table/src/FilteredTable.tsx b/packages/dashbuilder-component-table/src/FilteredTable.tsx
index 58f4387958..e23e0c3315 100644
--- a/packages/dashbuilder-component-table/src/FilteredTable.tsx
+++ b/packages/dashbuilder-component-table/src/FilteredTable.tsx
@@ -17,7 +17,9 @@ import * as React from "react";
 import { TableComposable, Thead, Tbody, Tr, Th, Td, selectable } from "@patternfly/react-table";
 
 import { useState, useCallback, useMemo } from "react";
-import { Flex, FlexItem, Pagination, SearchInput } from "@patternfly/react-core";
+import { Flex, FlexItem } from "@patternfly/react-core/dist/js/layouts/Flex";
+import { Pagination } from "@patternfly/react-core/dist/js/components/Pagination";
+import { SearchInput } from "@patternfly/react-core/dist/js/components/SearchInput";
 
 const DEFAULT_PAGE = 1;
 const DEFAULT_PER_PAGE = 10;
diff --git a/packages/dashbuilder-component-uniforms/src/UniformsComponent.tsx b/packages/dashbuilder-component-uniforms/src/UniformsComponent.tsx
index 1b61877f5a..2be8ec2b90 100644
--- a/packages/dashbuilder-component-uniforms/src/UniformsComponent.tsx
+++ b/packages/dashbuilder-component-uniforms/src/UniformsComponent.tsx
@@ -18,7 +18,7 @@ import * as React from "react";
 import { ComponentController, DataSet } from "@kie-tools/dashbuilder-component-api";
 import { useState, useEffect, useCallback } from "react";
 import { Uniforms } from "./Uniforms";
-import { Alert, AlertActionCloseButton } from "@patternfly/react-core";
+import { Alert, AlertActionCloseButton } from "@patternfly/react-core/dist/js/components/Alert";
 
 interface Props {
   controller: ComponentController;
diff --git a/packages/dashbuilder-component-victory-charts/src/VictoryChartComponent.tsx b/packages/dashbuilder-component-victory-charts/src/VictoryChartComponent.tsx
index 2ef494c596..0900c2b300 100644
--- a/packages/dashbuilder-component-victory-charts/src/VictoryChartComponent.tsx
+++ b/packages/dashbuilder-component-victory-charts/src/VictoryChartComponent.tsx
@@ -18,7 +18,7 @@ import * as React from "react";
 import { ComponentController, DataSet } from "@kie-tools/dashbuilder-component-api";
 import { useState, useEffect } from "react";
 import { VictoryChart, VictoryChartProps } from "./VictoryChart";
-import { Alert } from "@patternfly/react-core";
+import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
 import { ChartType, ThemeColorType, ThemeVariantType } from "./charts/BaseChart";
 
 interface Props {
diff --git a/packages/dashbuilder-component-victory-charts/webpack.config.js b/packages/dashbuilder-component-victory-charts/webpack.config.js
index ab9cacec08..5862b64d41 100644
--- a/packages/dashbuilder-component-victory-charts/webpack.config.js
+++ b/packages/dashbuilder-component-victory-charts/webpack.config.js
@@ -19,6 +19,7 @@ const patternflyBase = require("@kie-tools-core/patternfly-base");
 const { merge } = require("webpack-merge");
 const common = require("@kie-tools-core/webpack-base/webpack.common.config");
 const HtmlWebpackPlugin = require("html-webpack-plugin");
+const CopyPlugin = require("copy-webpack-plugin");
 
 module.exports = async (env) => {
   return merge(common(env), {
@@ -30,6 +31,9 @@ module.exports = async (env) => {
         template: "./static/index.html",
         minify: false,
       }),
+      new CopyPlugin({
+        patterns: [{ from: path.resolve(__dirname, "./static/index.css"), to: "." }],
+      }),
     ],
 
     module: {
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/external/ExternalDataSetClientProvider.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/external/ExternalDataSetClientProvider.java
index de98a704cc..29f4dab87e 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/external/ExternalDataSetClientProvider.java
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/external/ExternalDataSetClientProvider.java
@@ -162,13 +162,32 @@ public class ExternalDataSetClientProvider {
                 if (response.status == HttpResponseCodes.SC_OK) {
                     return register(def, callback, responseText, mimeType);
                 } else {
-                    return notAbleToRetrieveDataSet(def, callback);
+                    var exception = buildExceptionForResponse(responseText, response);
+                   return notAbleToRetrieveDataSet(def, callback, exception);
                 }
 
             }, error -> notAbleToRetrieveDataSet(def, callback));
-        }).catch_(e -> notAbleToRetrieveDataSet(def, callback));
+        }).catch_(e -> notAbleToRetrieveDataSet(def, callback,
+                new RuntimeException("Request not started, make sure that CORS is enabled. Message: " + e)
+        ));
     }
 
+    
+
+    private Throwable buildExceptionForResponse(String responseText, Response response) {
+        var sb = new StringBuffer("The dataset URL is unreachable with status ");
+        sb.append(response.status);
+        sb.append(" - ");
+        sb.append(response.statusText);
+
+        if (responseText != null && !responseText.trim().isEmpty()) {
+            sb.append("\n");
+            sb.append("Response Text: ");
+            sb.append(responseText);
+        }
+        return new RuntimeException(sb.toString());
+   }
+
     private IThenable<Object> register(ExternalDataSetDef def,
                                        final DataSetReadyCallback callback,
                                        final String responseText,
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/services/RuntimeDataSetClientServices.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/services/RuntimeDataSetClientServices.java
index b6c9843083..d9ba619fba 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/services/RuntimeDataSetClientServices.java
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/services/RuntimeDataSetClientServices.java
@@ -151,7 +151,7 @@ public class RuntimeDataSetClientServices implements DataSetClientServices {
 
                     @Override
                     public boolean onError(ClientRuntimeError error) {
-                        if (loader.isEditor()) {
+                        if (loader.isEditor() || loader.isClient() ) {
                             listener.onError(error);
                         } else {
                             DomGlobal.console.debug("Error retrieving dataset from client, trying from backend");
diff --git a/packages/dashbuilder/dashbuilder-shared/dashbuilder-displayer-api/src/main/java/org/dashbuilder/displayer/DisplayerSettings.java b/packages/dashbuilder/dashbuilder-shared/dashbuilder-displayer-api/src/main/java/org/dashbuilder/displayer/DisplayerSettings.java
index acfcf33299..674a150ca0 100644
--- a/packages/dashbuilder/dashbuilder-shared/dashbuilder-displayer-api/src/main/java/org/dashbuilder/displayer/DisplayerSettings.java
+++ b/packages/dashbuilder/dashbuilder-shared/dashbuilder-displayer-api/src/main/java/org/dashbuilder/displayer/DisplayerSettings.java
@@ -379,7 +379,7 @@ public class DisplayerSettings {
     }
 
     public boolean isFilterEnabled() {
-        return parseBoolean(settings.get(getSettingPath(DisplayerAttributeDef.FILTER_ENABLED)));
+        return parseBoolean(settings.get(getSettingPath(DisplayerAttributeDef.FILTER_ENABLED))) || isFilterListeningEnabled() || isFilterNotificationEnabled();
     }
 
     public void setFilterEnabled(boolean filterEnabled) {
diff --git a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/json/ExternalDataSetJSONParser.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/json/ExternalDataSetJSONParser.java
index 8784fa6935..c2468679ca 100644
--- a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/json/ExternalDataSetJSONParser.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/json/ExternalDataSetJSONParser.java
@@ -46,14 +46,13 @@ public class ExternalDataSetJSONParser {
 
     private static final String COLUMN_PREFIX = "Column ";
     private static final ColumnType DEFAULT_COLUMN_TYPE = ColumnType.LABEL;
-    
-    
+
     private Function<String, Date> dateParser;
-    
+
     public ExternalDataSetJSONParser() {
         this(s -> null);
-    }         
-    
+    }
+
     public ExternalDataSetJSONParser(Function<String, Date> dateParser) {
         super();
         this.dateParser = dateParser;
@@ -107,9 +106,13 @@ public class ExternalDataSetJSONParser {
                 }
 
             } else if (trimedJson.startsWith(ARRAY_START_TOKEN)) {
-                JsonArray dataSetArray = Json.instance().parse(json);
-                fillDataSetColumns(dataSet, dataSetArray);
-                addValues(dataSet, dataSetArray);
+                try {
+                    JsonArray dataSetArray = Json.instance().parse(json);
+                    fillDataSetColumns(dataSet, dataSetArray);
+                    addValues(dataSet, dataSetArray);
+                } catch (Exception e) {
+                    throw new IllegalArgumentException("DataSet JSON is invalid. Please check that the data is in correct format.", e);
+                }
             }
         }
         return dataSet;
@@ -215,7 +218,7 @@ public class ExternalDataSetJSONParser {
         } catch (NumberFormatException e) {
             // empty
         }
-        
+
         try {
             convertToDate(value);
             return ColumnType.DATE;
@@ -225,7 +228,7 @@ public class ExternalDataSetJSONParser {
 
         return DEFAULT_COLUMN_TYPE;
     }
-    
+
     protected Date convertToDate(String value) {
         return dateParser.apply(value);
     }
diff --git a/packages/eslint/.eslintrc.js b/packages/eslint/.eslintrc.js
index 18bf908273..ec04717598 100644
--- a/packages/eslint/.eslintrc.js
+++ b/packages/eslint/.eslintrc.js
@@ -65,5 +65,26 @@ module.exports = {
         amd: true,
       },
     },
+    {
+      files: ["*.ts", "*.tsx"],
+      rules: {
+        "no-restricted-imports": [
+          "error",
+          {
+            paths: [
+              {
+                name: "@patternfly/react-core",
+                message: "Please use specific imports from @patternfly/react-core/dist/js/**)",
+              },
+              {
+                name: "@patternfly/react-icons",
+                message: "Please use specific imports from @patternfly/react-icons/dist/js/**)",
+              },
+            ],
+            patterns: ["!@patternfly/react-core/dist/*", "!@patternfly/react-icons/dist/*"],
+          },
+        ],
+      },
+    },
   ],
 };
diff --git a/packages/i18n-common-dictionary/src/CommonI18n.ts b/packages/i18n-common-dictionary/src/CommonI18n.ts
index cf239eaf62..c9ae016c2e 100644
--- a/packages/i18n-common-dictionary/src/CommonI18n.ts
+++ b/packages/i18n-common-dictionary/src/CommonI18n.ts
@@ -18,6 +18,7 @@ import { ReferenceDictionary } from "@kie-tools-core/i18n/dist/core";
 import { names } from "./names";
 
 export type CommonDictionary = {
+  apply: string;
   available: string;
   back: string;
   cancel: string;
diff --git a/packages/i18n-common-dictionary/src/locales/en.ts b/packages/i18n-common-dictionary/src/locales/en.ts
index afd397b07c..e18efe1bb9 100644
--- a/packages/i18n-common-dictionary/src/locales/en.ts
+++ b/packages/i18n-common-dictionary/src/locales/en.ts
@@ -20,6 +20,7 @@ import { names } from "../names";
 export const en: CommonI18n = {
   names,
   terms: {
+    apply: "Apply",
     available: "Available",
     back: "Back",
     cancel: "Cancel",
diff --git a/packages/import-java-classes-component/src/components/ImportJavaClasses/ImportJavaClassesWizard.tsx b/packages/import-java-classes-component/src/components/ImportJavaClasses/ImportJavaClassesWizard.tsx
index 0d18a18cd5..a4069e741e 100644
--- a/packages/import-java-classes-component/src/components/ImportJavaClasses/ImportJavaClassesWizard.tsx
+++ b/packages/import-java-classes-component/src/components/ImportJavaClasses/ImportJavaClassesWizard.tsx
@@ -25,7 +25,10 @@ import { JavaField } from "./model/JavaField";
 import { DMNSimpleType } from "./model/DMNSimpleType";
 import { getJavaClassSimpleName } from "./model/JavaClassUtils";
 import { GWTLayerService, JavaCodeCompletionService } from "./services";
-import { Button, Modal, ModalVariant, Tooltip, Wizard } from "@patternfly/react-core";
+import { Button } from "@patternfly/react-core/dist/js/components/Button";
+import { Modal, ModalVariant } from "@patternfly/react-core/dist/js/components/Modal";
+import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
+import { Wizard } from "@patternfly/react-core/dist/js/components/Wizard";
 
 export interface ImportJavaClassesWizardProps {
   /** Service class which contains all API methods to dialog with GWT layer */
diff --git a/packages/import-java-classes-component/src/components/ImportJavaClasses/ImportJavaClassesWizardFieldListTable.tsx b/packages/import-java-classes-component/src/components/ImportJavaClasses/ImportJavaClassesWizardFieldListTable.tsx
index 4a5a439cef..08ec524d41 100644
--- a/packages/import-java-classes-component/src/components/ImportJavaClasses/ImportJavaClassesWizardFieldListTable.tsx
+++ b/packages/import-java-classes-component/src/components/ImportJavaClasses/ImportJavaClassesWizardFieldListTable.tsx
@@ -18,7 +18,7 @@ import * as React from "react";
 import "./ImportJavaClassesWizardFieldListTable.css";
 import { ExpandableRowContent, TableComposable, Tbody, Td, Tr } from "@patternfly/react-table";
 import { JavaClass } from "./model/JavaClass";
-import { Button } from "@patternfly/react-core";
+import { Button } from "@patternfly/react-core/dist/js/components/Button";
 import { JavaField } from "./model/JavaField";
 import { DMNSimpleType, JAVA_TO_DMN_MAP } from "./model/DMNSimpleType";
 import { getJavaClassSimpleName } from "./model/JavaClassUtils";
diff --git a/packages/import-java-classes-component/src/components/ImportJavaClasses/ImportJavaClassesWizardFirstStep.tsx b/packages/import-java-classes-component/src/components/ImportJavaClasses/ImportJavaClassesWizardFirstStep.tsx
index 9a5b8294e5..10d60ff452 100644
--- a/packages/import-java-classes-component/src/components/ImportJavaClasses/ImportJavaClassesWizardFirstStep.tsx
+++ b/packages/import-java-classes-component/src/components/ImportJavaClasses/ImportJavaClassesWizardFirstStep.tsx
@@ -16,21 +16,19 @@
 
 import * as React from "react";
 import "./ImportJavaClassesWizardFirstStep.css";
+import { Bullseye } from "@patternfly/react-core/dist/js/layouts/Bullseye";
 import {
-  Bullseye,
   DataList,
   DataListCell,
   DataListCheck,
   DataListItem,
   DataListItemRow,
-  EmptyState,
-  EmptyStateBody,
-  EmptyStateIcon,
-  SearchInput,
-  Spinner,
-  Tooltip,
-  Title,
-} from "@patternfly/react-core";
+} from "@patternfly/react-core/dist/js/components/DataList";
+import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
+import { SearchInput } from "@patternfly/react-core/dist/js/components/SearchInput";
+import { Spinner } from "@patternfly/react-core/dist/js/components/Spinner";
+import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
+import { Title } from "@patternfly/react-core/dist/js/components/Title";
 import CubesIcon from "@patternfly/react-icons/dist/js/icons/cubes-icon";
 import { useImportJavaClassesWizardI18n } from "../../i18n";
 import { useCallback, useState } from "react";
diff --git a/packages/import-java-classes-component/src/components/ImportJavaClasses/ImportJavaClassesWizardSecondStep.tsx b/packages/import-java-classes-component/src/components/ImportJavaClasses/ImportJavaClassesWizardSecondStep.tsx
index f4539736da..c39bf6ac44 100644
--- a/packages/import-java-classes-component/src/components/ImportJavaClasses/ImportJavaClassesWizardSecondStep.tsx
+++ b/packages/import-java-classes-component/src/components/ImportJavaClasses/ImportJavaClassesWizardSecondStep.tsx
@@ -15,7 +15,8 @@
  */
 
 import * as React from "react";
-import { Bullseye, Spinner } from "@patternfly/react-core";
+import { Bullseye } from "@patternfly/react-core/dist/js/layouts/Bullseye";
+import { Spinner } from "@patternfly/react-core/dist/js/components/Spinner";
 import { useCallback, useEffect } from "react";
 import { ImportJavaClassesWizardFieldListTable } from "./ImportJavaClassesWizardFieldListTable";
 import { JavaField } from "./model/JavaField";
diff --git a/packages/kie-sandbox-image/README.md b/packages/kie-sandbox-image/README.md
index e281919b19..5749026936 100644
--- a/packages/kie-sandbox-image/README.md
+++ b/packages/kie-sandbox-image/README.md
@@ -54,13 +54,14 @@ This package contains the `Containerfile/Dockerfile` and scripts to build a cont
 
    [comment]: <> (//TODO: Use EnvJson.schema.json to generate this documentation somehow.. See https://github.com/kiegroup/kie-issues/issues/16)
 
-   |                            Name                            |                                                     Description                                                      |                               Default                               |
-   | :--------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------: |
-   |            `KIE_SANDBOX_EXTENDED_SERVICES_URL`             |                              The URL that points to the KIE Sandbox Extended Services.                               | See [ defaultEnvJson.ts ](../online-editor/build/defaultEnvJson.ts) |
-   |              `KIE_SANDBOX_GIT_CORS_PROXY_URL`              |                    The URL that points to the Git CORS proxy for interacting with Git providers.                     | See [ defaultEnvJson.ts ](../online-editor/build/defaultEnvJson.ts) |
-   |        `KIE_SANDBOX_REQUIRE_CUSTOM_COMMIT_MESSAGE`         |                      Require users to type a custom commit message when creating a new commit.                       | See [ defaultEnvJson.ts ](../online-editor/build/defaultEnvJson.ts) |
-   | `KIE_SANDBOX_CUSTOM_COMMIT_MESSAGE_VALIDATION_SERVICE_URL` |                                       Service URL to validate commit messages.                                       | See [ defaultEnvJson.ts ](../online-editor/build/defaultEnvJson.ts) |
-   |                `KIE_SANDBOX_AUTH_PROVIDERS`                | Authentication providers configuration. Used to enable integration with GitHub Enterprise Server instances and more. | See [ defaultEnvJson.ts ](../online-editor/build/defaultEnvJson.ts) |
+   |                            Name                             |                                                         Description                                                         |                               Default                               |
+   | :---------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------: |
+   |             `KIE_SANDBOX_EXTENDED_SERVICES_URL`             |                                  The URL that points to the KIE Sandbox Extended Services.                                  | See [ defaultEnvJson.ts ](../online-editor/build/defaultEnvJson.ts) |
+   |              `KIE_SANDBOX_GIT_CORS_PROXY_URL`               |                        The URL that points to the Git CORS proxy for interacting with Git providers.                        | See [ defaultEnvJson.ts ](../online-editor/build/defaultEnvJson.ts) |
+   |        `KIE_SANDBOX_REQUIRE_CUSTOM_COMMIT_MESSAGES`         |                          Require users to type a custom commit message when creating a new commit.                          | See [ defaultEnvJson.ts ](../online-editor/build/defaultEnvJson.ts) |
+   | `KIE_SANDBOX_CUSTOM_COMMIT_MESSAGES_VALIDATION_SERVICE_URL` |                                          Service URL to validate commit messages.                                           | See [ defaultEnvJson.ts ](../online-editor/build/defaultEnvJson.ts) |
+   |                `KIE_SANDBOX_AUTH_PROVIDERS`                 |    Authentication providers configuration. Used to enable integration with GitHub Enterprise Server instances and more.     | See [ defaultEnvJson.ts ](../online-editor/build/defaultEnvJson.ts) |
+   |                 `KIE_SANDBOX_ACCELERATORS`                  | Accelerators configuration. Used to add a template to a set of Decisions and Workflows, making it buildable and deployable. | See [ defaultEnvJson.ts ](../online-editor/build/defaultEnvJson.ts) |
 
    ### Examples
 
@@ -73,7 +74,15 @@ This package contains the `Containerfile/Dockerfile` and scripts to build a cont
    2. Enabling authentication with a GitHub Enterprise Server instance.
 
       ```bash
-      podman run -t -p 8080:8080 -e KIE_SANDBOX_AUTH_PROVIDERS='[{"id":"github_at_my_company","domain":"github.my-company.com","supportedGitRemoteDomains":["github.my-company.com","gist.github.my-company.com"],"type":"github","name":"GitHub @ MyCompany","enabled":true, "group":"git" }]' -i --rm quay.io/kie-tools/kie-sandbox-image:latest
+      podman run -t -p 8080:8080 -e KIE_SANDBOX_AUTH_PROVIDERS='[{
+        "id":"github_at_my_company", \
+        "domain":"github.my-company.com", \
+        "supportedGitRemoteDomains":["github.my-company.com","gist.github.my-company.com"], \
+        "type":"github", \
+        "name":"GitHub @ MyCompany", \
+        "enabled":true, \
+        "group":"git" \
+      }]' -i --rm quay.io/kie-tools/kie-sandbox-image:latest
       ```
 
    3. Requiring users to input a custom commit message on every commit.
@@ -88,6 +97,20 @@ This package contains the `Containerfile/Dockerfile` and scripts to build a cont
       podman run -t -p 8080:8080 -e KIE_SANDBOX_REQUIRE_CUSTOM_COMMIT_MESSAGE='true' KIE_SANDBOX_CUSTOM_COMMIT_MESSAGE_VALIDATION_SERVICE_URL='http://localhost:8090/validate' -i --rm quay.io/kie-tools/kie-sandbox-image:latest
       ```
 
+   5. Adding Accelerators available for your users.
+
+      ```bash
+      podman run -t -p 8080:8080 -e KIE_SANDBOX_ACCELERATORS='[{ \
+        name: "Quarkus", \
+        iconUrl: "https://github.com/kiegroup/kie-sandbox-quarkus-accelerator/raw/0.0.0/quarkus-logo.png", \
+        gitRepositoryUrl: "https://github.com/kiegroup/kie-sandbox-quarkus-accelerator", \
+        gitRepositoryGitRef: "0.0.0", \
+        dmnDestinationFolder: "src/main/resources/dmn", \
+        bpmnDestinationFolder: "src/main/resources/bpmn", \
+        otherFilesDestinationFolder: "src/main/resources/others", \
+      }]' -i --rm quay.io/kie-tools/kie-sandbox-image:latest
+      ```
+
 2. Write a custom `Containerfile/Dockerfile` from the image:
 
    ```docker
@@ -98,6 +121,7 @@ This package contains the `Containerfile/Dockerfile` and scripts to build a cont
    ENV KIE_SANDBOX_REQUIRE_CUSTOM_COMMIT_MESSAGE=<my_value>
    ENV KIE_SANDBOX_CUSTOM_COMMIT_MESSAGE_VALIDATION_SERVICE_URL=<my_value>
    ENV KIE_SANDBOX_AUTH_PROVIDERS=<my_value>
+   ENV KIE_SANDBOX_ACCELERATORS=<my_value>
    ```
 
 3. Create the application from the image in OpenShift and set the deployment environment variable right from the OpenShift UI.
@@ -168,3 +192,48 @@ Content-Type: application/json
 
 - #### HTTP Status different from 200
   If the service responds with an HTTP code other than 200, an error message is displayed alongside the HTTP Code + the response body of the request in full.
+
+### Accelerators
+
+Accelerators are Git repositories that contain a skeleton of an application and will convert a working directory with your .dmn and .bpmn files into a fully functional application that can be built and deployed.
+
+After creating yours you must define where resources should be placed inside these repositories. For example, `.dmn` files should be placed inside `src/main/resources` for a Quarkus application. As a bonus, adding an image/logo can be used to better represent your Accelerator wherever it's listed.
+
+#### The Accelerator configuration
+
+Having all of that, it's time to create the configuration required to add it to the **KIE_SANDBOX_ACCELERATORS** list env var.
+It looks like this:
+
+```js
+{
+    name: "Your Accelerator name",
+    iconUrl: "https://link.to/your/logo/image",
+    gitRepositoryUrl: "https://github.com/...",
+    gitRepositoryGitRef: "branchName",
+    dmnDestinationFolder: "path/to/place/dmn/files",
+    bpmnDestinationFolder: "path/to/place/bpmn/files",
+    otherFilesDestinationFolder: "path/to/place/other/files",
+}
+```
+
+- **name**: This is how the Accelerator will be known inside KIE Sandbox.
+- **iconUrl**: An optional parameter to add an image/logo besides you Accelerator name.
+- **gitRepositoryUrl**: This is where your Accelerator is hosted. Should be an URL that can be used with `git clone`.
+- **gitRepositoryGitRef**: Where in your repository is this Accelerator located. Could be a branch, commit, tag, anything that can be used with `git checkout`.
+- **dmnDestinationFolder**: Where your DMN and PMML files will be moved to after applying the Accelerator.
+- **bpmnDestinationFolder**: Where your BPMN files will be moved to after applying the Accelerator.
+- **otherFilesDestinationFolder**: Where other files will be moved to after applying the Accelerator.
+
+Here's an example of what it should look like:
+
+```js
+{
+    name: "Quarkus",
+    iconUrl: `https://github.com/kiegroup/kie-sandbox-quarkus-accelerator/raw/0.0.0/quarkus-logo.png`,
+    gitRepositoryUrl: "https://github.com/kiegroup/kie-sandbox-quarkus-accelerator",
+    gitRepositoryGitRef: "main,
+    dmnDestinationFolder: "src/main/resources/dmn",
+    bpmnDestinationFolder: "src/main/resources/bpmn",
+    otherFilesDestinationFolder: "src/main/resources/others",
+}
+```
diff --git a/packages/kn-plugin-workflow/env/index.js b/packages/kn-plugin-workflow/env/index.js
index c3430b2017..7089c702c3 100644
--- a/packages/kn-plugin-workflow/env/index.js
+++ b/packages/kn-plugin-workflow/env/index.js
@@ -31,7 +31,7 @@ module.exports = composeEnv([require("@kie-tools/root-env/env")], {
     },
     KN_PLUGIN_WORKFLOW__quarkusVersion: {
       name: "KN_PLUGIN_WORKFLOW__quarkusVersion",
-      default: "2.15.0.Final",
+      default: "2.16.0.Final",
       description: "Quarkus version to be used when creating the Kogito Serverless Workflow project",
     },
   }),
diff --git a/packages/kn-plugin-workflow/go.mod b/packages/kn-plugin-workflow/go.mod
index c0be1728e9..96023519b4 100644
--- a/packages/kn-plugin-workflow/go.mod
+++ b/packages/kn-plugin-workflow/go.mod
@@ -25,7 +25,7 @@ require (
 	github.com/spf13/pflag v1.0.5 // indirect
 	github.com/subosito/gotenv v1.2.0 // indirect
 	golang.org/x/sys v0.0.0-20220804214406-8e32c043e418 // indirect
-	golang.org/x/text v0.3.7 // indirect
+	golang.org/x/text v0.3.8 // indirect
 	gopkg.in/ini.v1 v1.66.2 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 )
diff --git a/packages/kn-plugin-workflow/go.sum b/packages/kn-plugin-workflow/go.sum
index 5fbfb1f3d7..7828ef2d5f 100644
--- a/packages/kn-plugin-workflow/go.sum
+++ b/packages/kn-plugin-workflow/go.sum
@@ -352,8 +352,8 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
-golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY=
+golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
diff --git a/packages/online-editor/build/defaultEnvJson.ts b/packages/online-editor/build/defaultEnvJson.ts
index 8d98aa97bc..124b397179 100644
--- a/packages/online-editor/build/defaultEnvJson.ts
+++ b/packages/online-editor/build/defaultEnvJson.ts
@@ -79,4 +79,15 @@ export const defaultEnvJson: EnvJson = {
       group: AuthProviderGroup.CLOUD,
     },
   ],
+  KIE_SANDBOX_ACCELERATORS: [
+    {
+      name: "Quarkus",
+      iconUrl: `https://github.com/kiegroup/kie-sandbox-quarkus-accelerator/raw/${buildEnv.root.version}/quarkus-logo.png`,
+      gitRepositoryUrl: "https://github.com/kiegroup/kie-sandbox-quarkus-accelerator",
+      gitRepositoryGitRef: buildEnv.root.version,
+      dmnDestinationFolder: "src/main/resources/dmn",
+      bpmnDestinationFolder: "src/main/resources/bpmn",
+      otherFilesDestinationFolder: "src/main/resources/others",
+    },
+  ],
 };
diff --git a/packages/online-editor/package.json b/packages/online-editor/package.json
index 59b241bcc4..0424ec2682 100644
--- a/packages/online-editor/package.json
+++ b/packages/online-editor/package.json
@@ -60,6 +60,7 @@
     "buffer": "^6.0.3",
     "history": "^4.9.0",
     "isomorphic-git": "^1.11.1",
+    "js-yaml": "^4.1.0",
     "moment": "^2.29.4",
     "react": "^17.0.2",
     "react-dom": "^17.0.2",
@@ -87,6 +88,7 @@
     "@types/history": "^4.7.3",
     "@types/jest": "^26.0.23",
     "@types/jest-when": "^2.7.4",
+    "@types/js-yaml": "^4.0.5",
     "@types/react": "^17.0.6",
     "@types/react-dom": "^17.0.5",
     "@types/react-router": "^5.1.14",
diff --git a/packages/online-editor/src/accelerators/AcceleratorsApi.ts b/packages/online-editor/src/accelerators/AcceleratorsApi.ts
new file mode 100644
index 0000000000..22a5d50b67
--- /dev/null
+++ b/packages/online-editor/src/accelerators/AcceleratorsApi.ts
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export type AcceleratorConfig = {
+  name: string;
+  gitRepositoryUrl: string;
+  gitRepositoryGitRef: string;
+  dmnDestinationFolder: string;
+  bpmnDestinationFolder: string;
+  otherFilesDestinationFolder: string;
+  iconUrl?: string;
+};
+
+export type AcceleratorAppliedConfig = AcceleratorConfig & { appliedAt?: string };
+
+export function validateAcceleratorDestinationFolderPaths(path: string) {
+  if (path.startsWith(".")) {
+    return "Accelerator destination folder misconfigured: Please only use absolute paths.";
+  } else if (path.includes("*") || path.includes("?")) {
+    return "Accelerator destination folder misconfigured: Wildcards and patterns are not allowed.";
+  }
+  return;
+}
+
+export const KIE_SANDBOX_DIRECTORY_PATH = ".kie-sandbox";
+export const ACCELERATOR_CONFIG_FILE_NAME = "accelerator";
+export const ACCELERATOR_CONFIG_FILE_EXTENSION = "yaml";
+export const ACCELERATOR_CONFIG_FILE_RELATIVE_PATH = `${KIE_SANDBOX_DIRECTORY_PATH}/${ACCELERATOR_CONFIG_FILE_NAME}.${ACCELERATOR_CONFIG_FILE_EXTENSION}`;
diff --git a/packages/online-editor/src/accelerators/AcceleratorsHooks.tsx b/packages/online-editor/src/accelerators/AcceleratorsHooks.tsx
new file mode 100644
index 0000000000..def9232810
--- /dev/null
+++ b/packages/online-editor/src/accelerators/AcceleratorsHooks.tsx
@@ -0,0 +1,413 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { useCallback, useMemo, useState } from "react";
+import * as yaml from "js-yaml";
+import { useEnv } from "../env/hooks/EnvContext";
+import {
+  ACCELERATOR_CONFIG_FILE_NAME,
+  ACCELERATOR_CONFIG_FILE_EXTENSION,
+  KIE_SANDBOX_DIRECTORY_PATH,
+  AcceleratorConfig,
+  validateAcceleratorDestinationFolderPaths,
+  ACCELERATOR_CONFIG_FILE_RELATIVE_PATH,
+  AcceleratorAppliedConfig,
+} from "./AcceleratorsApi";
+import { WorkspaceFile, useWorkspaces } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+import { dirname, join } from "path";
+import { useHistory } from "react-router";
+import { useRoutes } from "../navigation/Hooks";
+import { useGlobalAlert } from "../alerts";
+import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
+import { Spinner } from "@patternfly/react-core/dist/js/components/Spinner";
+import { useOnlineI18n } from "../i18n";
+import { useCancelableEffect } from "@kie-tools-core/react-hooks/dist/useCancelableEffect";
+import { useAuthSession } from "../authSessions/AuthSessionsContext";
+import { ActiveWorkspace } from "@kie-tools-core/workspaces-git-fs/dist/model/ActiveWorkspace";
+import { useWorkspaceFilePromise } from "@kie-tools-core/workspaces-git-fs/dist/hooks/WorkspaceFileHooks";
+import {
+  GIT_DEFAULT_BRANCH,
+  GIT_ORIGIN_REMOTE_NAME,
+} from "@kie-tools-core/workspaces-git-fs/dist/constants/GitConstants";
+import { isDecision, isScorecard, isWorkflow } from "../envelopeLocator/EditorEnvelopeLocatorFactory";
+
+const TEMP_ACCELERATOR_REMOTE_NAME = "__kie-sandbox__accelerator-remote";
+const BACKUP_BRANCH_NAME = "__kie-sandbox__accelerator-backup-branch";
+const MOVED_FILES_BRANCH_NAME = "__kie-sandbox__accelerator-moved-files-branch";
+
+class ApplyAcceleratorError extends Error {
+  constructor(acceleratorName: string, message?: string) {
+    super(`Applying Accelerator ${acceleratorName}: ${message}`);
+  }
+}
+
+export function useAvailableAccelerators() {
+  const { env } = useEnv();
+  return useMemo<AcceleratorConfig[]>(() => env.KIE_SANDBOX_ACCELERATORS, [env.KIE_SANDBOX_ACCELERATORS]);
+}
+
+export function useAcceleratorsDispatch(workspace: ActiveWorkspace) {
+  const workspaces = useWorkspaces();
+  const history = useHistory();
+  const routes = useRoutes();
+  const { i18n } = useOnlineI18n();
+  const { gitConfig } = useAuthSession(workspace.descriptor.gitAuthSessionId);
+
+  const apllyingAcceleratorAlert = useGlobalAlert(
+    useCallback(
+      (_, staticArgs: { acceleratorName: string }) => (
+        <Alert
+          className={"kogito--alert"}
+          variant="info"
+          title={
+            <>
+              <Spinner size={"sm"} />
+              &nbsp;&nbsp; {i18n.accelerators.loadingAlert(staticArgs.acceleratorName)}
+            </>
+          }
+        />
+      ),
+      [i18n]
+    )
+  );
+
+  const applyAcceleratorSuccessAlert = useGlobalAlert(
+    useCallback(
+      (_, staticArgs: { acceleratorName: string }) => (
+        <Alert
+          className={"kogito--alert"}
+          variant="success"
+          title={i18n.accelerators.successAlert(staticArgs.acceleratorName)}
+        />
+      ),
+      [i18n]
+    ),
+    { durationInSeconds: 4 }
+  );
+
+  const applyAcceleratorFailAlert = useGlobalAlert(
+    useCallback(
+      (_, staticArgs: { acceleratorName: string }) => (
+        <Alert
+          className={"kogito--alert"}
+          variant="danger"
+          title={i18n.accelerators.failAlert(staticArgs.acceleratorName)}
+        />
+      ),
+      [i18n]
+    ),
+    { durationInSeconds: 4 }
+  );
+
+  const attemptToDeleteTemporaryBranches = useCallback(async () => {
+    const workspaceId = workspace.descriptor.workspaceId;
+    try {
+      await workspaces.deleteBranch({ workspaceId, ref: BACKUP_BRANCH_NAME });
+    } catch (e) {
+      // Do nothing
+    }
+    try {
+      await workspaces.deleteBranch({ workspaceId, ref: MOVED_FILES_BRANCH_NAME });
+    } catch (e) {
+      // Do nothing
+    }
+  }, [workspace.descriptor.workspaceId, workspaces]);
+
+  const applyAcceleratorToWorkspace = useCallback(
+    async (accelerator: AcceleratorConfig, currentFile: WorkspaceFile) => {
+      apllyingAcceleratorAlert.show({ acceleratorName: accelerator.name });
+
+      const workspaceId = workspace.descriptor.workspaceId;
+
+      let movedFiles: WorkspaceFile[] = [];
+
+      // Attempt to delete branches
+      // This is a workaround, as isomorphic-git doesn't necessarilly deletes the branch, even though it resolves
+      attemptToDeleteTemporaryBranches();
+
+      let configFile: WorkspaceFile | undefined = undefined;
+
+      try {
+        const destinationPathValidation = {
+          dmnDestinationFolder: validateAcceleratorDestinationFolderPaths(accelerator.dmnDestinationFolder),
+          bpmnDestinationFolder: validateAcceleratorDestinationFolderPaths(accelerator.bpmnDestinationFolder),
+          otherFilesDestinationFolder: validateAcceleratorDestinationFolderPaths(
+            accelerator.otherFilesDestinationFolder
+          ),
+        };
+
+        if (
+          destinationPathValidation.dmnDestinationFolder ||
+          destinationPathValidation.bpmnDestinationFolder ||
+          destinationPathValidation.otherFilesDestinationFolder
+        ) {
+          throw new ApplyAcceleratorError(accelerator.name, JSON.stringify(destinationPathValidation));
+        }
+
+        const workspaceFiles = await workspaces.getFiles({ workspaceId });
+
+        // Create new temporary branch with current files, but stay on main
+        await workspaces.branch({ workspaceId, name: BACKUP_BRANCH_NAME, checkout: false });
+
+        // Commit moved files to moved files branch (this commit will never be pushed, as this branch will be deleted)
+        await workspaces.commit({
+          workspaceId,
+          commitMessage: `KIE Sandbox: Backup files before applying ${accelerator.name} Accelerator`,
+          targetBranch: BACKUP_BRANCH_NAME,
+        });
+
+        // Create new temporary branch for moved files, but stay on main
+        await workspaces.branch({ workspaceId, name: MOVED_FILES_BRANCH_NAME, checkout: false });
+
+        // Checkout to moved files branch
+        await workspaces.checkout({
+          workspaceId,
+          ref: MOVED_FILES_BRANCH_NAME,
+          remote: GIT_ORIGIN_REMOTE_NAME,
+        });
+
+        // Move files
+        let currentFileAfterAccelerator: WorkspaceFile | undefined;
+        movedFiles = await Promise.all(
+          workspaceFiles.map(async (file) => {
+            let fileNewDestination: string;
+
+            if (isDecision(file.relativePath) || isScorecard(file.relativePath)) {
+              fileNewDestination = accelerator.dmnDestinationFolder;
+            } else if (isWorkflow(file.relativePath)) {
+              fileNewDestination = accelerator.bpmnDestinationFolder;
+            } else {
+              fileNewDestination = accelerator.otherFilesDestinationFolder;
+            }
+
+            const movedFile = await workspaces.moveFile({
+              file,
+              newDirPath: join(fileNewDestination, dirname(file.relativePath)),
+            });
+
+            await workspaces.stageFile({ workspaceId, relativePath: movedFile.relativePath });
+
+            if (file.relativePath === currentFile.relativePath) {
+              currentFileAfterAccelerator = movedFile;
+            }
+            return movedFile;
+          })
+        );
+
+        const movedFilesPaths = movedFiles.map((file) => file.relativePath);
+
+        if (!currentFileAfterAccelerator) {
+          throw new ApplyAcceleratorError(accelerator.name, "Failed to find current file after moving.");
+        }
+
+        // Commit moved files to moved files branch (this commit will never be pushed, as this branch will be deleted)
+        await workspaces.commit({
+          workspaceId,
+          commitMessage: `KIE Sandbox: Moving files to apply ${accelerator.name} Accelerator.`,
+          targetBranch: MOVED_FILES_BRANCH_NAME,
+        });
+
+        // Go back to main
+        await workspaces.checkout({ workspaceId, ref: GIT_DEFAULT_BRANCH, remote: GIT_ORIGIN_REMOTE_NAME });
+
+        // Add Accelerator remote and fetch it
+        await workspaces.addRemote({
+          workspaceId,
+          name: TEMP_ACCELERATOR_REMOTE_NAME,
+          url: accelerator.gitRepositoryUrl,
+          force: true,
+        });
+
+        const fetchResult = await workspaces.fetch({
+          workspaceId,
+          remote: TEMP_ACCELERATOR_REMOTE_NAME,
+          ref: accelerator.gitRepositoryGitRef,
+        });
+
+        if (!fetchResult.fetchHead) {
+          throw new ApplyAcceleratorError(
+            accelerator.name,
+            `Unable to find remote HEAD for ${accelerator.gitRepositoryGitRef} ref.`
+          );
+        }
+
+        // Checkout Accelerator files, wiping everything else
+        await workspaces.checkoutFilesFromLocalHead({
+          workspaceId,
+          ref: fetchResult.fetchHead,
+          filepaths: ["."],
+        });
+
+        // Delete Accelerator remote
+        await workspaces.deleteRemote({ workspaceId, name: TEMP_ACCELERATOR_REMOTE_NAME });
+
+        // Stage all Accelerator files
+        const acceleratorFiles = await workspaces.getFiles({ workspaceId });
+        await Promise.all(
+          acceleratorFiles.map(async (file) => {
+            return workspaces.stageFile({
+              workspaceId,
+              relativePath: file.relativePath,
+            });
+          })
+        );
+
+        // Bring moved user files back
+        await workspaces.checkoutFilesFromLocalHead({
+          workspaceId,
+          ref: MOVED_FILES_BRANCH_NAME,
+          filepaths: movedFilesPaths,
+        });
+
+        // Stage all moved files
+        await Promise.all(
+          movedFiles.map(async (file) => {
+            return workspaces.stageFile({
+              workspaceId,
+              relativePath: file.relativePath,
+            });
+          })
+        );
+
+        // Add Accelerator YAML config
+        const content = `# This file was automatically created by ${
+          i18n.names.businessModeler.online
+        }. Please don't modify it.\n${yaml.dump({ ...accelerator, appliedAt: new Date().toISOString() })}`;
+        configFile = await workspaces.addFile({
+          workspaceId,
+          name: ACCELERATOR_CONFIG_FILE_NAME,
+          destinationDirRelativePath: KIE_SANDBOX_DIRECTORY_PATH,
+          content,
+          extension: ACCELERATOR_CONFIG_FILE_EXTENSION,
+        });
+
+        await workspaces.stageFile({
+          workspaceId,
+          relativePath: ACCELERATOR_CONFIG_FILE_RELATIVE_PATH,
+        });
+
+        // Create commit
+        await workspaces.createSavePoint({
+          workspaceId,
+          gitConfig,
+          commitMessage: i18n.accelerators.commitMessage(accelerator.name),
+          forceHasChanges: true,
+        });
+
+        apllyingAcceleratorAlert.close();
+
+        applyAcceleratorSuccessAlert.show({ acceleratorName: accelerator.name });
+
+        attemptToDeleteTemporaryBranches();
+
+        history.replace({
+          pathname: routes.workspaceWithFilePath.path({
+            extension: currentFileAfterAccelerator.extension,
+            fileRelativePath: currentFileAfterAccelerator.relativePathWithoutExtension,
+            workspaceId,
+          }),
+        });
+      } catch (e) {
+        apllyingAcceleratorAlert.close();
+        applyAcceleratorFailAlert.show({ acceleratorName: accelerator.name });
+
+        console.error(e);
+
+        // Delete config file
+        if (configFile) {
+          await workspaces.deleteFile({ file: configFile });
+        }
+
+        // Return to main
+        await workspaces.checkout({ workspaceId, ref: GIT_DEFAULT_BRANCH, remote: GIT_ORIGIN_REMOTE_NAME });
+
+        // Revert repo
+        await workspaces.checkoutFilesFromLocalHead({
+          workspaceId,
+          ref: BACKUP_BRANCH_NAME,
+          filepaths: ["."],
+        });
+
+        attemptToDeleteTemporaryBranches();
+
+        // Delete moved files
+        await Promise.all(
+          movedFiles.map(
+            async (file) =>
+              (await workspaces.existsFile({ workspaceId, relativePath: file.relativePath })) &&
+              (await workspaces.deleteFile({ file }))
+          )
+        );
+
+        // Reload to currentFile file
+        history.replace({
+          pathname: routes.workspaceWithFilePath.path({
+            extension: currentFile.extension,
+            fileRelativePath: currentFile.relativePathWithoutExtension,
+            workspaceId,
+          }),
+        });
+      }
+    },
+    [
+      apllyingAcceleratorAlert,
+      applyAcceleratorFailAlert,
+      applyAcceleratorSuccessAlert,
+      attemptToDeleteTemporaryBranches,
+      gitConfig,
+      history,
+      i18n.accelerators,
+      i18n.names.businessModeler.online,
+      routes.workspaceWithFilePath,
+      workspace.descriptor.workspaceId,
+      workspaces,
+    ]
+  );
+
+  return { applyAcceleratorToWorkspace };
+}
+
+export function useCurrentAccelerator(workspaceId: string) {
+  const [currentAccelerator, setCurrentAccelerator] = useState<AcceleratorAppliedConfig>();
+
+  const acceleratorConfigFile = useWorkspaceFilePromise(workspaceId, ACCELERATOR_CONFIG_FILE_RELATIVE_PATH);
+
+  const getCurrentAccelerator = useCallback(async () => {
+    if (!acceleratorConfigFile?.data) {
+      return;
+    }
+
+    return yaml.load(
+      await acceleratorConfigFile.data.workspaceFile.getFileContentsAsString()
+    ) as AcceleratorAppliedConfig;
+  }, [acceleratorConfigFile.data]);
+
+  useCancelableEffect(
+    useCallback(
+      ({ canceled }) => {
+        getCurrentAccelerator().then((accelerator) => {
+          if (canceled.get()) {
+            return;
+          }
+          setCurrentAccelerator(accelerator);
+        });
+      },
+      [getCurrentAccelerator]
+    )
+  );
+
+  return currentAccelerator;
+}
diff --git a/packages/online-editor/src/authSessions/AuthSessionSelect.tsx b/packages/online-editor/src/authSessions/AuthSessionSelect.tsx
index f4ea420f71..e2e8a9f8c3 100644
--- a/packages/online-editor/src/authSessions/AuthSessionSelect.tsx
+++ b/packages/online-editor/src/authSessions/AuthSessionSelect.tsx
@@ -29,8 +29,7 @@ import { IconSize } from "@patternfly/react-icons/dist/js/createIcon";
 import { AuthProvider, AuthProviderGroup } from "../authProviders/AuthProvidersApi";
 import { useEffect, useMemo, useState } from "react";
 import { ValidatedOptions } from "@patternfly/react-core/dist/js/helpers";
-import { Button } from "@patternfly/react-core/dist/js/components/Button";
-import { ButtonVariant } from "@patternfly/react-core";
+import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
 import PlusIcon from "@patternfly/react-icons/dist/js/icons/plus-icon";
 import { Divider } from "@patternfly/react-core/dist/js/components/Divider";
 import { AccountsDispatchActionKind, useAccountsDispatch } from "../accounts/AccountsContext";
diff --git a/packages/online-editor/src/editor/EditorPage.tsx b/packages/online-editor/src/editor/EditorPage.tsx
index 60c8a43a61..0b1889ebd7 100644
--- a/packages/online-editor/src/editor/EditorPage.tsx
+++ b/packages/online-editor/src/editor/EditorPage.tsx
@@ -18,7 +18,7 @@ import * as React from "react";
 import { useCallback, useEffect, useMemo, useRef, useState } from "react";
 import { useHistory } from "react-router";
 import { useRoutes } from "../navigation/Hooks";
-import { EditorToolbar } from "./EditorToolbar";
+import { EditorToolbar } from "./Toolbar/EditorToolbar";
 import { useDmnTour } from "../tour";
 import { useOnlineI18n } from "../i18n";
 import { ChannelType } from "@kie-tools-core/editor/dist/api";
diff --git a/packages/online-editor/src/editor/EditorToolbar.tsx b/packages/online-editor/src/editor/EditorToolbar.tsx
deleted file mode 100644
index 148a3b2c10..0000000000
--- a/packages/online-editor/src/editor/EditorToolbar.tsx
+++ /dev/null
@@ -1,2237 +0,0 @@
-/*
- * Copyright 2019 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import {
-  Dropdown,
-  DropdownGroup,
-  DropdownItem,
-  DropdownPosition,
-  DropdownToggle,
-} from "@patternfly/react-core/dist/js/components/Dropdown";
-import { TextInput } from "@patternfly/react-core/dist/js/components/TextInput";
-import { Title } from "@patternfly/react-core/dist/js/components/Title";
-import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
-import {
-  Toolbar,
-  ToolbarContent,
-  ToolbarGroup,
-  ToolbarItem,
-  ToolbarItemProps,
-} from "@patternfly/react-core/dist/js/components/Toolbar";
-import { EllipsisVIcon } from "@patternfly/react-icons/dist/js/icons/ellipsis-v-icon";
-import { SaveIcon } from "@patternfly/react-icons/dist/js/icons/save-icon";
-import { AngleLeftIcon } from "@patternfly/react-icons/dist/js/icons/angle-left-icon";
-import * as React from "react";
-import { useCallback, useEffect, useMemo, useRef, useState } from "react";
-import { useOnlineI18n } from "../i18n";
-import { KieSandboxExtendedServicesButtons } from "./KieSandboxExtendedServices/KieSandboxExtendedServicesButtons";
-import {
-  useNavigationBlockersBypass,
-  useNavigationStatus,
-  useNavigationStatusToggle,
-  useRoutes,
-} from "../navigation/Hooks";
-import { EmbeddedEditorRef, useDirtyState } from "@kie-tools-core/editor/dist/embedded";
-import { useHistory } from "react-router";
-import { EmbedModal } from "./EmbedModal";
-import { Alert, AlertActionCloseButton, AlertActionLink } from "@patternfly/react-core/dist/js/components/Alert";
-import { useWorkspaces, WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
-import { OutlinedClockIcon } from "@patternfly/react-icons/dist/js/icons/outlined-clock-icon";
-import { FolderIcon } from "@patternfly/react-icons/dist/js/icons/folder-icon";
-import { ImageIcon } from "@patternfly/react-icons/dist/js/icons/image-icon";
-import { DownloadIcon } from "@patternfly/react-icons/dist/js/icons/download-icon";
-import { PlusIcon } from "@patternfly/react-icons/dist/js/icons/plus-icon";
-import { ArrowCircleUpIcon } from "@patternfly/react-icons/dist/js/icons/arrow-circle-up-icon";
-import { ColumnsIcon } from "@patternfly/react-icons/dist/js/icons/columns-icon";
-import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
-import { Flex, FlexItem } from "@patternfly/react-core/dist/js/layouts/Flex";
-import { NewFileDropdownMenu } from "./NewFileDropdownMenu";
-import { PageHeaderToolsItem, PageSection } from "@patternfly/react-core/dist/js/components/Page";
-import { FileLabel } from "../filesList/FileLabel";
-import { useWorkspacePromise } from "@kie-tools-core/workspaces-git-fs/dist/hooks/WorkspaceHooks";
-import { OutlinedHddIcon } from "@patternfly/react-icons/dist/js/icons/outlined-hdd-icon";
-import { DesktopIcon } from "@patternfly/react-icons/dist/js/icons/desktop-icon";
-import { FileSwitcher } from "./FileSwitcher";
-import { Divider } from "@patternfly/react-core/dist/js/components/Divider";
-import { KieSandboxExtendedServicesDropdownGroup } from "./KieSandboxExtendedServices/KieSandboxExtendedServicesDropdownGroup";
-import { TrashIcon } from "@patternfly/react-icons/dist/js/icons/trash-icon";
-import { CaretDownIcon } from "@patternfly/react-icons/dist/js/icons/caret-down-icon";
-import {
-  GIST_ORIGIN_REMOTE_NAME,
-  GIT_ORIGIN_REMOTE_NAME,
-} from "@kie-tools-core/workspaces-git-fs/dist/constants/GitConstants";
-import { WorkspaceKind } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceOrigin";
-import { PromiseStateWrapper } from "@kie-tools-core/react-hooks/dist/PromiseState";
-import { Spinner } from "@patternfly/react-core/dist/js/components/Spinner";
-import { WorkspaceLabel } from "../workspace/components/WorkspaceLabel";
-import { EditorPageDockDrawerRef } from "./EditorPageDockDrawer";
-import { SyncAltIcon } from "@patternfly/react-icons/dist/js/icons/sync-alt-icon";
-import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
-import { UrlType, useImportableUrl } from "../importFromUrl/ImportableUrlHooks";
-import { Location } from "history";
-import { ExternalLinkAltIcon } from "@patternfly/react-icons/dist/js/icons/external-link-alt-icon";
-import { useEditorEnvelopeLocator } from "../envelopeLocator/hooks/EditorEnvelopeLocatorContext";
-import { useCancelableEffect } from "@kie-tools-core/react-hooks/dist/useCancelableEffect";
-import type { RestEndpointMethodTypes as OctokitRestEndpointMethodTypes } from "@octokit/plugin-rest-endpoint-methods/dist-types/generated/parameters-and-response-types";
-import { useSharedValue } from "@kie-tools-core/envelope-bus/dist/hooks";
-import { WorkspaceStatusIndicator } from "../workspace/components/WorkspaceStatusIndicator";
-import { ResponsiveDropdown } from "../ResponsiveDropdown/ResponsiveDropdown";
-import { ResponsiveDropdownToggle } from "../ResponsiveDropdown/ResponsiveDropdownToggle";
-import { useAuthSession } from "../authSessions/AuthSessionsContext";
-import { AuthSessionSelect, AuthSessionSelectFilter } from "../authSessions/AuthSessionSelect";
-import { useAuthProvider } from "../authProviders/AuthProvidersContext";
-import { useGitHubClient } from "../github/Hooks";
-import { AccountsDispatchActionKind, useAccountsDispatch } from "../accounts/AccountsContext";
-import { SelectPosition } from "@patternfly/react-core/dist/js/components/Select";
-import {
-  authSessionsSelectFilterCompatibleWithGistOrSnippetUrlDomain,
-  authSessionsSelectFilterCompatibleWithGitUrlDomain,
-  gitAuthSessionSelectFilter,
-} from "../authSessions/CompatibleAuthSessions";
-import { WorkspaceDescriptor } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceDescriptor";
-import { useGlobalAlert, useGlobalAlertsDispatchContext } from "../alerts";
-import {
-  AuthProviderGroup,
-  GistEnabledAuthProviderType,
-  GitAuthProviderType,
-  isGistEnabledAuthProviderType,
-} from "../authProviders/AuthProvidersApi";
-import { CreateGitRepositoryModal, CreateRepositoryResponse } from "./CreateGitRepositoryModal";
-import { BitbucketIcon, GitIcon, GithubIcon } from "@patternfly/react-icons";
-import { useBitbucketClient } from "../bitbucket/Hooks";
-import {
-  isGistLikeWorkspaceKind,
-  WorkspaceKindGistLike,
-  WorkspaceKindGitBased,
-} from "@kie-tools-core/workspaces-git-fs/src/worker/api/WorkspaceOrigin";
-import { switchExpression } from "../switchExpression/switchExpression";
-import { CreateGistOrSnippetModal } from "./CreateGistOrSnippetModal";
-
-export interface Props {
-  editor: EmbeddedEditorRef | undefined;
-  workspaceFile: WorkspaceFile;
-  editorPageDock: EditorPageDockDrawerRef | undefined;
-}
-
-const showWhenSmall: ToolbarItemProps["visibility"] = {
-  default: "visible",
-  "2xl": "hidden",
-  xl: "hidden",
-  lg: "visible",
-  md: "visible",
-};
-
-const hideWhenSmall: ToolbarItemProps["visibility"] = {
-  default: "hidden",
-  "2xl": "visible",
-  xl: "visible",
-  lg: "hidden",
-  md: "hidden",
-};
-
-const hideWhenTiny: ToolbarItemProps["visibility"] = {
-  default: "hidden",
-  "2xl": "visible",
-  xl: "visible",
-  lg: "visible",
-  md: "hidden",
-};
-
-export function EditorToolbar(props: Props) {
-  const routes = useRoutes();
-  const editorEnvelopeLocator = useEditorEnvelopeLocator();
-  const history = useHistory();
-  const workspaces = useWorkspaces();
-  const accountsDispatch = useAccountsDispatch();
-  const [isShareDropdownOpen, setShareDropdownOpen] = useState(false);
-  const [isSyncGistOrSnippetDropdownOpen, setSyncGistOrSnippetDropdownOpen] = useState(false);
-  const [isSyncGitRepositoryDropdownOpen, setSyncGitRepositoryDropdownOpen] = useState(false);
-  const [isLargeKebabOpen, setLargeKebabOpen] = useState(false);
-  const [isSmallKebabOpen, setSmallKebabOpen] = useState(false);
-  const [isEmbedModalOpen, setEmbedModalOpen] = useState(false);
-  const { i18n } = useOnlineI18n();
-  const alertsDispatch = useGlobalAlertsDispatchContext();
-  const isEdited = useDirtyState(props.editor);
-  const downloadRef = useRef<HTMLAnchorElement>(null);
-  const downloadAllRef = useRef<HTMLAnchorElement>(null);
-  const downloadPreviewRef = useRef<HTMLAnchorElement>(null);
-  const copyContentTextArea = useRef<HTMLTextAreaElement>(null);
-  const [isNewFileDropdownMenuOpen, setNewFileDropdownMenuOpen] = useState(false);
-  const workspacePromise = useWorkspacePromise(props.workspaceFile.workspaceId);
-  const [isGistOrSnippetLoading, setGistOrSnippetLoading] = useState(false);
-  const [gitHubGist, setGitHubGist] =
-    useState<OctokitRestEndpointMethodTypes["gists"]["get"]["response"]["data"] | undefined>(undefined);
-  const [bitbucketSnippet, setBitbucketSnippet] = useState<any>(undefined);
-  const workspaceImportableUrl = useImportableUrl(workspacePromise.data?.descriptor.origin.url?.toString());
-
-  const { authSession, authInfo, gitConfig } = useAuthSession(workspacePromise.data?.descriptor.gitAuthSessionId);
-  const authProvider = useAuthProvider(authSession);
-
-  const gitHubClient = useGitHubClient(authSession);
-  const bitbucketClient = useBitbucketClient(authSession);
-
-  const canPushToGitRepository = useMemo(
-    () => authSession?.type === "git" && !!authProvider,
-    [authProvider, authSession?.type]
-  );
-  const navigationBlockersBypass = useNavigationBlockersBypass();
-
-  const [flushes] = useSharedValue(
-    workspaces.workspacesSharedWorker.workspacesWorkerBus.clientApi.shared.kieSandboxWorkspacesStorage_flushes
-  );
-
-  const authSessionSelectFilter = useMemo(() => {
-    if (!workspacePromise.data) {
-      return gitAuthSessionSelectFilter();
-    }
-
-    if (workspacePromise.data.descriptor.origin.kind === WorkspaceKind.LOCAL) {
-      return gitAuthSessionSelectFilter();
-    }
-
-    if (workspacePromise.data.descriptor.origin.kind === WorkspaceKind.GIT) {
-      return authSessionsSelectFilterCompatibleWithGitUrlDomain(
-        new URL(workspacePromise.data.descriptor.origin.url).hostname
-      );
-    }
-
-    if (workspacePromise.data.descriptor.origin.kind === WorkspaceKind.GITHUB_GIST) {
-      return authSessionsSelectFilterCompatibleWithGistOrSnippetUrlDomain(
-        new URL(workspacePromise.data.descriptor.origin.url).hostname,
-        gitHubGist?.owner?.login
-      );
-    }
-
-    if (workspacePromise.data.descriptor.origin.kind === WorkspaceKind.BITBUCKET_SNIPPET) {
-      return authSessionsSelectFilterCompatibleWithGistOrSnippetUrlDomain(
-        new URL(workspacePromise.data.descriptor.origin.url).hostname,
-        bitbucketSnippet?.owner?.login
-      );
-    }
-
-    return gitAuthSessionSelectFilter();
-  }, [bitbucketSnippet?.owner?.login, gitHubGist?.owner?.login, workspacePromise.data]);
-
-  const isSaved = useMemo(() => {
-    return !isEdited && flushes && !flushes.some((f) => f.includes(props.workspaceFile.workspaceId));
-  }, [isEdited, flushes, props.workspaceFile.workspaceId]);
-
-  // Prevent from closing without flushing before.
-  useEffect(() => {
-    if (isSaved) {
-      return;
-    }
-
-    window.onbeforeunload = () => "Some changes are not written to disk yet.";
-    return () => {
-      window.onbeforeunload = null;
-    };
-  }, [isSaved]);
-
-  useCancelableEffect(
-    useCallback(
-      ({ canceled }) => {
-        if (gitHubGist || workspaceImportableUrl.type !== UrlType.GIST_DOT_GITHUB_DOT_COM) {
-          return;
-        }
-
-        const { gistId } = workspaceImportableUrl;
-
-        if (!gistId) {
-          return;
-        }
-
-        gitHubClient.gists.get({ gist_id: gistId }).then(({ data: gist }) => {
-          if (canceled.get()) {
-            return;
-          }
-
-          if (gist) {
-            setGitHubGist(gist);
-          }
-        });
-      },
-      [gitHubGist, workspaceImportableUrl, gitHubClient.gists]
-    )
-  );
-
-  useCancelableEffect(
-    useCallback(
-      ({ canceled }) => {
-        if (bitbucketSnippet || workspaceImportableUrl.type !== UrlType.BITBUCKET_DOT_ORG_SNIPPET) {
-          return;
-        }
-
-        const { snippetId, org } = workspaceImportableUrl;
-
-        if (!snippetId || !org) {
-          return;
-        }
-
-        bitbucketClient.getSnippet({ workspace: org, snippetId }).then(async (response) => {
-          if (canceled.get()) {
-            return;
-          }
-          const json = await response.json();
-          setBitbucketSnippet(json);
-        });
-      },
-      [bitbucketSnippet, workspaceImportableUrl, bitbucketClient]
-    )
-  );
-
-  const successfullyCreatedGistOrSnippetAlert = useGlobalAlert(
-    useCallback(
-      ({ close }) => {
-        if (!isGistLikeWorkspaceKind(workspacePromise.data?.descriptor.origin.kind)) {
-          return <></>;
-        }
-
-        const gistOrSnippetUrl = workspacePromise.data?.descriptor.origin.url;
-        return (
-          <Alert
-            variant="success"
-            title={switchExpression(workspacePromise.data?.descriptor.origin.kind, {
-              GITHUB_GIST: i18n.editorPage.alerts.createGist,
-              BITBUCKET_SNIPPET: i18n.editorPage.alerts.createSnippet,
-            })}
-            actionClose={<AlertActionCloseButton onClose={close} />}
-            actionLinks={
-              <AlertActionLink onClick={() => window.open(gistOrSnippetUrl, "_blank")}>
-                {gistOrSnippetUrl}
-              </AlertActionLink>
-            }
-          />
-        );
-      },
-      [
-        i18n.editorPage.alerts.createGist,
-        i18n.editorPage.alerts.createSnippet,
-        workspacePromise.data?.descriptor.origin.kind,
-        workspacePromise.data?.descriptor.origin.url,
-      ]
-    ),
-    { durationInSeconds: 4 }
-  );
-
-  const loadingGistOrSnippetAlert = useGlobalAlert(
-    useCallback(
-      ({ close }) => {
-        if (!isGistLikeWorkspaceKind(workspacePromise.data?.descriptor.origin.kind)) {
-          return <></>;
-        }
-
-        const gistOrSnippetUrl = workspacePromise.data?.descriptor.origin.url;
-        return (
-          <Alert
-            variant="info"
-            title={
-              <>
-                <Spinner size={"sm"} />
-                &nbsp;&nbsp; Updating{" "}
-                {switchExpression(workspacePromise.data?.descriptor.origin.kind, {
-                  BITBUCKET_SNIPPET: "Snippet",
-                  GITHUB_GIST: "Gist",
-                })}
-                ...
-              </>
-            }
-            actionClose={<AlertActionCloseButton onClose={close} />}
-            actionLinks={
-              <AlertActionLink onClick={() => window.open(gistOrSnippetUrl, "_blank")}>
-                {gistOrSnippetUrl}
-              </AlertActionLink>
-            }
-          />
-        );
-      },
-      [workspacePromise.data?.descriptor.origin.kind, workspacePromise.data?.descriptor.origin.url]
-    )
-  );
-
-  useEffect(() => {
-    if (isGistOrSnippetLoading) {
-      loadingGistOrSnippetAlert.show();
-    } else {
-      loadingGistOrSnippetAlert.close();
-    }
-  }, [isGistOrSnippetLoading, loadingGistOrSnippetAlert]);
-
-  const successfullyUpdatedGistOrSnippetAlert = useGlobalAlert(
-    useCallback(
-      ({ close }) => {
-        if (!isGistLikeWorkspaceKind(workspacePromise.data?.descriptor.origin.kind)) {
-          return <></>;
-        }
-
-        const gistOrSnippetUrl = workspacePromise.data?.descriptor.origin.url;
-        return (
-          <Alert
-            variant="success"
-            title={switchExpression(workspacePromise.data?.descriptor.origin.kind, {
-              GITHUB_GIST: i18n.editorPage.alerts.updateGist,
-              BITBUCKET_SNIPPET: i18n.editorPage.alerts.updateSnippet,
-            })}
-            actionClose={<AlertActionCloseButton onClose={close} />}
-            actionLinks={
-              <AlertActionLink onClick={() => window.open(gistOrSnippetUrl, "_blank")}>
-                {gistOrSnippetUrl}
-              </AlertActionLink>
-            }
-          />
-        );
-      },
-      [
-        i18n.editorPage.alerts.updateGist,
-        i18n.editorPage.alerts.updateSnippet,
-        workspacePromise.data?.descriptor.origin.kind,
-        workspacePromise.data?.descriptor.origin.url,
-      ]
-    ),
-    { durationInSeconds: 4 }
-  );
-
-  const errorAlert = useGlobalAlert(
-    useCallback(
-      ({ close }) => (
-        <Alert
-          variant="danger"
-          title={i18n.editorPage.alerts.error}
-          actionClose={<AlertActionCloseButton onClose={close} />}
-        />
-      ),
-      [i18n]
-    )
-  );
-
-  const shouldIncludeDownloadSvgDropdownItem = useMemo(() => {
-    return props.workspaceFile.extension.toLowerCase() !== "pmml";
-  }, [props.workspaceFile]);
-
-  const shouldIncludeEmbedDropdownItem = useMemo(() => {
-    return props.workspaceFile.extension.toLowerCase() !== "pmml";
-  }, [props.workspaceFile]);
-
-  const onDownload = useCallback(() => {
-    props.editor?.getStateControl().setSavedCommand();
-    alertsDispatch.closeAll();
-    props.workspaceFile.getFileContents().then((content) => {
-      if (downloadRef.current) {
-        const fileBlob = new Blob([content], { type: "text/plain" });
-        downloadRef.current.href = URL.createObjectURL(fileBlob);
-        downloadRef.current.click();
-      }
-    });
-  }, [props.editor, props.workspaceFile, alertsDispatch]);
-
-  const downloadWorkspaceZip = useCallback(async () => {
-    if (!props.editor) {
-      return;
-    }
-
-    const zipBlob = await workspaces.prepareZip({ workspaceId: props.workspaceFile.workspaceId });
-    if (downloadAllRef.current) {
-      downloadAllRef.current.href = URL.createObjectURL(zipBlob);
-      downloadAllRef.current.click();
-    }
-    if (workspacePromise.data?.descriptor.origin.kind === WorkspaceKind.LOCAL) {
-      await workspaces.createSavePoint({ workspaceId: props.workspaceFile.workspaceId, gitConfig });
-    }
-  }, [
-    props.editor,
-    props.workspaceFile.workspaceId,
-    workspaces,
-    workspacePromise.data?.descriptor.origin.kind,
-    gitConfig,
-  ]);
-
-  const downloadSvg = useCallback(() => {
-    props.editor?.getPreview().then((previewSvg) => {
-      if (downloadPreviewRef.current && previewSvg) {
-        const fileBlob = new Blob([previewSvg], { type: "image/svg+xml" });
-        downloadPreviewRef.current.href = URL.createObjectURL(fileBlob);
-        downloadPreviewRef.current.click();
-      }
-    });
-  }, [props.editor]);
-
-  const forceUpdateGistOrSnippet = useCallback(async () => {
-    try {
-      if (!authInfo || !workspacePromise.data) {
-        return;
-      }
-
-      setGistOrSnippetLoading(true);
-
-      await workspaces.push({
-        workspaceId: props.workspaceFile.workspaceId,
-        remote: GIST_ORIGIN_REMOTE_NAME,
-        ref: workspacePromise.data.descriptor.origin.branch,
-        remoteRef: `refs/heads/${workspacePromise.data.descriptor.origin.branch}`,
-        force: true,
-        authInfo,
-      });
-
-      await workspaces.pull({
-        workspaceId: props.workspaceFile.workspaceId,
-        authInfo,
-      });
-    } catch (e) {
-      errorAlert.show();
-    } finally {
-      setGistOrSnippetLoading(false);
-      setSyncGistOrSnippetDropdownOpen(false);
-    }
-
-    successfullyUpdatedGistOrSnippetAlert.show();
-  }, [
-    successfullyUpdatedGistOrSnippetAlert,
-    authInfo,
-    workspacePromise.data,
-    workspaces,
-    props.workspaceFile.workspaceId,
-    errorAlert,
-  ]);
-
-  const errorPushingGistOrSnippet = useGlobalAlert(
-    useCallback(
-      ({ close }) => {
-        return (
-          <Alert
-            variant="danger"
-            title={switchExpression(workspacePromise.data?.descriptor.origin.kind as WorkspaceKindGistLike, {
-              GITHUB_GIST: i18n.editorPage.alerts.errorPushingGist,
-              BITBUCKET_SNIPPET: i18n.editorPage.alerts.errorPushingSnippet,
-            })}
-            actionLinks={[
-              <AlertActionLink
-                key="force"
-                onClick={() => {
-                  close();
-                  forceUpdateGistOrSnippet();
-                }}
-              >
-                Push forcefully
-              </AlertActionLink>,
-              <AlertActionLink key="dismiss" onClick={close}>
-                Dismiss
-              </AlertActionLink>,
-            ]}
-            actionClose={<AlertActionCloseButton onClose={close} />}
-          >
-            <b>{i18n.editorPage.alerts.forcePushWarning}</b>
-          </Alert>
-        );
-      },
-      [
-        workspacePromise.data?.descriptor.origin.kind,
-        i18n.editorPage.alerts.errorPushingGist,
-        i18n.editorPage.alerts.errorPushingSnippet,
-        i18n.editorPage.alerts.forcePushWarning,
-        forceUpdateGistOrSnippet,
-      ]
-    )
-  );
-
-  const updateGistOrSnippet = useCallback(async () => {
-    try {
-      if (
-        !authInfo ||
-        !workspacePromise.data ||
-        !isGistEnabledAuthProviderType(authProvider?.type) ||
-        !isGistLikeWorkspaceKind(workspacePromise.data.descriptor.origin.kind)
-      ) {
-        return;
-      }
-      setGistOrSnippetLoading(true);
-
-      await workspaces.createSavePoint({
-        workspaceId: props.workspaceFile.workspaceId,
-        gitConfig,
-      });
-
-      await workspaces.push({
-        workspaceId: props.workspaceFile.workspaceId,
-        remote: GIST_ORIGIN_REMOTE_NAME,
-        ref: workspacePromise.data.descriptor.origin.branch,
-        remoteRef: `refs/heads/${workspacePromise.data.descriptor.origin.branch}`,
-        force: false,
-        authInfo,
-      });
-
-      await workspaces.pull({
-        workspaceId: props.workspaceFile.workspaceId,
-        authInfo,
-      });
-    } catch (e) {
-      errorPushingGistOrSnippet.show();
-      throw e;
-    } finally {
-      setGistOrSnippetLoading(false);
-      setSyncGistOrSnippetDropdownOpen(false);
-    }
-
-    successfullyUpdatedGistOrSnippetAlert.show();
-  }, [
-    successfullyUpdatedGistOrSnippetAlert,
-    authInfo,
-    workspacePromise.data,
-    authProvider?.type,
-    workspaces,
-    props.workspaceFile.workspaceId,
-    gitConfig,
-    errorPushingGistOrSnippet,
-  ]);
-
-  const forkGitHubGist = useCallback(async () => {
-    try {
-      if (!authSession || !authInfo || !gitHubGist?.id || !workspacePromise.data) {
-        return;
-      }
-
-      setGistOrSnippetLoading(true);
-
-      // Fork Gist
-      const gist = await gitHubClient.gists.fork({
-        gist_id: gitHubGist.id,
-      });
-
-      const remoteName = gist.data.id;
-
-      // Adds forked gist remote to current one
-      await workspaces.addRemote({
-        workspaceId: props.workspaceFile.workspaceId,
-        url: gist.data.git_push_url,
-        name: remoteName,
-        force: true,
-      });
-
-      // Commit
-      await workspaces.createSavePoint({
-        workspaceId: props.workspaceFile.workspaceId,
-        gitConfig,
-      });
-
-      // Push to forked gist remote
-      await workspaces.push({
-        workspaceId: props.workspaceFile.workspaceId,
-        remote: remoteName,
-        ref: workspacePromise.data.descriptor.origin.branch,
-        remoteRef: `refs/heads/${workspacePromise.data.descriptor.origin.branch}`,
-        force: true,
-        authInfo,
-      });
-
-      // Redirect to import workspace
-      navigationBlockersBypass.execute(() => {
-        history.push({
-          pathname: routes.import.path({}),
-          search: routes.import.queryString({
-            url: gist.data.html_url,
-            authSessionId: authSession.id,
-          }),
-        });
-      });
-    } catch (err) {
-      errorAlert.show();
-      throw err;
-    } finally {
-      setGistOrSnippetLoading(false);
-    }
-  }, [
-    authSession,
-    authInfo,
-    gitHubGist,
-    workspacePromise.data,
-    gitHubClient.gists,
-    workspaces,
-    props.workspaceFile.workspaceId,
-    gitConfig,
-    navigationBlockersBypass,
-    history,
-    routes.import,
-    errorAlert,
-  ]);
-
-  const openEmbedModal = useCallback(() => {
-    setEmbedModalOpen(true);
-  }, []);
-
-  const workspaceHasNestedDirectories = useMemo(
-    () => workspacePromise.data?.files.filter((f) => f.relativePath !== f.name).length !== 0,
-    [workspacePromise]
-  );
-
-  const isGitHubGistOwner = useMemo(() => {
-    return authInfo?.username && gitHubGist?.owner?.login === authInfo.username;
-  }, [authInfo, gitHubGist]);
-
-  const isBitbucketSnippetOwner = useMemo(() => {
-    return authInfo?.uuid && bitbucketSnippet?.creator.uuid === authInfo.uuid;
-  }, [authInfo, bitbucketSnippet]);
-
-  const isGistOrSnippetOwner = isGitHubGistOwner || isBitbucketSnippetOwner;
-
-  const canCreateGitHubRepository = useMemo(() => authProvider?.type === "github", [authProvider?.type]);
-  const canCreateBitbucketRepository = useMemo(() => authProvider?.type === "bitbucket", [authProvider?.type]);
-  const canCreateGitRepository = useMemo(
-    () => canCreateGitHubRepository || canCreateBitbucketRepository,
-    [canCreateGitHubRepository, canCreateBitbucketRepository]
-  );
-
-  const canCreateGistOrSnippet = useMemo(
-    () =>
-      authProvider &&
-      isGistEnabledAuthProviderType(authProvider?.type) &&
-      workspacePromise.data?.descriptor.origin.kind === WorkspaceKind.LOCAL &&
-      !workspaceHasNestedDirectories,
-    [authProvider, workspacePromise.data?.descriptor.origin.kind, workspaceHasNestedDirectories]
-  );
-
-  const canUpdateGistOrSnippet = useMemo(
-    () =>
-      authProvider &&
-      isGistEnabledAuthProviderType(authProvider?.type) &&
-      !!isGistOrSnippetOwner &&
-      workspacePromise.data &&
-      isGistLikeWorkspaceKind(workspacePromise.data?.descriptor.origin.kind) &&
-      !workspaceHasNestedDirectories,
-    [authProvider, isGistOrSnippetOwner, workspacePromise.data, workspaceHasNestedDirectories]
-  );
-
-  const canForkGitHubGist = useMemo(
-    () =>
-      authProvider?.type === "github" &&
-      !isGistOrSnippetOwner &&
-      workspacePromise.data?.descriptor.origin.kind === WorkspaceKind.GITHUB_GIST &&
-      !workspaceHasNestedDirectories,
-    [
-      authProvider?.type,
-      isGistOrSnippetOwner,
-      workspacePromise.data?.descriptor.origin.kind,
-      workspaceHasNestedDirectories,
-    ]
-  );
-
-  const changeGitAuthSessionId = useCallback(
-    (newGitAuthSessionId: React.SetStateAction<string | undefined>, lastAuthSessionId: string | undefined) => {
-      workspaces.changeGitAuthSessionId({
-        workspaceId: props.workspaceFile.workspaceId,
-        gitAuthSessionId:
-          typeof newGitAuthSessionId === "function" ? newGitAuthSessionId(lastAuthSessionId) : newGitAuthSessionId,
-      });
-    },
-    [props.workspaceFile.workspaceId, workspaces]
-  );
-
-  const [isCreateGitRepositoryModalOpen, setCreateGitRepositoryModalOpen] = useState(false);
-  const [isCreateGistOrSnippetModalOpen, setCreateGistOrSnippetModalOpen] = useState(false);
-
-  const shareDropdownItems = useMemo(
-    () => [
-      <DropdownGroup key={"download-group"} label="Download">
-        <DropdownItem
-          onClick={onDownload}
-          key={"download-file-item"}
-          description={`${props.workspaceFile.name} will be downloaded`}
-          icon={<DownloadIcon />}
-          ouiaId="download-file-dropdown-button"
-        >
-          Current file
-        </DropdownItem>
-        {shouldIncludeDownloadSvgDropdownItem && (
-          <DropdownItem
-            key={`dropdown-download-svg`}
-            data-testid="dropdown-download-svg"
-            component="button"
-            onClick={downloadSvg}
-            description={`Image of ${props.workspaceFile.name} will be downloaded in SVG format`}
-            icon={<ImageIcon />}
-          >
-            {"Current file's SVG"}
-          </DropdownItem>
-        )}
-        <DropdownItem
-          onClick={downloadWorkspaceZip}
-          key={"download-zip-item"}
-          description={`A zip file including all files will be downloaded`}
-          icon={<FolderIcon />}
-        >
-          All files
-        </DropdownItem>
-      </DropdownGroup>,
-      ...(shouldIncludeEmbedDropdownItem
-        ? [
-            <Divider key={"divider-other-group"} />,
-            <DropdownGroup key={"other-group"} label="Other">
-              <DropdownItem
-                key={`dropdown-embed`}
-                data-testid="dropdown-embed"
-                component="button"
-                onClick={openEmbedModal}
-                icon={<ColumnsIcon />}
-              >
-                {i18n.editorToolbar.embed}...
-              </DropdownItem>
-            </DropdownGroup>,
-          ]
-        : []),
-      ...(workspacePromise.data &&
-      (workspacePromise.data?.descriptor.origin.kind === WorkspaceKind.LOCAL ||
-        isGistLikeWorkspaceKind(workspacePromise.data?.descriptor.origin.kind))
-        ? [
-            <DropdownGroup key={"git-group"} label={i18n.names.git}>
-              <Alert
-                isInline={true}
-                variant={"info"}
-                title={"Authentication source"}
-                actionLinks={
-                  <AuthSessionSelect
-                    title={`Select Git authentication for '${workspacePromise.data.descriptor.name}'...`}
-                    position={SelectPosition.right}
-                    isPlain={false}
-                    authSessionId={workspacePromise.data.descriptor.gitAuthSessionId}
-                    showOnlyThisAuthProviderGroupWhenConnectingToNewAccount={AuthProviderGroup.GIT}
-                    setAuthSessionId={(newAuthSessionId) => {
-                      changeGitAuthSessionId(newAuthSessionId, workspacePromise.data?.descriptor.gitAuthSessionId);
-                      setTimeout(() => {
-                        accountsDispatch({ kind: AccountsDispatchActionKind.CLOSE });
-                        setShareDropdownOpen(true);
-                        setSmallKebabOpen(true);
-                      }, 0);
-                    }}
-                    filter={authSessionSelectFilter}
-                  />
-                }
-              >
-                {`Manage authentication sources for '${workspacePromise.data.descriptor.name}' to be able to create Repository, GitHub Gist or Bitbucket Snippet.`}
-              </Alert>
-              {canCreateGitRepository && (
-                <Tooltip
-                  data-testid={"create-git-repository-tooltip"}
-                  key={`dropdown-create-git-repository`}
-                  content={<div>{"Click to create a repository."}</div>}
-                  trigger={!canCreateGitRepository ? "mouseenter click" : ""}
-                  position="left"
-                >
-                  <DropdownItem
-                    icon={switchExpression(authProvider?.type as GitAuthProviderType, {
-                      bitbucket: <BitbucketIcon />,
-                      github: <GithubIcon />,
-                      default: <GitIcon />,
-                    })}
-                    data-testid={"create-git-repository-button"}
-                    component="button"
-                    onClick={() => setCreateGitRepositoryModalOpen(true)}
-                    isDisabled={!canCreateGitRepository}
-                  >
-                    Create{" "}
-                    {switchExpression(authProvider?.type as GitAuthProviderType, {
-                      github: "GitHub repository",
-                      bitbucket: "Bitbucket repository",
-                      default: "Git repository",
-                    })}
-                    ...
-                  </DropdownItem>
-                </Tooltip>
-              )}
-              {canCreateGistOrSnippet && (
-                <Tooltip
-                  data-testid={"create-gist-or-snippet-tooltip"}
-                  key={`dropdown-create-gist-or-snippet`}
-                  content={
-                    <div>
-                      {switchExpression(authProvider?.type as GistEnabledAuthProviderType, {
-                        github: i18n.editorToolbar.cantCreateGistTooltip,
-                        bitbucket: i18n.editorToolbar.cantCreateSnippetTooltip,
-                      })}
-                    </div>
-                  }
-                  trigger={!canCreateGistOrSnippet ? "mouseenter click" : ""}
-                  position="left"
-                >
-                  <DropdownItem
-                    icon={switchExpression(authProvider?.type as GistEnabledAuthProviderType, {
-                      bitbucket: <BitbucketIcon />,
-                      github: <GithubIcon />,
-                    })}
-                    data-testid={"create-gist-or-snippet-button"}
-                    component="button"
-                    onClick={() => setCreateGistOrSnippetModalOpen(true)}
-                    isDisabled={!canCreateGistOrSnippet}
-                  >
-                    {switchExpression(authProvider?.type as GistEnabledAuthProviderType, {
-                      github: i18n.editorToolbar.createGist,
-                      bitbucket: i18n.editorToolbar.createSnippet,
-                    })}
-                  </DropdownItem>
-                </Tooltip>
-              )}
-            </DropdownGroup>,
-          ]
-        : []),
-    ],
-    [
-      onDownload,
-      props.workspaceFile.name,
-      shouldIncludeDownloadSvgDropdownItem,
-      downloadSvg,
-      downloadWorkspaceZip,
-      shouldIncludeEmbedDropdownItem,
-      openEmbedModal,
-      i18n.editorToolbar.embed,
-      i18n.editorToolbar.cantCreateGistTooltip,
-      i18n.editorToolbar.cantCreateSnippetTooltip,
-      i18n.editorToolbar.createGist,
-      i18n.editorToolbar.createSnippet,
-      i18n.names.git,
-      workspacePromise.data,
-      authSessionSelectFilter,
-      canCreateGitRepository,
-      authProvider?.type,
-      canCreateGistOrSnippet,
-      changeGitAuthSessionId,
-      accountsDispatch,
-    ]
-  );
-
-  useEffect(() => {
-    if (!workspacePromise.data) {
-      return;
-    }
-    if (downloadRef.current) {
-      downloadRef.current.download = `${props.workspaceFile.name}`;
-    }
-    if (downloadAllRef.current) {
-      downloadAllRef.current.download = `${workspacePromise.data.descriptor.name}.zip`;
-    }
-    if (downloadPreviewRef.current) {
-      downloadPreviewRef.current.download = `${props.workspaceFile.name}.svg`;
-    }
-  }, [props.workspaceFile, workspacePromise.data]);
-
-  const deleteWorkspaceFile = useCallback(async () => {
-    if (!workspacePromise.data) {
-      return;
-    }
-
-    if (workspacePromise.data.files.length === 1) {
-      await workspaces.deleteWorkspace({ workspaceId: props.workspaceFile.workspaceId });
-      history.push({ pathname: routes.home.path({}) });
-      return;
-    }
-
-    const nextFile = workspacePromise.data.files
-      .filter((f) => {
-        return (
-          f.relativePath !== props.workspaceFile.relativePath && editorEnvelopeLocator.hasMappingFor(f.relativePath)
-        );
-      })
-      .pop();
-
-    await workspaces.deleteFile({
-      file: props.workspaceFile,
-    });
-
-    if (!nextFile) {
-      history.push({ pathname: routes.home.path({}) });
-      return;
-    }
-
-    history.push({
-      pathname: routes.workspaceWithFilePath.path({
-        workspaceId: nextFile.workspaceId,
-        fileRelativePath: nextFile.relativePathWithoutExtension,
-        extension: nextFile.extension,
-      }),
-    });
-  }, [routes, history, workspacePromise.data, props.workspaceFile, workspaces, editorEnvelopeLocator]);
-
-  const workspaceNameRef = useRef<HTMLInputElement>(null);
-
-  const resetWorkspaceName = useCallback(() => {
-    if (workspaceNameRef.current && workspacePromise.data) {
-      workspaceNameRef.current.value = workspacePromise.data.descriptor.name;
-    }
-  }, [workspacePromise.data]);
-
-  useEffect(resetWorkspaceName, [resetWorkspaceName]);
-
-  const onRenameWorkspace = useCallback(
-    async (newName: string | undefined) => {
-      if (!newName) {
-        resetWorkspaceName();
-        return;
-      }
-
-      if (!workspacePromise.data || newName === workspacePromise.data.descriptor.name) {
-        return;
-      }
-
-      await workspaces.renameWorkspace({
-        workspaceId: workspacePromise.data.descriptor.workspaceId,
-        newName: newName.trim(),
-      });
-    },
-    [workspacePromise.data, workspaces, resetWorkspaceName]
-  );
-
-  const onWorkspaceNameKeyDown = useCallback(
-    (e: React.KeyboardEvent<HTMLInputElement>) => {
-      e.stopPropagation();
-      if (e.keyCode === 13 /* Enter */) {
-        e.currentTarget.blur();
-      } else if (e.keyCode === 27 /* ESC */) {
-        resetWorkspaceName();
-        e.currentTarget.blur();
-      }
-    },
-    [resetWorkspaceName]
-  );
-
-  const deleteFileDropdownItem = useMemo(() => {
-    return (
-      <DropdownItem key={"delete-dropdown-item"} onClick={deleteWorkspaceFile}>
-        <Flex flexWrap={{ default: "nowrap" }}>
-          <FlexItem>
-            <TrashIcon />
-            &nbsp;&nbsp;Delete <b>{`"${props.workspaceFile.nameWithoutExtension}"`}</b>
-          </FlexItem>
-          <FlexItem>
-            <b>
-              <FileLabel extension={props.workspaceFile.extension} />
-            </b>
-          </FlexItem>
-        </Flex>
-      </DropdownItem>
-    );
-  }, [deleteWorkspaceFile, props.workspaceFile]);
-
-  const pushingAlert = useGlobalAlert(
-    useCallback(() => {
-      if (workspacePromise.data?.descriptor.origin.kind !== WorkspaceKind.GIT) {
-        return <></>;
-      }
-
-      return (
-        <Alert
-          variant="info"
-          title={
-            <>
-              <Spinner size={"sm"} />
-              &nbsp;&nbsp; {`Pushing to '${workspacePromise.data?.descriptor.origin.url}'...`}
-            </>
-          }
-        />
-      );
-    }, [workspacePromise])
-  );
-
-  const comittingAlert = useGlobalAlert(
-    useCallback(() => {
-      return (
-        <Alert
-          variant="info"
-          title={
-            <>
-              <Spinner size={"sm"} />
-              &nbsp;&nbsp; {`Creating commit...`}
-            </>
-          }
-        />
-      );
-    }, [])
-  );
-
-  const commitSuccessAlert = useGlobalAlert(
-    useCallback(() => {
-      return <Alert variant="success" title={`Commit created.`} />;
-    }, []),
-    { durationInSeconds: 2 }
-  );
-
-  const commitFailAlert = useGlobalAlert(
-    useCallback(({ close }, staticArgs: { reason: string }) => {
-      return (
-        <Alert
-          variant="danger"
-          title={`Failed to commit: ${staticArgs.reason}`}
-          actionClose={<AlertActionCloseButton onClose={close} />}
-        />
-      );
-    }, [])
-  );
-
-  const nothingToCommitAlert = useGlobalAlert(
-    useCallback(() => {
-      return <Alert variant="info" title={"Nothing to commit."} />;
-    }, []),
-    { durationInSeconds: 2 }
-  );
-
-  const createSavePointDropdownItem = useMemo(() => {
-    return (
-      <DropdownItem
-        key={"commit-dropdown-item"}
-        icon={<SaveIcon />}
-        onClick={async () => {
-          if (!(await workspaces.hasLocalChanges({ workspaceId: props.workspaceFile.workspaceId }))) {
-            nothingToCommitAlert.show();
-            return;
-          }
-          comittingAlert.show();
-          try {
-            await workspaces.createSavePoint({
-              workspaceId: props.workspaceFile.workspaceId,
-              gitConfig,
-            });
-            comittingAlert.close();
-            commitSuccessAlert.show();
-          } catch (e) {
-            comittingAlert.close();
-            commitFailAlert.show({ reason: e.message });
-          }
-        }}
-        description={"Create a save point"}
-      >
-        Commit
-      </DropdownItem>
-    );
-  }, [
-    workspaces,
-    props.workspaceFile.workspaceId,
-    comittingAlert,
-    nothingToCommitAlert,
-    gitConfig,
-    commitSuccessAlert,
-    commitFailAlert,
-  ]);
-
-  const pushSuccessAlert = useGlobalAlert(
-    useCallback(() => {
-      if (workspacePromise.data?.descriptor.origin.kind !== WorkspaceKind.GIT) {
-        return <></>;
-      }
-
-      return <Alert variant="success" title={`Pushed to '${workspacePromise.data?.descriptor.origin.url}'`} />;
-    }, [workspacePromise]),
-    { durationInSeconds: 4 }
-  );
-
-  const pushErrorAlert = useGlobalAlert(
-    useCallback(
-      ({ close }) => {
-        if (workspacePromise.data?.descriptor.origin.kind !== WorkspaceKind.GIT) {
-          return <></>;
-        }
-
-        return (
-          <Alert
-            variant="danger"
-            title={`Error Pushing to '${workspacePromise.data?.descriptor.origin.url}'`}
-            actionClose={<AlertActionCloseButton onClose={close} />}
-          />
-        );
-      },
-      [workspacePromise]
-    )
-  );
-
-  const pullingAlert = useGlobalAlert(
-    useCallback(() => {
-      if (workspacePromise.data?.descriptor.origin.kind !== WorkspaceKind.GIT) {
-        return <></>;
-      }
-
-      return (
-        <Alert
-          variant="info"
-          title={
-            <>
-              <Spinner size={"sm"} />
-              &nbsp;&nbsp; {`Pulling from '${workspacePromise.data?.descriptor.origin.url}'...`}
-            </>
-          }
-        />
-      );
-    }, [workspacePromise])
-  );
-
-  const pullSuccessAlert = useGlobalAlert(
-    useCallback(() => {
-      if (workspacePromise.data?.descriptor.origin.kind !== WorkspaceKind.GIT) {
-        return <></>;
-      }
-
-      return <Alert variant="success" title={`Pulled from '${workspacePromise.data?.descriptor.origin.url}'`} />;
-    }, [workspacePromise]),
-    { durationInSeconds: 4 }
-  );
-
-  const pushNewBranch = useCallback(
-    async (newBranchName: string) => {
-      if (!authInfo || !workspacePromise.data) {
-        return;
-      }
-
-      try {
-        pushingAlert.show();
-
-        await workspaces.createSavePoint({
-          workspaceId: props.workspaceFile.workspaceId,
-          gitConfig,
-        });
-
-        await workspaces.branch({ workspaceId: props.workspaceFile.workspaceId, checkout: false, name: newBranchName });
-
-        await workspaces.push({
-          workspaceId: props.workspaceFile.workspaceId,
-          remote: GIT_ORIGIN_REMOTE_NAME,
-          remoteRef: `refs/heads/${newBranchName}`,
-          ref: newBranchName,
-          force: false,
-          authInfo,
-        });
-
-        history.push({
-          pathname: routes.import.path({}),
-          search: routes.import.queryString({
-            url: `${workspacePromise.data.descriptor.origin.url}`,
-            branch: newBranchName,
-            authSessionId: workspacePromise.data.descriptor.gitAuthSessionId,
-          }),
-        });
-      } catch (e) {
-        pushErrorAlert.show();
-      } finally {
-        pushingAlert.close();
-      }
-    },
-    [
-      authInfo,
-      workspacePromise.data,
-      pushingAlert,
-      workspaces,
-      props.workspaceFile.workspaceId,
-      gitConfig,
-      history,
-      routes.import,
-      pushErrorAlert,
-    ]
-  );
-
-  const pullErrorAlert = useGlobalAlert<{ newBranchName: string; onTryAgain: () => any }>(
-    useCallback(
-      ({ close }, { newBranchName }) => {
-        if (workspacePromise.data?.descriptor.origin.kind !== WorkspaceKind.GIT) {
-          return <></>;
-        }
-
-        return (
-          <Alert
-            variant="danger"
-            title={`Error Pulling from '${workspacePromise.data?.descriptor.origin.url}'`}
-            actionClose={<AlertActionCloseButton onClose={close} />}
-            actionLinks={<></>}
-          >
-            {`This usually happens when your branch has conflicts with the upstream branch or you don't have permission to Pull.`}
-            <br />
-            <br />
-            {`You can save your work to a new branch.`}
-            <br />
-            <br />
-            <Tooltip
-              data-testid={"gist-it-tooltip"}
-              content={<div>{`You need select an authentication source to be able to Push to a new branch.`}</div>}
-              trigger={!canPushToGitRepository ? "mouseenter click" : ""}
-              position="left"
-            >
-              <Button
-                onClick={() => pushNewBranch(newBranchName)}
-                variant={ButtonVariant.link}
-                style={{ paddingLeft: 0 }}
-                isSmall={true}
-                isDisabled={!canPushToGitRepository}
-              >
-                {`Switch to '${newBranchName}'`}
-              </Button>
-            </Tooltip>
-            <br />
-            <br />
-
-            {`Or change the authentication source for '${workspacePromise.data?.descriptor.name}' and try again`}
-            <br />
-          </Alert>
-        );
-      },
-      [canPushToGitRepository, pushNewBranch, workspacePromise.data]
-    )
-  );
-
-  const pullFromGitRepository = useCallback(
-    async (args: { showAlerts: boolean }) => {
-      pullingAlert.close();
-      pullErrorAlert.close();
-      pullSuccessAlert.close();
-
-      if (args.showAlerts) {
-        pullingAlert.show();
-      }
-      await workspaces.createSavePoint({
-        workspaceId: props.workspaceFile.workspaceId,
-        gitConfig,
-      });
-
-      try {
-        await workspaces.pull({
-          workspaceId: props.workspaceFile.workspaceId,
-          authInfo,
-        });
-
-        if (args.showAlerts) {
-          pullSuccessAlert.show();
-        }
-      } catch (e) {
-        console.error(e);
-        if (args.showAlerts) {
-          const randomString = (Math.random() + 1).toString(36).substring(7);
-          const newBranchName = `${workspacePromise.data?.descriptor.origin.branch}-${randomString}`;
-          pullErrorAlert.show({ newBranchName, onTryAgain: () => pullFromGitRepository({ showAlerts: true }) });
-        }
-      } finally {
-        if (args.showAlerts) {
-          pullingAlert.close();
-        }
-      }
-    },
-    [
-      pullingAlert,
-      pullErrorAlert,
-      pullSuccessAlert,
-      workspaces,
-      props.workspaceFile.workspaceId,
-      gitConfig,
-      authInfo,
-      workspacePromise.data?.descriptor.origin.branch,
-    ]
-  );
-
-  const pushToGitRepository = useCallback(async () => {
-    pushingAlert.close();
-    pushErrorAlert.close();
-    pushSuccessAlert.close();
-
-    if (!authInfo) {
-      return;
-    }
-
-    pushingAlert.show();
-    try {
-      const workspaceId = props.workspaceFile.workspaceId;
-      await workspaces.createSavePoint({
-        workspaceId: workspaceId,
-        gitConfig,
-      });
-
-      const workspace = await workspaces.getWorkspace({ workspaceId });
-      await workspaces.push({
-        workspaceId: props.workspaceFile.workspaceId,
-        ref: workspace.origin.branch,
-        remote: GIST_ORIGIN_REMOTE_NAME,
-        remoteRef: `refs/heads/${workspace.origin.branch}`,
-        force: false,
-        authInfo,
-      });
-      await pullFromGitRepository({ showAlerts: false });
-      pushSuccessAlert.show();
-    } catch (e) {
-      console.error(e);
-      pushErrorAlert.show();
-    } finally {
-      pushingAlert.close();
-    }
-  }, [
-    pushingAlert,
-    pushErrorAlert,
-    pushSuccessAlert,
-    authInfo,
-    props.workspaceFile.workspaceId,
-    workspaces,
-    gitConfig,
-    pullFromGitRepository,
-  ]);
-
-  const navigationStatus = useNavigationStatus();
-  const navigationStatusToggle = useNavigationStatusToggle();
-  const confirmNavigationAlert = useGlobalAlert<{ lastBlockedLocation: Location }>(
-    useCallback(
-      (_, { lastBlockedLocation }) => (
-        <Alert
-          data-testid="unsaved-alert"
-          variant="warning"
-          title={
-            workspacePromise.data?.descriptor.origin.kind === WorkspaceKind.LOCAL
-              ? i18n.editorPage.alerts.unsaved.titleLocal
-              : i18n.editorPage.alerts.unsaved.titleGit
-          }
-          actionClose={
-            <AlertActionCloseButton data-testid="unsaved-alert-close-button" onClose={navigationStatusToggle.unblock} />
-          }
-          actionLinks={
-            <>
-              <Divider inset={{ default: "insetMd" }} />
-              <br />
-              {(workspacePromise.data?.descriptor.origin.kind === WorkspaceKind.LOCAL && (
-                <AlertActionLink
-                  data-testid="unsaved-alert-save-button"
-                  onClick={() => {
-                    navigationStatusToggle.unblock();
-                    return downloadWorkspaceZip();
-                  }}
-                  style={{ fontWeight: "bold" }}
-                >
-                  {`${i18n.terms.download} '${workspacePromise.data?.descriptor.name}'`}
-                </AlertActionLink>
-              )) || (
-                <PushToGitAlertActionLinks
-                  changeGitAuthSessionId={changeGitAuthSessionId}
-                  workspaceDescriptor={workspacePromise.data?.descriptor}
-                  canPush={switchExpression(workspacePromise.data?.descriptor.origin.kind as WorkspaceKindGitBased, {
-                    BITBUCKET_SNIPPET: canUpdateGistOrSnippet,
-                    GITHUB_GIST: canUpdateGistOrSnippet,
-                    GIT: canPushToGitRepository,
-                  })}
-                  remoteRef={`${GIT_ORIGIN_REMOTE_NAME}/${workspacePromise.data?.descriptor.origin.branch}`}
-                  authSessionSelectFilter={authSessionSelectFilter}
-                  onPush={() => {
-                    navigationStatusToggle.unblock();
-                    switchExpression(workspacePromise.data?.descriptor.origin.kind as WorkspaceKindGitBased, {
-                      BITBUCKET_SNIPPET: updateGistOrSnippet,
-                      GITHUB_GIST: updateGistOrSnippet,
-                      GIT: pushToGitRepository,
-                    })();
-                  }}
-                />
-              )}
-              <br />
-              <br />
-              <AlertActionLink
-                data-testid="unsaved-alert-close-without-save-button"
-                onClick={() =>
-                  navigationBlockersBypass.execute(() => {
-                    history.push(lastBlockedLocation);
-                  })
-                }
-              >
-                {i18n.editorPage.alerts.unsaved.proceedAnyway}
-              </AlertActionLink>
-              <br />
-              <br />
-            </>
-          }
-        >
-          <br />
-          <p>{i18n.editorPage.alerts.unsaved.message}</p>
-        </Alert>
-      ),
-      [
-        workspacePromise.data?.descriptor,
-        i18n.editorPage.alerts.unsaved.titleLocal,
-        i18n.editorPage.alerts.unsaved.titleGit,
-        i18n.editorPage.alerts.unsaved.proceedAnyway,
-        i18n.editorPage.alerts.unsaved.message,
-        i18n.terms.download,
-        navigationStatusToggle,
-        changeGitAuthSessionId,
-        canUpdateGistOrSnippet,
-        canPushToGitRepository,
-        authSessionSelectFilter,
-        downloadWorkspaceZip,
-        updateGistOrSnippet,
-        pushToGitRepository,
-        navigationBlockersBypass,
-        history,
-      ]
-    )
-  );
-
-  useEffect(() => {
-    if (navigationStatus.lastBlockedLocation) {
-      confirmNavigationAlert.show({ lastBlockedLocation: navigationStatus.lastBlockedLocation });
-    } else {
-      confirmNavigationAlert.close();
-    }
-  }, [confirmNavigationAlert, navigationStatus]);
-
-  const [isVsCodeDropdownOpen, setVsCodeDropdownOpen] = useState(false);
-
-  const createRepositorySuccessAlert = useGlobalAlert<{ url: string }>(
-    useCallback(({ close }, { url }) => {
-      return (
-        <Alert
-          variant="success"
-          title={`GitHub repository created.`}
-          actionClose={<AlertActionCloseButton onClose={close} />}
-          actionLinks={<AlertActionLink onClick={() => window.open(url, "_blank")}>{url}</AlertActionLink>}
-        />
-      );
-    }, [])
-  );
-
-  const canSeeWorkspaceToolbar = useMemo(
-    () =>
-      workspacePromise.data?.descriptor.origin.kind !== WorkspaceKind.LOCAL || workspacePromise.data?.files.length > 1,
-    [workspacePromise.data?.descriptor.origin.kind, workspacePromise.data?.files.length]
-  );
-
-  return (
-    <PromiseStateWrapper
-      promise={workspacePromise}
-      resolved={(workspace) => {
-        return (
-          <>
-            <PageSection type={"nav"} variant={"light"} padding={{ default: "noPadding" }}>
-              {workspace && canSeeWorkspaceToolbar && (
-                <Flex
-                  justifyContent={{ default: "justifyContentSpaceBetween" }}
-                  flexWrap={{ default: "nowrap" }}
-                  spaceItems={{ default: "spaceItemsMd" }}
-                >
-                  <FlexItem style={{ minWidth: 0 }}>
-                    <Flex
-                      justifyContent={{ default: "justifyContentFlexStart" }}
-                      flexWrap={{ default: "nowrap" }}
-                      spaceItems={{ default: "spaceItemsSm" }}
-                      alignItems={{ default: "alignItemsCenter" }}
-                    >
-                      <FlexItem>
-                        <Button
-                          className={"kie-tools--masthead-hoverable"}
-                          variant={ButtonVariant.plain}
-                          onClick={() => history.push({ pathname: routes.home.path({}) })}
-                        >
-                          <AngleLeftIcon />
-                        </Button>
-                      </FlexItem>
-                      <FlexItem>
-                        <AuthSessionSelect
-                          title={`Select Git authentication for '${workspace.descriptor.name}'...`}
-                          isPlain={true}
-                          authSessionId={workspace.descriptor.gitAuthSessionId}
-                          showOnlyThisAuthProviderGroupWhenConnectingToNewAccount={AuthProviderGroup.GIT}
-                          setAuthSessionId={(newAuthSessionId) => {
-                            changeGitAuthSessionId(newAuthSessionId, workspace.descriptor.gitAuthSessionId);
-                            accountsDispatch({ kind: AccountsDispatchActionKind.CLOSE });
-                          }}
-                          filter={authSessionSelectFilter}
-                        />
-                      </FlexItem>
-                      <FlexItem>
-                        <WorkspaceLabel descriptor={workspace.descriptor} />
-                      </FlexItem>
-                      <FlexItem
-                        style={{ minWidth: 0, padding: "0 8px 0 8px", flexShrink: 0 }}
-                        className={"kie-tools--masthead-hoverable"}
-                      >
-                        <FolderIcon style={{ marginRight: "8px", verticalAlign: "middle" }} />
-                        <div
-                          data-testid={"toolbar-title-workspace"}
-                          className={"kogito--editor__toolbar-name-container"}
-                          style={{ display: "inline-block", verticalAlign: "middle" }}
-                        >
-                          <Title
-                            aria-label={"EmbeddedEditorFile name"}
-                            headingLevel={"h3"}
-                            size={"md"}
-                            style={{
-                              fontStyle: "italic",
-                            }}
-                          >
-                            {workspace.descriptor.name}
-                          </Title>
-                          <TextInput
-                            ref={workspaceNameRef}
-                            type={"text"}
-                            aria-label={"Edit workspace name"}
-                            onKeyDown={onWorkspaceNameKeyDown}
-                            className={"kogito--editor__toolbar-subtitle"}
-                            onBlur={(e) => onRenameWorkspace(e.target.value)}
-                            style={{ fontStyle: "italic", top: "4px", height: "calc(100% - 8px)" }}
-                          />
-                        </div>
-                      </FlexItem>
-                      <FlexItem>
-                        <WorkspaceStatusIndicator workspace={workspace} />
-                      </FlexItem>
-                    </Flex>
-                  </FlexItem>
-                  {/*<Divider inset={{ default: "insetMd" }} isVertical={true} />*/}
-                  {workspace.descriptor.origin.kind === WorkspaceKind.GIT &&
-                    workspaceImportableUrl.type === UrlType.GITHUB_DOT_COM && (
-                      <FlexItem
-                        style={{
-                          minWidth: "137px",
-                        }}
-                      >
-                        <Dropdown
-                          className={"kie-tools--masthead-hoverable"}
-                          isPlain={true}
-                          onSelect={() => setVsCodeDropdownOpen(false)}
-                          isOpen={isVsCodeDropdownOpen}
-                          position={"right"}
-                          toggle={
-                            <DropdownToggle toggleIndicator={null} onToggle={setVsCodeDropdownOpen}>
-                              <Flex flexWrap={{ default: "nowrap" }}>
-                                <FlexItem
-                                  style={{
-                                    minWidth: 0 /* This is to make the flex parent not overflow horizontally */,
-                                  }}
-                                >
-                                  <Tooltip distance={5} position={"top-start"} content={workspace.descriptor.name}>
-                                    <TextContent>
-                                      <Text
-                                        component={TextVariants.small}
-                                        style={{
-                                          whiteSpace: "nowrap",
-                                          overflow: "hidden",
-                                          textOverflow: "ellipsis",
-                                        }}
-                                      >
-                                        <img
-                                          style={{
-                                            minWidth: "14px",
-                                            maxWidth: "14px",
-                                            marginTop: "-2px",
-                                            verticalAlign: "middle",
-                                          }}
-                                          alt="vscode-logo-blue"
-                                          src={routes.static.images.vscodeLogoBlue.path({})}
-                                        />
-                                        &nbsp;&nbsp;
-                                        {`Open "${workspace.descriptor.name}"`}
-                                      </Text>
-                                    </TextContent>
-                                  </Tooltip>
-                                </FlexItem>
-                                <FlexItem>
-                                  <CaretDownIcon />
-                                </FlexItem>
-                              </Flex>
-                            </DropdownToggle>
-                          }
-                          dropdownItems={[
-                            <DropdownGroup key={"open-in-vscode"}>
-                              {navigationStatus.shouldBlockNavigationTo({ pathname: "__external" }) && (
-                                <>
-                                  <Alert
-                                    isInline={true}
-                                    variant={"warning"}
-                                    title={"You have new changes to Push"}
-                                    actionLinks={
-                                      <PushToGitAlertActionLinks
-                                        changeGitAuthSessionId={changeGitAuthSessionId}
-                                        workspaceDescriptor={workspace.descriptor}
-                                        canPush={canPushToGitRepository}
-                                        authSessionSelectFilter={authSessionSelectFilter}
-                                        remoteRef={`${GIT_ORIGIN_REMOTE_NAME}/${workspace.descriptor.origin.branch}`}
-                                        onPush={pushToGitRepository}
-                                      />
-                                    }
-                                  >
-                                    {`Opening '${workspace.descriptor.name}' on vscode.dev won't show your latest changes.`}
-                                  </Alert>
-                                  <Divider />
-                                </>
-                              )}
-                              <DropdownItem
-                                style={{ minWidth: "400px" }}
-                                href={`https://vscode.dev/github${
-                                  new URL(workspace.descriptor.origin.url).pathname.endsWith(".git")
-                                    ? new URL(workspace.descriptor.origin.url).pathname.replace(".git", "")
-                                    : new URL(workspace.descriptor.origin.url).pathname
-                                }/tree/${workspace.descriptor.origin.branch}`}
-                                target={"_blank"}
-                                icon={<ExternalLinkAltIcon />}
-                                description={`The '${workspace.descriptor.origin.branch}' branch will be opened.`}
-                              >
-                                vscode.dev
-                              </DropdownItem>
-                              <Divider />
-                              <DropdownItem
-                                href={`vscode://vscode.git/clone?url=${workspace.descriptor.origin.url.toString()}`}
-                                target={"_blank"}
-                                icon={<ExternalLinkAltIcon />}
-                                description={"The default branch will be opened."}
-                              >
-                                VS Code Desktop
-                              </DropdownItem>
-                            </DropdownGroup>,
-                          ]}
-                        />
-                      </FlexItem>
-                    )}
-                </Flex>
-              )}
-            </PageSection>
-            <PageSection type={"nav"} variant={"light"} style={{ paddingTop: 0, paddingBottom: "16px" }}>
-              <Flex
-                justifyContent={{ default: "justifyContentSpaceBetween" }}
-                alignItems={{ default: "alignItemsCenter" }}
-                flexWrap={{ default: "nowrap" }}
-              >
-                <FlexItem style={{ minWidth: 0 }}>
-                  <PageHeaderToolsItem visibility={{ default: "visible" }}>
-                    <Flex flexWrap={{ default: "nowrap" }} alignItems={{ default: "alignItemsCenter" }}>
-                      <FlexItem style={{ minWidth: 0 }}>
-                        <FileSwitcher workspace={workspace} workspaceFile={props.workspaceFile} />
-                      </FlexItem>
-                      <FlexItem>
-                        {(isEdited && (
-                          <Tooltip content={"Saving in memory..."} position={"bottom"}>
-                            <TextContent
-                              style={{ color: "gray", ...(!props.workspaceFile ? { visibility: "hidden" } : {}) }}
-                            >
-                              <Text
-                                style={{ display: "flex" }}
-                                aria-label={"Saving in memory..."}
-                                data-testid="is-saving-in-memory-indicator"
-                                component={TextVariants.small}
-                              >
-                                <OutlinedClockIcon size={"sm"} style={{ margin: 0 }} />
-                              </Text>
-                            </TextContent>
-                          </Tooltip>
-                        )) || (
-                          <Tooltip content={"File is in memory."} position={"bottom"}>
-                            <TextContent
-                              style={{ color: "gray", ...(!props.workspaceFile ? { visibility: "hidden" } : {}) }}
-                            >
-                              <Text
-                                style={{ display: "flex" }}
-                                aria-label={"File is in memory."}
-                                data-testid="is-saved-in-memory-indicator"
-                                component={TextVariants.small}
-                              >
-                                <DesktopIcon size={"sm"} style={{ margin: 0 }} />
-                              </Text>
-                            </TextContent>
-                          </Tooltip>
-                        )}
-                      </FlexItem>
-                      <FlexItem>
-                        {(!isSaved && (
-                          <Tooltip content={"Writing file..."} position={"bottom"}>
-                            <TextContent
-                              style={{ color: "gray", ...(!props.workspaceFile ? { visibility: "hidden" } : {}) }}
-                            >
-                              <Text
-                                style={{ display: "flex" }}
-                                aria-label={"Writing file..."}
-                                data-testid="is-writing-indicator"
-                                component={TextVariants.small}
-                              >
-                                <OutlinedClockIcon size={"sm"} style={{ margin: 0 }} />
-                              </Text>
-                            </TextContent>
-                          </Tooltip>
-                        )) || (
-                          <Tooltip content={"File is written on disk."} position={"bottom"}>
-                            <TextContent
-                              style={{ color: "gray", ...(!props.workspaceFile ? { visibility: "hidden" } : {}) }}
-                            >
-                              <Text
-                                style={{ display: "flex" }}
-                                aria-label={"File is written on disk."}
-                                data-testid="is-written-indicator"
-                                component={TextVariants.small}
-                              >
-                                <OutlinedHddIcon size={"sm"} style={{ margin: 0 }} />
-                              </Text>
-                            </TextContent>
-                          </Tooltip>
-                        )}
-                      </FlexItem>
-                    </Flex>
-                  </PageHeaderToolsItem>
-                </FlexItem>
-                <FlexItem>
-                  <Toolbar>
-                    <ToolbarContent style={{ paddingRight: 0 }}>
-                      <ToolbarGroup>
-                        <ToolbarItem>
-                          <ResponsiveDropdown
-                            title={"Add file"}
-                            onClose={() => setNewFileDropdownMenuOpen(false)}
-                            position={"right"}
-                            isOpen={isNewFileDropdownMenuOpen}
-                            toggle={
-                              <ResponsiveDropdownToggle
-                                onToggle={() => setNewFileDropdownMenuOpen((prev) => !prev)}
-                                isPrimary={true}
-                                toggleIndicator={CaretDownIcon}
-                              >
-                                <PlusIcon />
-                                &nbsp;&nbsp;New file
-                              </ResponsiveDropdownToggle>
-                            }
-                          >
-                            <NewFileDropdownMenu
-                              workspaceDescriptor={workspace.descriptor}
-                              destinationDirPath={props.workspaceFile.relativeDirPath}
-                              onAddFile={async (file) => {
-                                setNewFileDropdownMenuOpen(false);
-                                if (!file) {
-                                  return;
-                                }
-
-                                history.push({
-                                  pathname: routes.workspaceWithFilePath.path({
-                                    workspaceId: file.workspaceId,
-                                    fileRelativePath: file.relativePathWithoutExtension,
-                                    extension: file.extension,
-                                  }),
-                                });
-                              }}
-                            />
-                          </ResponsiveDropdown>
-                        </ToolbarItem>
-                        <ToolbarItem visibility={hideWhenSmall}>
-                          {props.workspaceFile.extension === "dmn" && (
-                            <ToolbarGroup>
-                              <KieSandboxExtendedServicesButtons
-                                workspace={workspace}
-                                workspaceFile={props.workspaceFile}
-                                editorPageDock={props.editorPageDock}
-                              />
-                            </ToolbarGroup>
-                          )}
-                        </ToolbarItem>
-                        {isGistLikeWorkspaceKind(workspace.descriptor.origin.kind) && (
-                          <ToolbarItem>
-                            <Dropdown
-                              onSelect={() => setSyncGistOrSnippetDropdownOpen(false)}
-                              isOpen={isSyncGistOrSnippetDropdownOpen}
-                              position={DropdownPosition.right}
-                              toggle={
-                                <DropdownToggle
-                                  id={"sync-dropdown"}
-                                  data-testid={"sync-dropdown"}
-                                  onToggle={(isOpen) => setSyncGistOrSnippetDropdownOpen(isOpen)}
-                                >
-                                  Sync
-                                </DropdownToggle>
-                              }
-                              dropdownItems={[
-                                <DropdownGroup key={"sync-gist-or-snippet-dropdown-group"}>
-                                  <Tooltip
-                                    data-testid={"gist-or-snippet-it-tooltip"}
-                                    content={
-                                      <div>
-                                        {switchExpression(workspace.descriptor.origin.kind as WorkspaceKindGistLike, {
-                                          GITHUB_GIST: i18n.editorToolbar.cantUpdateGistTooltip,
-                                          BITBUCKET_SNIPPET: i18n.editorToolbar.cantUpdateSnippetTooltip,
-                                        })}
-                                      </div>
-                                    }
-                                    trigger={!canUpdateGistOrSnippet ? "mouseenter click" : ""}
-                                    position="left"
-                                  >
-                                    <>
-                                      <DropdownItem
-                                        style={{ minWidth: "300px" }}
-                                        icon={switchExpression(
-                                          workspace.descriptor.origin.kind as WorkspaceKindGistLike,
-                                          {
-                                            BITBUCKET_SNIPPET: <BitbucketIcon />,
-                                            GITHUB_GIST: <GithubIcon />,
-                                          }
-                                        )}
-                                        onClick={updateGistOrSnippet}
-                                        isDisabled={!canUpdateGistOrSnippet}
-                                      >
-                                        Update{" "}
-                                        {switchExpression(workspace.descriptor.origin.kind as WorkspaceKindGistLike, {
-                                          BITBUCKET_SNIPPET: "Bitbucket Snippet",
-                                          GITHUB_GIST: "GitHub Gist",
-                                        })}
-                                      </DropdownItem>
-                                      {canForkGitHubGist && (
-                                        <>
-                                          <Divider />
-                                          <li role="menuitem">
-                                            <Alert
-                                              isInline={true}
-                                              variant={"default"}
-                                              title={
-                                                <span style={{ whiteSpace: "nowrap" }}>
-                                                  {"Can't update Gists you don't own"}
-                                                </span>
-                                              }
-                                            >
-                                              <br />
-                                              {`You can create a fork of '${workspace.descriptor.name}' to save your updates.`}
-                                              <br />
-                                              <br />
-                                              <Button
-                                                onClick={forkGitHubGist}
-                                                variant={ButtonVariant.link}
-                                                isSmall={true}
-                                                style={{ paddingLeft: 0 }}
-                                              >
-                                                {`Fork Gist`}
-                                              </Button>
-                                              <br />
-                                              <br />
-                                              {`Or you can change the authentication source for '${workspace.descriptor.name}' to be able to Update Gist.`}
-                                              <br />
-                                              <br />
-                                              <AuthSessionSelect
-                                                title={`Select Git authentication for '${workspace.descriptor.name}'...`}
-                                                isPlain={false}
-                                                authSessionId={workspace.descriptor.gitAuthSessionId}
-                                                showOnlyThisAuthProviderGroupWhenConnectingToNewAccount={
-                                                  AuthProviderGroup.GIT
-                                                }
-                                                setAuthSessionId={(newAuthSessionId) => {
-                                                  changeGitAuthSessionId(
-                                                    newAuthSessionId,
-                                                    workspace.descriptor.gitAuthSessionId
-                                                  );
-                                                  accountsDispatch({ kind: AccountsDispatchActionKind.CLOSE });
-                                                  setTimeout(() => {
-                                                    setSyncGistOrSnippetDropdownOpen(true);
-                                                  }, 0);
-                                                }}
-                                                filter={authSessionSelectFilter}
-                                              />
-                                            </Alert>
-                                          </li>
-                                        </>
-                                      )}
-                                      {!canPushToGitRepository && (
-                                        <>
-                                          <Divider />
-                                          <Alert
-                                            isInline={true}
-                                            variant={"default"}
-                                            title={`Can't Update ${switchExpression(
-                                              authProvider?.type as GitAuthProviderType,
-                                              {
-                                                github: "GitHub repository",
-                                                bitbucket: "Bitbucket repository",
-                                                default: "Git repository",
-                                              }
-                                            )} without selecting a matching authentication source`}
-                                            actionLinks={
-                                              <AuthSessionSelect
-                                                title={`Select Git authentication for '${workspace.descriptor.name}'...`}
-                                                isPlain={false}
-                                                authSessionId={workspace.descriptor.gitAuthSessionId}
-                                                showOnlyThisAuthProviderGroupWhenConnectingToNewAccount={
-                                                  AuthProviderGroup.GIT
-                                                }
-                                                setAuthSessionId={(newAuthSessionId) => {
-                                                  changeGitAuthSessionId(
-                                                    newAuthSessionId,
-                                                    workspace.descriptor.gitAuthSessionId
-                                                  );
-                                                  accountsDispatch({ kind: AccountsDispatchActionKind.CLOSE });
-                                                  setTimeout(() => {
-                                                    setSyncGistOrSnippetDropdownOpen(true);
-                                                  }, 0);
-                                                }}
-                                                filter={authSessionSelectFilter}
-                                              />
-                                            }
-                                          >
-                                            {`Select an authentication source for '${
-                                              workspace.descriptor.name
-                                            }' to be able to Update ${switchExpression(
-                                              workspace.descriptor.origin.kind as WorkspaceKindGistLike,
-                                              {
-                                                GITHUB_GIST: "Github Gist",
-                                                BITBUCKET_SNIPPET: "Bitbucket Snippet",
-                                              }
-                                            )}.`}
-                                          </Alert>
-                                        </>
-                                      )}
-                                    </>
-                                  </Tooltip>
-                                </DropdownGroup>,
-                              ]}
-                            />
-                          </ToolbarItem>
-                        )}
-                        {workspace.descriptor.origin.kind === WorkspaceKind.GIT && (
-                          <ToolbarItem>
-                            <Dropdown
-                              onSelect={() => setSyncGitRepositoryDropdownOpen(false)}
-                              isOpen={isSyncGitRepositoryDropdownOpen}
-                              position={DropdownPosition.right}
-                              toggle={
-                                <DropdownToggle
-                                  id={"sync-dropdown"}
-                                  data-testid={"sync-dropdown"}
-                                  onToggle={(isOpen) => setSyncGitRepositoryDropdownOpen(isOpen)}
-                                >
-                                  Sync
-                                </DropdownToggle>
-                              }
-                              dropdownItems={[
-                                <DropdownGroup key={"sync-git-dropdown-group"}>
-                                  <DropdownItem
-                                    icon={<SyncAltIcon />}
-                                    onClick={() => pullFromGitRepository({ showAlerts: true })}
-                                    description={`Get new changes made upstream at '${GIT_ORIGIN_REMOTE_NAME}/${workspace.descriptor.origin.branch}'.`}
-                                  >
-                                    Pull
-                                  </DropdownItem>
-                                  <Tooltip
-                                    data-testid={"git-it-tooltip"}
-                                    content={
-                                      <div>{`You need to select an authentication source to Push to this repository.`}</div>
-                                    }
-                                    trigger={!canPushToGitRepository ? "mouseenter click" : ""}
-                                    position="left"
-                                  >
-                                    <>
-                                      <DropdownItem
-                                        icon={<ArrowCircleUpIcon />}
-                                        onClick={pushToGitRepository}
-                                        isDisabled={!canPushToGitRepository}
-                                        description={`Send your changes upstream to '${GIT_ORIGIN_REMOTE_NAME}/${workspace.descriptor.origin.branch}'.`}
-                                      >
-                                        Push
-                                      </DropdownItem>
-                                      {!canPushToGitRepository && (
-                                        <>
-                                          <Alert
-                                            isInline={true}
-                                            variant={"default"}
-                                            title={"Can't Push without selecting an authentication source"}
-                                            actionLinks={
-                                              <AuthSessionSelect
-                                                title={`Select Git authentication for '${workspace.descriptor.name}'...`}
-                                                isPlain={false}
-                                                authSessionId={workspace.descriptor.gitAuthSessionId}
-                                                showOnlyThisAuthProviderGroupWhenConnectingToNewAccount={
-                                                  AuthProviderGroup.GIT
-                                                }
-                                                setAuthSessionId={(newAuthSessionId) => {
-                                                  changeGitAuthSessionId(
-                                                    newAuthSessionId,
-                                                    workspace.descriptor.gitAuthSessionId
-                                                  );
-                                                  accountsDispatch({ kind: AccountsDispatchActionKind.CLOSE });
-                                                  setTimeout(() => {
-                                                    setSyncGitRepositoryDropdownOpen(true);
-                                                  });
-                                                }}
-                                                filter={authSessionSelectFilter}
-                                              />
-                                            }
-                                          >
-                                            {`Select an authentication source for '${workspace.descriptor.name}' to be able to Push.`}
-                                          </Alert>
-                                        </>
-                                      )}
-                                    </>
-                                  </Tooltip>
-                                </DropdownGroup>,
-                              ]}
-                            />
-                          </ToolbarItem>
-                        )}
-                        <ToolbarItem visibility={hideWhenSmall}>
-                          <Dropdown
-                            onSelect={() => setShareDropdownOpen(false)}
-                            isOpen={isShareDropdownOpen}
-                            dropdownItems={shareDropdownItems}
-                            position={DropdownPosition.right}
-                            toggle={
-                              <DropdownToggle
-                                id={"share-dropdown"}
-                                data-testid={"share-dropdown"}
-                                onToggle={(isOpen) => setShareDropdownOpen(isOpen)}
-                              >
-                                {i18n.editorToolbar.share}
-                              </DropdownToggle>
-                            }
-                          />
-                        </ToolbarItem>
-                        <ToolbarItem visibility={hideWhenSmall} style={{ marginRight: 0 }}>
-                          <KebabDropdown
-                            id={"kebab-lg"}
-                            state={[isLargeKebabOpen, setLargeKebabOpen]}
-                            items={[deleteFileDropdownItem, <Divider key={"divider-0"} />, createSavePointDropdownItem]}
-                          />
-                        </ToolbarItem>
-                        <ToolbarItem visibility={showWhenSmall} style={{ marginRight: 0 }}>
-                          <KebabDropdown
-                            id={"kebab-sm"}
-                            state={[isSmallKebabOpen, setSmallKebabOpen]}
-                            items={[
-                              deleteFileDropdownItem,
-                              <Divider key={"divider-0"} />,
-                              createSavePointDropdownItem,
-                              <Divider key={"divider-1"} />,
-                              ...shareDropdownItems,
-                              ...(props.workspaceFile.extension !== "dmn"
-                                ? []
-                                : [
-                                    <Divider key={"divider-2"} />,
-                                    <KieSandboxExtendedServicesDropdownGroup
-                                      workspace={workspace}
-                                      key="kie-sandbox-extended-services-group"
-                                    />,
-                                  ]),
-                            ]}
-                          />
-                        </ToolbarItem>
-                      </ToolbarGroup>
-                    </ToolbarContent>
-                  </Toolbar>
-                </FlexItem>
-              </Flex>
-            </PageSection>
-            <EmbedModal
-              workspace={workspace.descriptor}
-              workspaceFile={props.workspaceFile}
-              isOpen={isEmbedModalOpen}
-              onClose={() => setEmbedModalOpen(false)}
-            />
-            <CreateGitRepositoryModal
-              workspace={workspace.descriptor}
-              isOpen={isCreateGitRepositoryModalOpen}
-              onClose={() => setCreateGitRepositoryModalOpen(false)}
-              onSuccess={({ url }) => {
-                createRepositorySuccessAlert.show({ url });
-              }}
-            />
-            <CreateGistOrSnippetModal
-              workspace={workspace.descriptor}
-              isOpen={isCreateGistOrSnippetModalOpen}
-              onClose={() => setCreateGistOrSnippetModalOpen(false)}
-              onSuccess={({ url }) => {
-                successfullyCreatedGistOrSnippetAlert.show({ url });
-              }}
-              onError={() => {
-                errorAlert.show();
-              }}
-            />
-            <textarea ref={copyContentTextArea} style={{ height: 0, position: "absolute", zIndex: -1 }} />
-            <a ref={downloadRef} />
-            <a ref={downloadAllRef} />
-            <a ref={downloadPreviewRef} />
-          </>
-        );
-      }}
-    />
-  );
-}
-
-export function PushToGitAlertActionLinks(props: {
-  onPush: () => void;
-  canPush?: boolean;
-  remoteRef?: string;
-  workspaceDescriptor: WorkspaceDescriptor | undefined;
-  changeGitAuthSessionId: (a: React.SetStateAction<string | undefined>, b: string | undefined) => void;
-  authSessionSelectFilter: AuthSessionSelectFilter;
-}) {
-  const accountsDispatch = useAccountsDispatch();
-  if (props.workspaceDescriptor?.origin.kind === WorkspaceKind.GIT && !props.remoteRef) {
-    throw new Error("Should specify remoteRef for GIT workspaces");
-  }
-
-  const pushButton = useMemo(
-    () => (
-      <AlertActionLink onClick={props.onPush} style={{ fontWeight: "bold" }} isDisabled={!props.canPush}>
-        {props.workspaceDescriptor
-          ? switchExpression(props.workspaceDescriptor.origin.kind, {
-              GIT: `Push to '${props.remoteRef}'`,
-              GITHUB_GIST: "Update Gist",
-              BITBUCKET_SNIPPET: "Update Snippet",
-              default: "",
-            })
-          : ""}
-      </AlertActionLink>
-    ),
-    [props]
-  );
-
-  return (
-    <>
-      {!props.canPush && (
-        <Alert
-          isInline={true}
-          variant={"default"}
-          title={"Can't Push without selecting an authentication source"}
-          actionLinks={
-            <>
-              <AuthSessionSelect
-                title={`Select Git authentication for '${props.workspaceDescriptor?.name}'...`}
-                position={SelectPosition.right}
-                isPlain={false}
-                authSessionId={props.workspaceDescriptor?.gitAuthSessionId}
-                showOnlyThisAuthProviderGroupWhenConnectingToNewAccount={AuthProviderGroup.GIT}
-                setAuthSessionId={(newAuthSessionId) => {
-                  props.changeGitAuthSessionId(newAuthSessionId, props.workspaceDescriptor?.gitAuthSessionId);
-                  accountsDispatch({ kind: AccountsDispatchActionKind.CLOSE });
-                }}
-                filter={props.authSessionSelectFilter}
-              />
-              <br />
-              <br />
-              {pushButton}
-            </>
-          }
-        >
-          {`Select an authentication source for '${props.workspaceDescriptor?.name}' to be able to Push.`}
-          <br />
-        </Alert>
-      )}
-      {props.canPush && pushButton}
-    </>
-  );
-}
-
-export function KebabDropdown(props: {
-  id: string;
-  items: React.ReactNode[];
-  state: [boolean, React.Dispatch<React.SetStateAction<boolean>>];
-}) {
-  return (
-    <Dropdown
-      className={"kie-tools--masthead-hoverable"}
-      isOpen={props.state[0]}
-      isPlain={true}
-      position={DropdownPosition.right}
-      onSelect={() => props.state[1](false)}
-      toggle={
-        <DropdownToggle
-          id={props.id}
-          toggleIndicator={null}
-          onToggle={(isOpen) => props.state[1](isOpen)}
-          ouiaId={props.id}
-        >
-          <EllipsisVIcon />
-        </DropdownToggle>
-      }
-      dropdownItems={props.items}
-    />
-  );
-}
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/IconPosition.java b/packages/online-editor/src/editor/Toolbar/Accelerators/AcceleratorIcon.tsx
similarity index 58%
copy from packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/IconPosition.java
copy to packages/online-editor/src/editor/Toolbar/Accelerators/AcceleratorIcon.tsx
index c76fe691f8..568f1ecb9d 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/IconPosition.java
+++ b/packages/online-editor/src/editor/Toolbar/Accelerators/AcceleratorIcon.tsx
@@ -5,7 +5,7 @@
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ *       http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -13,12 +13,20 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.kie.workbench.common.stunner.sw.client.shapes.icons;
 
-import com.ait.lienzo.client.core.types.Point2D;
+import React from "react";
+import { Icon } from "@patternfly/react-core/dist/js/components/Icon";
 
-public interface IconPosition {
+type Props = {
+  iconUrl?: string;
+};
 
-    Point2D RIGHT_TOP_CORNER = new Point2D(224, 6);
-    Point2D LEFT_FROM_RIGHT_TOP_CORNER = new Point2D(202, 6);
+export function AcceleratorIcon(props: Props) {
+  return props.iconUrl ? (
+    <Icon isInline style={{ verticalAlign: "middle" }}>
+      <img src={props.iconUrl} />
+    </Icon>
+  ) : (
+    <span>🚀</span>
+  );
 }
diff --git a/packages/online-editor/src/editor/Toolbar/Accelerators/AcceleratorIndicator.tsx b/packages/online-editor/src/editor/Toolbar/Accelerators/AcceleratorIndicator.tsx
new file mode 100644
index 0000000000..ee6b795d7f
--- /dev/null
+++ b/packages/online-editor/src/editor/Toolbar/Accelerators/AcceleratorIndicator.tsx
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { useState } from "react";
+import { useCurrentAccelerator } from "../../../accelerators/AcceleratorsHooks";
+import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
+import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
+import { AcceleratorModal } from "./AcceleratorModal";
+import { AcceleratorIcon } from "./AcceleratorIcon";
+
+type Props = {
+  workspaceId: string;
+};
+
+export function AcceleratorIndicator(props: Props) {
+  const [isAcceleratorDetailsModalOpen, setAcceleratorDetailsModalOpen] = useState(false);
+  const currentAccelerator = useCurrentAccelerator(props.workspaceId);
+
+  if (!currentAccelerator) {
+    return <></>;
+  }
+
+  return (
+    <Tooltip
+      position={"right"}
+      content={
+        <>
+          <AcceleratorIcon iconUrl={currentAccelerator.iconUrl} />
+          &nbsp;
+          {currentAccelerator.name} Accelerator
+        </>
+      }
+    >
+      <>
+        <Button
+          variant={ButtonVariant.plain}
+          onClick={() => setAcceleratorDetailsModalOpen(true)}
+          className={"kie-tools--masthead-hoverable"}
+        >
+          <AcceleratorIcon iconUrl={currentAccelerator.iconUrl} />
+        </Button>
+        <AcceleratorModal
+          isOpen={isAcceleratorDetailsModalOpen}
+          onClose={() => setAcceleratorDetailsModalOpen(false)}
+          accelerator={currentAccelerator}
+        />
+      </>
+    </Tooltip>
+  );
+}
diff --git a/packages/online-editor/src/editor/Toolbar/Accelerators/AcceleratorModal.tsx b/packages/online-editor/src/editor/Toolbar/Accelerators/AcceleratorModal.tsx
new file mode 100644
index 0000000000..b0f3982563
--- /dev/null
+++ b/packages/online-editor/src/editor/Toolbar/Accelerators/AcceleratorModal.tsx
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from "react";
+import { AcceleratorAppliedConfig } from "../../../accelerators/AcceleratorsApi";
+import { useOnlineI18n } from "../../../i18n";
+import { Title } from "@patternfly/react-core/dist/js/components/Title";
+import { Grid, GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
+import { Modal, ModalVariant } from "@patternfly/react-core/dist/js/components/Modal";
+import { Button } from "@patternfly/react-core/dist/js/components/Button";
+import { AcceleratorIcon } from "./AcceleratorIcon";
+import { Divider } from "@patternfly/react-core/dist/js/components/Divider";
+
+type Props = {
+  accelerator: AcceleratorAppliedConfig;
+  isOpen: boolean;
+  onClose: () => any;
+  isApplying?: boolean;
+  onApplyAccelerator?: () => void;
+};
+
+export function AcceleratorModal(props: Props) {
+  const { i18n } = useOnlineI18n();
+
+  return (
+    <Modal
+      isOpen={props.isOpen}
+      onClose={props.onClose}
+      aria-label="Accelerator"
+      variant={ModalVariant.medium}
+      actions={
+        props.isApplying && [
+          <Button key="apply" variant="primary" onClick={props.onApplyAccelerator}>
+            {i18n.terms.apply}
+          </Button>,
+          <Button key="cancel" variant="link" onClick={props.onClose}>
+            {i18n.terms.cancel}
+          </Button>,
+        ]
+      }
+    >
+      <Title headingLevel="h1">
+        <AcceleratorIcon iconUrl={props.accelerator.iconUrl} />
+        &nbsp;
+        {props.accelerator.name} Accelerator
+      </Title>
+      <Grid style={{ margin: "1rem 0" }} hasGutter>
+        {props.isApplying && (
+          <GridItem span={12}>
+            <i>{i18n.accelerators.acceleratorDescription}</i>
+          </GridItem>
+        )}
+        <GridItem span={12}>
+          <p>
+            {i18n.accelerators.acceleratorDetails}
+            &nbsp;
+            <a href={props.accelerator.gitRepositoryUrl} target="__blank">
+              {props.accelerator.gitRepositoryUrl}
+            </a>
+          </p>
+          Git ref:{" "}
+          <small>
+            <pre style={{ display: "inline" }}>@{props.accelerator.gitRepositoryGitRef}</pre>
+          </small>
+        </GridItem>
+        <Divider />
+        <GridItem span={6}>
+          {props.isApplying ? i18n.accelerators.dmnFilesMove : i18n.accelerators.dmnFilesLocation}
+        </GridItem>
+        <GridItem span={6}>
+          <pre>{props.accelerator.dmnDestinationFolder}</pre>
+        </GridItem>
+        <GridItem span={6}>
+          {props.isApplying ? i18n.accelerators.pmmlFilesMove : i18n.accelerators.pmmlFilesLocation}
+        </GridItem>
+        <GridItem span={6}>
+          <pre>{props.accelerator.dmnDestinationFolder}</pre>
+        </GridItem>
+        <GridItem span={6}>
+          {props.isApplying ? i18n.accelerators.bpmnFilesMove : i18n.accelerators.bpmnFilesLocation}
+        </GridItem>
+        <GridItem span={6}>
+          <pre>{props.accelerator.bpmnDestinationFolder}</pre>
+        </GridItem>
+        <GridItem span={6}>
+          {props.isApplying ? i18n.accelerators.otherFilesMove : i18n.accelerators.otherFilesLocation}
+        </GridItem>
+        <GridItem span={6}>
+          <pre>{props.accelerator.otherFilesDestinationFolder}</pre>
+        </GridItem>
+        {!props.isApplying && props.accelerator.appliedAt && (
+          <>
+            <Divider />
+            <GridItem span={12}>
+              <i>
+                {i18n.accelerators.appliedAt} {new Date(props.accelerator.appliedAt).toLocaleString()}
+              </i>
+            </GridItem>
+          </>
+        )}
+        {props.isApplying && (
+          <>
+            <Divider />
+            <GridItem span={12}>
+              <i>{i18n.accelerators.applyDisclaimer}</i>
+            </GridItem>
+          </>
+        )}
+      </Grid>
+    </Modal>
+  );
+}
diff --git a/packages/online-editor/src/editor/Toolbar/Accelerators/AcceleratorsDropdown.tsx b/packages/online-editor/src/editor/Toolbar/Accelerators/AcceleratorsDropdown.tsx
new file mode 100644
index 0000000000..8c535c31a1
--- /dev/null
+++ b/packages/online-editor/src/editor/Toolbar/Accelerators/AcceleratorsDropdown.tsx
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { useCallback, useState } from "react";
+import { ResponsiveDropdown } from "../../../ResponsiveDropdown/ResponsiveDropdown";
+import { ResponsiveDropdownToggle } from "../../../ResponsiveDropdown/ResponsiveDropdownToggle";
+import { useEditorToolbarContext, useEditorToolbarDispatchContext } from "../EditorToolbarContextProvider";
+import CaretDownIcon from "@patternfly/react-icons/dist/js/icons/caret-down-icon";
+import {
+  useAcceleratorsDispatch,
+  useAvailableAccelerators,
+  useCurrentAccelerator,
+} from "../../../accelerators/AcceleratorsHooks";
+import { DropdownItem } from "@patternfly/react-core/dist/js/components/Dropdown";
+import { WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+import { AcceleratorConfig } from "../../../accelerators/AcceleratorsApi";
+import { useOnlineI18n } from "../../../i18n";
+import { AcceleratorModal } from "./AcceleratorModal";
+import { AcceleratorIcon } from "./AcceleratorIcon";
+
+type Props = {
+  workspaceFile: WorkspaceFile;
+};
+
+export function AcceleratorsDropdown(props: Props) {
+  const { i18n } = useOnlineI18n();
+  const { isAcceleratorsDropdownOpen, workspace } = useEditorToolbarContext();
+  const { setAcceleratorsDropdownOpen } = useEditorToolbarDispatchContext();
+  const accelerators = useAvailableAccelerators();
+  const { applyAcceleratorToWorkspace } = useAcceleratorsDispatch(workspace);
+  const [isApplyModalOpen, setApplyModalOpen] = useState(false);
+  const [selectedAccelerator, setSelectedAccelerator] = useState<AcceleratorConfig | undefined>();
+
+  const currentAccelerator = useCurrentAccelerator(props.workspaceFile.workspaceId);
+
+  const onOpenApplyAccelerator = useCallback(
+    (accelerator: AcceleratorConfig) => {
+      setAcceleratorsDropdownOpen(false);
+      setSelectedAccelerator(accelerator);
+      setApplyModalOpen(true);
+    },
+    [setAcceleratorsDropdownOpen]
+  );
+
+  const onApplyAccelerator = useCallback(() => {
+    if (selectedAccelerator) {
+      applyAcceleratorToWorkspace(selectedAccelerator, props.workspaceFile);
+    }
+    setSelectedAccelerator(undefined);
+    setApplyModalOpen(false);
+  }, [applyAcceleratorToWorkspace, props.workspaceFile, selectedAccelerator]);
+
+  if (currentAccelerator) {
+    return <></>;
+  }
+
+  return (
+    <>
+      <ResponsiveDropdown
+        title="Accelerators"
+        className={"kie-tools--masthead-hoverable"}
+        isPlain={true}
+        onClose={() => setAcceleratorsDropdownOpen(false)}
+        position={"right"}
+        isOpen={isAcceleratorsDropdownOpen}
+        toggle={
+          <ResponsiveDropdownToggle
+            onToggle={() => setAcceleratorsDropdownOpen((prev) => !prev)}
+            toggleIndicator={CaretDownIcon}
+            icon={<i>🚀</i>}
+          >
+            {i18n.accelerators.applyAccelerator}
+          </ResponsiveDropdownToggle>
+        }
+        dropdownItems={accelerators.map((accelerator) => (
+          <DropdownItem
+            key={accelerator.name}
+            icon={<AcceleratorIcon iconUrl={accelerator.iconUrl} />}
+            onClick={() => onOpenApplyAccelerator(accelerator)}
+          >
+            {accelerator.name}...
+          </DropdownItem>
+        ))}
+      />
+      {selectedAccelerator && (
+        <AcceleratorModal
+          isOpen={isApplyModalOpen}
+          onClose={() => setApplyModalOpen(false)}
+          onApplyAccelerator={onApplyAccelerator}
+          accelerator={selectedAccelerator}
+          isApplying={true}
+        />
+      )}
+    </>
+  );
+}
diff --git a/packages/online-editor/src/editor/Toolbar/EditorToolbar.tsx b/packages/online-editor/src/editor/Toolbar/EditorToolbar.tsx
new file mode 100644
index 0000000000..b173250ace
--- /dev/null
+++ b/packages/online-editor/src/editor/Toolbar/EditorToolbar.tsx
@@ -0,0 +1,438 @@
+/*
+ * Copyright 2019 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { useCallback, useEffect, useMemo, useRef } from "react";
+import {
+  Dropdown,
+  DropdownItem,
+  DropdownPosition,
+  DropdownToggle,
+} from "@patternfly/react-core/dist/js/components/Dropdown";
+import {
+  Toolbar,
+  ToolbarContent,
+  ToolbarGroup,
+  ToolbarItem,
+  ToolbarItemProps,
+} from "@patternfly/react-core/dist/js/components/Toolbar";
+import { SaveIcon } from "@patternfly/react-icons/dist/js/icons/save-icon";
+import { useOnlineI18n } from "../../i18n";
+import { KieSandboxExtendedServicesButtons } from "../KieSandboxExtendedServices/KieSandboxExtendedServicesButtons";
+import { useRoutes } from "../../navigation/Hooks";
+import { EmbeddedEditorRef } from "@kie-tools-core/editor/dist/embedded";
+import { useHistory } from "react-router";
+import { useWorkspaces, WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+import { PlusIcon } from "@patternfly/react-icons/dist/js/icons/plus-icon";
+import { Flex, FlexItem } from "@patternfly/react-core/dist/js/layouts/Flex";
+import { NewFileDropdownMenu } from "./NewFileDropdownMenu";
+import { PageHeaderToolsItem, PageSection } from "@patternfly/react-core/dist/js/components/Page";
+import { FileLabel } from "../../filesList/FileLabel";
+import {
+  useWorkspaceGitStatusPromise,
+  useWorkspacePromise,
+  WorkspaceGitStatusType,
+} from "@kie-tools-core/workspaces-git-fs/dist/hooks/WorkspaceHooks";
+import { FileSwitcher } from "./FileSwitcher";
+import { Divider } from "@patternfly/react-core/dist/js/components/Divider";
+import { KieSandboxExtendedServicesDropdownGroup } from "../KieSandboxExtendedServices/KieSandboxExtendedServicesDropdownGroup";
+import { TrashIcon } from "@patternfly/react-icons/dist/js/icons/trash-icon";
+import { CaretDownIcon } from "@patternfly/react-icons/dist/js/icons/caret-down-icon";
+import { WorkspaceKind } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceOrigin";
+import { EditorPageDockDrawerRef } from "../EditorPageDockDrawer";
+import { useEditorEnvelopeLocator } from "../../envelopeLocator/hooks/EditorEnvelopeLocatorContext";
+import { ResponsiveDropdown } from "../../ResponsiveDropdown/ResponsiveDropdown";
+import { ResponsiveDropdownToggle } from "../../ResponsiveDropdown/ResponsiveDropdownToggle";
+import { useAuthSession } from "../../authSessions/AuthSessionsContext";
+import { KebabDropdown } from "./KebabDropdown";
+import { VsCodeDropdownMenu } from "./VsCodeDropdownMenu";
+import { DownloadDropdownGroup } from "./Share/DownloadDropdownGroup";
+import { GitDropdownGroup } from "./Share/GitDropdownGroup";
+import { EmbedDropdownGroup } from "./Share/EmbedDropdownGroup";
+import { ActiveWorkspace } from "@kie-tools-core/workspaces-git-fs/dist/model/ActiveWorkspace";
+import { useGitIntegration } from "./GitIntegration/GitIntegrationContextProvider";
+import {
+  EditorToolbarContextProvider,
+  useEditorToolbarContext,
+  useEditorToolbarDispatchContext,
+} from "./EditorToolbarContextProvider";
+import { WorkspaceToolbar } from "./Workspace/WorkspaceToolbar";
+import { useWorkspaceNavigationBlocker } from "./Workspace/Hooks";
+import { FileStatus } from "./FileStatus";
+import { SyncDropdownMenu } from "./SyncDropdownMenu";
+import { AcceleratorsDropdown } from "./Accelerators/AcceleratorsDropdown";
+import { listDeletedFiles } from "../../workspace/components/WorkspaceStatusIndicator";
+import { PromiseState } from "@kie-tools-core/react-hooks/dist/PromiseState";
+
+export interface Props {
+  editor: EmbeddedEditorRef | undefined;
+  workspaceFile: WorkspaceFile;
+  editorPageDock: EditorPageDockDrawerRef | undefined;
+}
+
+const showWhenSmall: ToolbarItemProps["visibility"] = {
+  default: "visible",
+  "2xl": "hidden",
+  xl: "hidden",
+  lg: "visible",
+  md: "visible",
+};
+
+const hideWhenSmall: ToolbarItemProps["visibility"] = {
+  default: "hidden",
+  "2xl": "visible",
+  xl: "visible",
+  lg: "hidden",
+  md: "hidden",
+};
+
+const hideWhenTiny: ToolbarItemProps["visibility"] = {
+  default: "hidden",
+  "2xl": "visible",
+  xl: "visible",
+  lg: "visible",
+  md: "hidden",
+};
+
+export function EditorToolbarWithWorkspace(
+  props: Props & { workspace: ActiveWorkspace; workspaceGitStatusPromise: PromiseState<WorkspaceGitStatusType> }
+) {
+  const routes = useRoutes();
+  const editorEnvelopeLocator = useEditorEnvelopeLocator();
+  const history = useHistory();
+  const workspaces = useWorkspaces();
+  const { i18n } = useOnlineI18n();
+  const copyContentTextArea = useRef<HTMLTextAreaElement>(null);
+
+  const { alerts } = useGitIntegration();
+
+  const { isNewFileDropdownMenuOpen, isShareDropdownOpen, isLargeKebabOpen, isSmallKebabOpen } =
+    useEditorToolbarContext();
+
+  const { setNewFileDropdownMenuOpen, setShareDropdownOpen, setLargeKebabOpen, setSmallKebabOpen } =
+    useEditorToolbarDispatchContext();
+
+  useWorkspaceNavigationBlocker(props.workspace);
+
+  const { gitConfig } = useAuthSession(props.workspace.descriptor.gitAuthSessionId);
+
+  const shareDropdownItems = useMemo(
+    () => [
+      <DownloadDropdownGroup
+        editor={props.editor}
+        workspaceFile={props.workspaceFile}
+        workspace={props.workspace}
+        key="download-dropdown-group"
+      />,
+      <EmbedDropdownGroup workspaceFile={props.workspaceFile} workspace={props.workspace} key="embed-dropdown-group" />,
+      <GitDropdownGroup workspace={props.workspace} key="git-dropdown-group" />,
+    ],
+    [props.editor, props.workspaceFile, props.workspace]
+  );
+
+  const handleDeletedWorkspaceFile = useCallback(() => {
+    const nextFile = props.workspace.files
+      .filter((f) => {
+        return (
+          f.relativePath !== props.workspaceFile.relativePath && editorEnvelopeLocator.hasMappingFor(f.relativePath)
+        );
+      })
+      .pop();
+    if (!nextFile) {
+      history.push({ pathname: routes.home.path({}) });
+      return;
+    }
+
+    history.push({
+      pathname: routes.workspaceWithFilePath.path({
+        workspaceId: nextFile.workspaceId,
+        fileRelativePath: nextFile.relativePathWithoutExtension,
+        extension: nextFile.extension,
+      }),
+    });
+  }, [
+    editorEnvelopeLocator,
+    history,
+    props.workspace.files,
+    props.workspaceFile.relativePath,
+    routes.home,
+    routes.workspaceWithFilePath,
+  ]);
+
+  const deleteWorkspaceFile = useCallback(async () => {
+    if (props.workspace.files.length === 1) {
+      await workspaces.deleteWorkspace({ workspaceId: props.workspaceFile.workspaceId });
+      history.push({ pathname: routes.home.path({}) });
+      return;
+    }
+
+    await workspaces.deleteFile({
+      file: props.workspaceFile,
+    });
+
+    handleDeletedWorkspaceFile();
+  }, [props.workspace.files.length, props.workspaceFile, workspaces, handleDeletedWorkspaceFile, history, routes.home]);
+
+  const deleteFileDropdownItem = useMemo(() => {
+    return (
+      <DropdownItem key={"delete-dropdown-item"} onClick={deleteWorkspaceFile}>
+        <Flex flexWrap={{ default: "nowrap" }}>
+          <FlexItem>
+            <TrashIcon />
+            &nbsp;&nbsp;Delete <b>{`"${props.workspaceFile.nameWithoutExtension}"`}</b>
+          </FlexItem>
+          <FlexItem>
+            <b>
+              <FileLabel extension={props.workspaceFile.extension} />
+            </b>
+          </FlexItem>
+        </Flex>
+      </DropdownItem>
+    );
+  }, [deleteWorkspaceFile, props.workspaceFile]);
+
+  const createSavePointDropdownItem = useMemo(() => {
+    return (
+      <DropdownItem
+        key={"commit-dropdown-item"}
+        icon={<SaveIcon />}
+        onClick={async () => {
+          if (!(await workspaces.hasLocalChanges({ workspaceId: props.workspaceFile.workspaceId }))) {
+            alerts.nothingToCommitAlert.show();
+            return;
+          }
+          alerts.comittingAlert.show();
+          try {
+            await workspaces.createSavePoint({
+              workspaceId: props.workspaceFile.workspaceId,
+              gitConfig,
+            });
+            alerts.comittingAlert.close();
+            alerts.commitSuccessAlert.show();
+          } catch (e) {
+            alerts.comittingAlert.close();
+            alerts.commitFailAlert.show({ reason: e.message });
+          }
+        }}
+        description={"Create a save point"}
+      >
+        Commit
+      </DropdownItem>
+    );
+  }, [
+    workspaces,
+    props.workspaceFile.workspaceId,
+    alerts.comittingAlert,
+    alerts.nothingToCommitAlert,
+    alerts.commitSuccessAlert,
+    alerts.commitFailAlert,
+    gitConfig,
+  ]);
+
+  const canSeeWorkspaceToolbar = useMemo(
+    () =>
+      props.workspace.descriptor.origin.kind !== WorkspaceKind.LOCAL ||
+      props.workspace.files.length +
+        listDeletedFiles({
+          workspaceDescriptor: props.workspace.descriptor,
+          workspaceGitStatusPromise: props.workspaceGitStatusPromise,
+        }).length >
+        1,
+    [props.workspace.descriptor, props.workspace.files.length, props.workspaceGitStatusPromise]
+  );
+
+  return (
+    <>
+      <PageSection type={"nav"} variant={"light"} padding={{ default: "noPadding" }}>
+        {canSeeWorkspaceToolbar && (
+          <Flex
+            justifyContent={{ default: "justifyContentSpaceBetween" }}
+            flexWrap={{ default: "nowrap" }}
+            spaceItems={{ default: "spaceItemsMd" }}
+          >
+            <FlexItem style={{ minWidth: 0 }}>
+              <WorkspaceToolbar
+                workspace={props.workspace}
+                workspaceGitStatusPromise={props.workspaceGitStatusPromise}
+                currentWorkspaceFile={props.workspaceFile}
+                onDeletedWorkspaceFile={handleDeletedWorkspaceFile}
+              />
+            </FlexItem>
+            <VsCodeDropdownMenu workspace={props.workspace} />
+          </Flex>
+        )}
+      </PageSection>
+      <PageSection type={"nav"} variant={"light"} style={{ paddingTop: 0, paddingBottom: "16px" }}>
+        <Flex
+          justifyContent={{ default: "justifyContentSpaceBetween" }}
+          alignItems={{ default: "alignItemsCenter" }}
+          flexWrap={{ default: "nowrap" }}
+        >
+          <FlexItem style={{ minWidth: 0 }}>
+            <PageHeaderToolsItem visibility={{ default: "visible" }}>
+              <Flex flexWrap={{ default: "nowrap" }} alignItems={{ default: "alignItemsCenter" }}>
+                <FlexItem style={{ minWidth: 0 }}>
+                  <FileSwitcher
+                    workspace={props.workspace}
+                    gitStatusProps={
+                      canSeeWorkspaceToolbar
+                        ? {
+                            workspaceDescriptor: props.workspace.descriptor,
+                            workspaceGitStatusPromise: props.workspaceGitStatusPromise,
+                          }
+                        : undefined
+                    }
+                    workspaceFile={props.workspaceFile}
+                    onDeletedWorkspaceFile={handleDeletedWorkspaceFile}
+                  />
+                </FlexItem>
+                <FileStatus workspace={props.workspace} workspaceFile={props.workspaceFile} editor={props.editor} />
+              </Flex>
+            </PageHeaderToolsItem>
+          </FlexItem>
+          <FlexItem>
+            <Toolbar>
+              <ToolbarContent style={{ paddingRight: 0 }}>
+                <ToolbarGroup>
+                  <ToolbarItem>
+                    <AcceleratorsDropdown workspaceFile={props.workspaceFile} />
+                  </ToolbarItem>
+                  <ToolbarItem>
+                    <ResponsiveDropdown
+                      title={"Add file"}
+                      onClose={() => setNewFileDropdownMenuOpen(false)}
+                      position={"right"}
+                      isOpen={isNewFileDropdownMenuOpen}
+                      toggle={
+                        <ResponsiveDropdownToggle
+                          onToggle={() => setNewFileDropdownMenuOpen((prev) => !prev)}
+                          isPrimary={true}
+                          toggleIndicator={CaretDownIcon}
+                        >
+                          <PlusIcon />
+                          &nbsp;&nbsp;New file
+                        </ResponsiveDropdownToggle>
+                      }
+                    >
+                      <NewFileDropdownMenu
+                        workspaceDescriptor={props.workspace.descriptor}
+                        destinationDirPath={props.workspaceFile.relativeDirPath}
+                        onAddFile={async (file) => {
+                          setNewFileDropdownMenuOpen(false);
+                          if (!file) {
+                            return;
+                          }
+
+                          history.push({
+                            pathname: routes.workspaceWithFilePath.path({
+                              workspaceId: file.workspaceId,
+                              fileRelativePath: file.relativePathWithoutExtension,
+                              extension: file.extension,
+                            }),
+                          });
+                        }}
+                      />
+                    </ResponsiveDropdown>
+                  </ToolbarItem>
+                  <ToolbarItem visibility={hideWhenSmall}>
+                    {props.workspaceFile.extension === "dmn" && (
+                      <ToolbarGroup>
+                        <KieSandboxExtendedServicesButtons
+                          workspace={props.workspace}
+                          workspaceFile={props.workspaceFile}
+                          editorPageDock={props.editorPageDock}
+                        />
+                      </ToolbarGroup>
+                    )}
+                  </ToolbarItem>
+                  {props.workspace.descriptor.origin.kind !== WorkspaceKind.LOCAL && (
+                    <ToolbarItem>
+                      <SyncDropdownMenu workspace={props.workspace} />
+                    </ToolbarItem>
+                  )}
+                  <ToolbarItem visibility={hideWhenSmall}>
+                    <Dropdown
+                      onSelect={() => setShareDropdownOpen(false)}
+                      isOpen={isShareDropdownOpen}
+                      dropdownItems={shareDropdownItems}
+                      position={DropdownPosition.right}
+                      toggle={
+                        <DropdownToggle
+                          id={"share-dropdown"}
+                          data-testid={"share-dropdown"}
+                          onToggle={(isOpen) => setShareDropdownOpen(isOpen)}
+                        >
+                          {i18n.editorToolbar.share}
+                        </DropdownToggle>
+                      }
+                    />
+                  </ToolbarItem>
+                  <ToolbarItem visibility={hideWhenSmall} style={{ marginRight: 0 }}>
+                    <KebabDropdown
+                      id={"kebab-lg"}
+                      state={[isLargeKebabOpen, setLargeKebabOpen]}
+                      items={[deleteFileDropdownItem, <Divider key={"divider-0"} />, createSavePointDropdownItem]}
+                    />
+                  </ToolbarItem>
+                  <ToolbarItem visibility={showWhenSmall} style={{ marginRight: 0 }}>
+                    <KebabDropdown
+                      id={"kebab-sm"}
+                      state={[isSmallKebabOpen, setSmallKebabOpen]}
+                      items={[
+                        deleteFileDropdownItem,
+                        <Divider key={"divider-0"} />,
+                        createSavePointDropdownItem,
+                        <Divider key={"divider-1"} />,
+                        ...shareDropdownItems,
+                        ...(props.workspaceFile.extension !== "dmn"
+                          ? []
+                          : [
+                              <Divider key={"divider-2"} />,
+                              <KieSandboxExtendedServicesDropdownGroup
+                                workspace={props.workspace}
+                                key="kie-sandbox-extended-services-group"
+                              />,
+                            ]),
+                      ]}
+                    />
+                  </ToolbarItem>
+                </ToolbarGroup>
+              </ToolbarContent>
+            </Toolbar>
+          </FlexItem>
+        </Flex>
+      </PageSection>
+      <textarea ref={copyContentTextArea} style={{ height: 0, position: "absolute", zIndex: -1 }} />
+    </>
+  );
+}
+
+export function EditorToolbar(props: Props) {
+  const workspacePromise = useWorkspacePromise(props.workspaceFile.workspaceId);
+  const workspaceGitStatusPromise = useWorkspaceGitStatusPromise(workspacePromise.data?.descriptor);
+  if (!workspacePromise.data) {
+    return <></>;
+  }
+
+  return (
+    <EditorToolbarContextProvider {...props} workspace={workspacePromise.data}>
+      <EditorToolbarWithWorkspace
+        {...props}
+        workspace={workspacePromise.data}
+        workspaceGitStatusPromise={workspaceGitStatusPromise}
+      />
+    </EditorToolbarContextProvider>
+  );
+}
diff --git a/packages/online-editor/src/editor/Toolbar/EditorToolbarContextProvider.tsx b/packages/online-editor/src/editor/Toolbar/EditorToolbarContextProvider.tsx
new file mode 100644
index 0000000000..f212e59c38
--- /dev/null
+++ b/packages/online-editor/src/editor/Toolbar/EditorToolbarContextProvider.tsx
@@ -0,0 +1,207 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, {
+  Dispatch,
+  ReactNode,
+  RefObject,
+  SetStateAction,
+  createContext,
+  useCallback,
+  useContext,
+  useMemo,
+  useRef,
+  useState,
+} from "react";
+import { ActiveWorkspace } from "@kie-tools-core/workspaces-git-fs/dist/model/ActiveWorkspace";
+import { GitIntegrationContextProvider } from "./GitIntegration/GitIntegrationContextProvider";
+import { WorkspaceFile, useWorkspaces } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+import { CreateGitRepositoryModal } from "./GitIntegration/CreateGitRepositoryModal";
+import { CreateGistOrSnippetModal } from "./GitIntegration/CreateGistOrSnippetModal";
+import { EmbedModal } from "./Share/EmbedModal";
+import { EmbeddedEditorRef } from "@kie-tools-core/editor/dist/embedded";
+import { WorkspaceKind } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceOrigin";
+import { useAuthSession } from "../../authSessions/AuthSessionsContext";
+
+export type EditorToolbarContextType = {
+  isEmbedModalOpen: boolean;
+  isCreateGitRepositoryModalOpen: boolean;
+  isCreateGistOrSnippetModalOpen: boolean;
+  isShareDropdownOpen: boolean;
+  isSyncGistOrSnippetDropdownOpen: boolean;
+  isSyncGitRepositoryDropdownOpen: boolean;
+  isLargeKebabOpen: boolean;
+  isSmallKebabOpen: boolean;
+  isNewFileDropdownMenuOpen: boolean;
+  isAcceleratorsDropdownOpen: boolean;
+  downloadRef: RefObject<HTMLAnchorElement>;
+  downloadAllRef: RefObject<HTMLAnchorElement>;
+  downloadPreviewRef: RefObject<HTMLAnchorElement>;
+  downloadWorkspaceZip: () => Promise<void>;
+  workspace: ActiveWorkspace;
+};
+
+export type EditorToolbarDispatchContextType = {
+  setEmbedModalOpen: Dispatch<SetStateAction<boolean>>;
+  setCreateGitRepositoryModalOpen: Dispatch<SetStateAction<boolean>>;
+  setCreateGistOrSnippetModalOpen: Dispatch<SetStateAction<boolean>>;
+  setShareDropdownOpen: Dispatch<SetStateAction<boolean>>;
+  setSyncGistOrSnippetDropdownOpen: Dispatch<SetStateAction<boolean>>;
+  setSyncGitRepositoryDropdownOpen: Dispatch<SetStateAction<boolean>>;
+  setLargeKebabOpen: Dispatch<SetStateAction<boolean>>;
+  setSmallKebabOpen: Dispatch<SetStateAction<boolean>>;
+  setNewFileDropdownMenuOpen: Dispatch<SetStateAction<boolean>>;
+  setAcceleratorsDropdownOpen: Dispatch<SetStateAction<boolean>>;
+};
+
+export const EditorToolbarContext = createContext<EditorToolbarContextType>({} as any);
+export const EditorToolbarDispatchContext = createContext<EditorToolbarDispatchContextType>({} as any);
+
+type Props = {
+  workspace: ActiveWorkspace;
+  workspaceFile: WorkspaceFile;
+  children: ReactNode;
+  editor: EmbeddedEditorRef | undefined;
+};
+
+export function EditorToolbarContextProvider(props: Props) {
+  const [isEmbedModalOpen, setEmbedModalOpen] = useState(false);
+  const [isCreateGitRepositoryModalOpen, setCreateGitRepositoryModalOpen] = useState(false);
+  const [isCreateGistOrSnippetModalOpen, setCreateGistOrSnippetModalOpen] = useState(false);
+  const [isShareDropdownOpen, setShareDropdownOpen] = useState(false);
+  const [isSyncGistOrSnippetDropdownOpen, setSyncGistOrSnippetDropdownOpen] = useState(false);
+  const [isSyncGitRepositoryDropdownOpen, setSyncGitRepositoryDropdownOpen] = useState(false);
+  const [isAcceleratorsDropdownOpen, setAcceleratorsDropdownOpen] = useState(false);
+  const [isLargeKebabOpen, setLargeKebabOpen] = useState(false);
+  const [isSmallKebabOpen, setSmallKebabOpen] = useState(false);
+  const [isNewFileDropdownMenuOpen, setNewFileDropdownMenuOpen] = useState(false);
+  const downloadRef = useRef<HTMLAnchorElement>(null);
+  const downloadAllRef = useRef<HTMLAnchorElement>(null);
+  const downloadPreviewRef = useRef<HTMLAnchorElement>(null);
+  const workspaces = useWorkspaces();
+  const { gitConfig } = useAuthSession(props.workspace.descriptor.gitAuthSessionId);
+
+  const downloadWorkspaceZip = useCallback(async () => {
+    if (!props.editor) {
+      return;
+    }
+
+    const zipBlob = await workspaces.prepareZip({ workspaceId: props.workspaceFile.workspaceId });
+    if (downloadAllRef.current) {
+      downloadAllRef.current.href = URL.createObjectURL(zipBlob);
+      downloadAllRef.current.click();
+    }
+    if (props.workspace.descriptor.origin.kind === WorkspaceKind.LOCAL) {
+      await workspaces.createSavePoint({ workspaceId: props.workspaceFile.workspaceId, gitConfig });
+    }
+  }, [
+    props.editor,
+    props.workspaceFile.workspaceId,
+    props.workspace.descriptor.origin.kind,
+    workspaces,
+    downloadAllRef,
+    gitConfig,
+  ]);
+
+  const value = useMemo(
+    () => ({
+      isEmbedModalOpen,
+      isCreateGitRepositoryModalOpen,
+      isCreateGistOrSnippetModalOpen,
+      isShareDropdownOpen,
+      isSyncGistOrSnippetDropdownOpen,
+      isSyncGitRepositoryDropdownOpen,
+      isAcceleratorsDropdownOpen,
+      isLargeKebabOpen,
+      isSmallKebabOpen,
+      isNewFileDropdownMenuOpen,
+      downloadRef,
+      downloadAllRef,
+      downloadPreviewRef,
+      downloadWorkspaceZip,
+      workspace: props.workspace,
+    }),
+    [
+      isCreateGistOrSnippetModalOpen,
+      isCreateGitRepositoryModalOpen,
+      isEmbedModalOpen,
+      isLargeKebabOpen,
+      isNewFileDropdownMenuOpen,
+      isShareDropdownOpen,
+      isSmallKebabOpen,
+      isSyncGistOrSnippetDropdownOpen,
+      isSyncGitRepositoryDropdownOpen,
+      isAcceleratorsDropdownOpen,
+      downloadWorkspaceZip,
+      props.workspace,
+    ]
+  );
+
+  const dispatch = useMemo(
+    () => ({
+      setEmbedModalOpen,
+      setCreateGitRepositoryModalOpen,
+      setCreateGistOrSnippetModalOpen,
+      setShareDropdownOpen,
+      setSyncGistOrSnippetDropdownOpen,
+      setSyncGitRepositoryDropdownOpen,
+      setLargeKebabOpen,
+      setSmallKebabOpen,
+      setNewFileDropdownMenuOpen,
+      setAcceleratorsDropdownOpen,
+    }),
+    []
+  );
+
+  return (
+    <EditorToolbarContext.Provider value={value}>
+      <EditorToolbarDispatchContext.Provider value={dispatch}>
+        <GitIntegrationContextProvider workspace={props.workspace}>
+          {props.children}
+          <CreateGitRepositoryModal
+            workspace={props.workspace.descriptor}
+            isOpen={isCreateGitRepositoryModalOpen}
+            onClose={() => setCreateGitRepositoryModalOpen(false)}
+          />
+          <CreateGistOrSnippetModal
+            workspace={props.workspace.descriptor}
+            isOpen={isCreateGistOrSnippetModalOpen}
+            onClose={() => setCreateGistOrSnippetModalOpen(false)}
+          />
+          <EmbedModal
+            workspace={props.workspace.descriptor}
+            workspaceFile={props.workspaceFile}
+            isOpen={isEmbedModalOpen}
+            onClose={() => setEmbedModalOpen(false)}
+          />
+          <>
+            <a ref={downloadRef} />
+            <a ref={downloadAllRef} />
+            <a ref={downloadPreviewRef} />
+          </>
+        </GitIntegrationContextProvider>
+      </EditorToolbarDispatchContext.Provider>
+    </EditorToolbarContext.Provider>
+  );
+}
+
+export function useEditorToolbarContext() {
+  return useContext(EditorToolbarContext);
+}
+
+export function useEditorToolbarDispatchContext() {
+  return useContext(EditorToolbarDispatchContext);
+}
diff --git a/packages/online-editor/src/editor/Toolbar/FileStatus.tsx b/packages/online-editor/src/editor/Toolbar/FileStatus.tsx
new file mode 100644
index 0000000000..1b33627fec
--- /dev/null
+++ b/packages/online-editor/src/editor/Toolbar/FileStatus.tsx
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { useEffect, useMemo } from "react";
+import { EmbeddedEditorRef, useDirtyState } from "@kie-tools-core/editor/dist/embedded";
+import { WorkspaceFile, useWorkspaces } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+import { ActiveWorkspace } from "@kie-tools-core/workspaces-git-fs/dist/model/ActiveWorkspace";
+import { FlexItem } from "@patternfly/react-core/dist/js/layouts/Flex";
+import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
+import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
+import OutlinedClockIcon from "@patternfly/react-icons/dist/js/icons/outlined-clock-icon";
+import DesktopIcon from "@patternfly/react-icons/dist/js/icons/desktop-icon";
+import { useSharedValue } from "@kie-tools-core/envelope-bus/dist/hooks";
+import OutlinedHddIcon from "@patternfly/react-icons/dist/js/icons/outlined-hdd-icon";
+
+type Props = {
+  workspace: ActiveWorkspace;
+  workspaceFile: WorkspaceFile;
+  editor: EmbeddedEditorRef | undefined;
+};
+
+export function FileStatus(props: Props) {
+  const workspaces = useWorkspaces();
+  const isEdited = useDirtyState(props.editor);
+
+  const [flushes] = useSharedValue(
+    workspaces.workspacesSharedWorker.workspacesWorkerBus.clientApi.shared.kieSandboxWorkspacesStorage_flushes
+  );
+
+  const isSaved = useMemo(() => {
+    return !isEdited && flushes && !flushes.some((f) => f.includes(props.workspaceFile.workspaceId));
+  }, [isEdited, flushes, props.workspaceFile.workspaceId]);
+
+  // Prevent from closing without flushing before.
+  useEffect(() => {
+    if (isSaved) {
+      return;
+    }
+
+    window.onbeforeunload = () => "Some changes are not written to disk yet.";
+    return () => {
+      window.onbeforeunload = null;
+    };
+  }, [isSaved]);
+
+  return (
+    <>
+      <FlexItem>
+        {(isEdited && (
+          <Tooltip content={"Saving in memory..."} position={"bottom"}>
+            <TextContent style={{ color: "gray", ...(!props.workspaceFile ? { visibility: "hidden" } : {}) }}>
+              <Text
+                style={{ display: "flex" }}
+                aria-label={"Saving in memory..."}
+                data-testid="is-saving-in-memory-indicator"
+                component={TextVariants.small}
+              >
+                <OutlinedClockIcon size={"sm"} style={{ margin: 0 }} />
+              </Text>
+            </TextContent>
+          </Tooltip>
+        )) || (
+          <Tooltip content={"File is in memory."} position={"bottom"}>
+            <TextContent style={{ color: "gray", ...(!props.workspaceFile ? { visibility: "hidden" } : {}) }}>
+              <Text
+                style={{ display: "flex" }}
+                aria-label={"File is in memory."}
+                data-testid="is-saved-in-memory-indicator"
+                component={TextVariants.small}
+              >
+                <DesktopIcon size={"sm"} style={{ margin: 0 }} />
+              </Text>
+            </TextContent>
+          </Tooltip>
+        )}
+      </FlexItem>
+      <FlexItem>
+        {(!isSaved && (
+          <Tooltip content={"Writing file..."} position={"bottom"}>
+            <TextContent style={{ color: "gray", ...(!props.workspaceFile ? { visibility: "hidden" } : {}) }}>
+              <Text
+                style={{ display: "flex" }}
+                aria-label={"Writing file..."}
+                data-testid="is-writing-indicator"
+                component={TextVariants.small}
+              >
+                <OutlinedClockIcon size={"sm"} style={{ margin: 0 }} />
+              </Text>
+            </TextContent>
+          </Tooltip>
+        )) || (
+          <Tooltip content={"File is written on disk."} position={"bottom"}>
+            <TextContent style={{ color: "gray", ...(!props.workspaceFile ? { visibility: "hidden" } : {}) }}>
+              <Text
+                style={{ display: "flex" }}
+                aria-label={"File is written on disk."}
+                data-testid="is-written-indicator"
+                component={TextVariants.small}
+              >
+                <OutlinedHddIcon size={"sm"} style={{ margin: 0 }} />
+              </Text>
+            </TextContent>
+          </Tooltip>
+        )}
+      </FlexItem>
+    </>
+  );
+}
diff --git a/packages/online-editor/src/editor/FileSwitcher.tsx b/packages/online-editor/src/editor/Toolbar/FileSwitcher.tsx
similarity index 51%
rename from packages/online-editor/src/editor/FileSwitcher.tsx
rename to packages/online-editor/src/editor/Toolbar/FileSwitcher.tsx
index 61082f489e..eee495cb4b 100644
--- a/packages/online-editor/src/editor/FileSwitcher.tsx
+++ b/packages/online-editor/src/editor/Toolbar/FileSwitcher.tsx
@@ -16,13 +16,12 @@
 
 import { ActiveWorkspace } from "@kie-tools-core/workspaces-git-fs/dist/model/ActiveWorkspace";
 import { useWorkspaces, WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
-import { useRoutes } from "../navigation/Hooks";
 import * as React from "react";
 import { useCallback, useEffect, useMemo, useRef, useState } from "react";
 import { join } from "path";
 import { Dropdown } from "@patternfly/react-core/dist/js/components/Dropdown";
 import { Flex, FlexItem } from "@patternfly/react-core/dist/js/layouts/Flex";
-import { FileLabel } from "../filesList/FileLabel";
+import { FileLabel } from "../../filesList/FileLabel";
 import { Toggle } from "@patternfly/react-core/dist/js/components/Dropdown/Toggle";
 import { Title } from "@patternfly/react-core/dist/js/components/Title";
 import { Popover } from "@patternfly/react-core/dist/js/components/Popover";
@@ -46,29 +45,25 @@ import { ThLargeIcon } from "@patternfly/react-icons/dist/js/icons/th-large-icon
 import { ListIcon } from "@patternfly/react-icons/dist/js/icons/list-icon";
 import { useWorkspaceDescriptorsPromise } from "@kie-tools-core/workspaces-git-fs/dist/hooks/WorkspacesHooks";
 import { PromiseStateWrapper, useCombinedPromiseState } from "@kie-tools-core/react-hooks/dist/PromiseState";
-import { Split, SplitItem } from "@patternfly/react-core/dist/js/layouts/Split";
 import { Button } from "@patternfly/react-core/dist/js/components/Button";
-import { WorkspaceDescriptor } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceDescriptor";
 import { useWorkspacesFilesPromise } from "@kie-tools-core/workspaces-git-fs/dist/hooks/WorkspacesFiles";
 import { Skeleton } from "@patternfly/react-core/dist/js/components/Skeleton";
 import { Card, CardBody, CardHeader, CardHeaderMain } from "@patternfly/react-core/dist/js/components/Card";
 import { Gallery } from "@patternfly/react-core/dist/js/layouts/Gallery";
-import { useHistory } from "react-router";
 import { Bullseye } from "@patternfly/react-core/dist/js/layouts/Bullseye";
 import { EmptyState, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
 import { CubesIcon } from "@patternfly/react-icons/dist/js/icons/cubes-icon";
-import { ArrowRightIcon } from "@patternfly/react-icons/dist/js/icons/arrow-right-icon";
-import { ArrowLeftIcon } from "@patternfly/react-icons/dist/js/icons/arrow-left-icon";
-import { useEditorEnvelopeLocator } from "../envelopeLocator/hooks/EditorEnvelopeLocatorContext";
+import { useEditorEnvelopeLocator } from "../../envelopeLocator/hooks/EditorEnvelopeLocatorContext";
 import { VariableSizeList } from "react-window";
 import AutoSizer from "react-virtualized-auto-sizer";
 import {
   FileDataList,
   FileLink,
   FileListItem,
+  FileListItemDisplayMode,
   getFileDataListHeight,
   SingleFileWorkspaceDataList,
-} from "../filesList/FileDataList";
+} from "../../filesList/FileDataList";
 import {
   DataList,
   DataListCell,
@@ -76,26 +71,45 @@ import {
   DataListItemCells,
   DataListItemRow,
 } from "@patternfly/react-core/dist/js/components/DataList";
-import { WorkspaceListItem } from "../workspace/components/WorkspaceListItem";
-import { usePreviewSvg } from "../previewSvgs/PreviewSvgHooks";
-import { WorkspaceLoadingMenuItem } from "../workspace/components/WorkspaceLoadingCard";
+import { WorkspaceListItem } from "../../workspace/components/WorkspaceListItem";
+import { usePreviewSvg } from "../../previewSvgs/PreviewSvgHooks";
+import { WorkspaceLoadingMenuItem } from "../../workspace/components/WorkspaceLoadingCard";
+import {
+  listDeletedFiles,
+  resolveGitLocalChangesStatus,
+  WorkspaceGitLocalChangesStatus,
+} from "../../workspace/components/WorkspaceStatusIndicator";
+import { Checkbox } from "@patternfly/react-core/dist/js/components/Checkbox";
+import { SearchInput } from "@patternfly/react-core/dist/js/components/SearchInput";
+import { switchExpression } from "../../switchExpression/switchExpression";
+import { GitStatusProps } from "../../workspace/components/GitStatusIndicatorActions";
 
 const ROOT_MENU_ID = "rootMenu";
 
-enum FilesDropdownMode {
-  LIST_MODELS,
-  LIST_MODELS_AND_OTHERS,
+enum FilesMenuMode {
+  LIST,
   CAROUSEL,
 }
 
 const MIN_FILE_SWITCHER_PANEL_WIDTH_IN_PX = 500;
 const MAX_NUMBER_OF_CAROUSEL_ITEMS_SHOWN = 40;
+// properties to be used for menu height calculation
+const FILE_SWITCHER_INITIAL_HEIGHT_OFFSET_IN_PX = 204;
+const MENU_HEIGHT_MAX_LIMIT_CSS = `calc(100vh - ${FILE_SWITCHER_INITIAL_HEIGHT_OFFSET_IN_PX}px)` as const;
+const DRILLDOWN_NAVIGATION_MENU_ITEM_HEIGHT_IN_PX = 40;
+const MENU_SEARCH_HEIGHT_IN_PX = 64;
+const MENU_SHOW_CHANGED_CHECKBOX_HEIGHT_IN_PX = 36;
+const MENU_DIVIDER_HEIGHT_IN_PX = 17;
 
-export function FileSwitcher(props: { workspace: ActiveWorkspace; workspaceFile: WorkspaceFile }) {
+export function FileSwitcher(props: {
+  workspace: ActiveWorkspace;
+  gitStatusProps?: GitStatusProps;
+  workspaceFile: WorkspaceFile;
+  onDeletedWorkspaceFile: () => void;
+}) {
   const workspaces = useWorkspaces();
   const workspaceFileNameRef = useRef<HTMLInputElement>(null);
   const [newFileNameValid, setNewFileNameValid] = useState<boolean>(true);
-  const [filesDropdownMode, setFilesDropdownMode] = useState(FilesDropdownMode.LIST_MODELS);
 
   const resetWorkspaceFileName = useCallback(() => {
     if (workspaceFileNameRef.current) {
@@ -174,15 +188,11 @@ export function FileSwitcher(props: { workspace: ActiveWorkspace; workspaceFile:
   const [menuHeights, setMenuHeights] = useState<{ [key: string]: number }>({});
   const [activeMenu, setActiveMenu] = useState(ROOT_MENU_ID);
 
-  useEffect(() => {
-    setMenuHeights({});
-  }, [props.workspace, filesDropdownMode, activeMenu]);
+  const [filesMenuMode, setFilesMenuMode] = useState(FilesMenuMode.LIST);
 
   useEffect(() => {
-    setFilesDropdownMode((prev) =>
-      prev === FilesDropdownMode.LIST_MODELS_AND_OTHERS ? FilesDropdownMode.LIST_MODELS : prev
-    );
-  }, [activeMenu]);
+    setMenuHeights({});
+  }, [props.workspace, filesMenuMode, activeMenu]);
 
   useEffect(() => {
     if (isFilesDropdownOpen) {
@@ -194,21 +204,25 @@ export function FileSwitcher(props: { workspace: ActiveWorkspace; workspaceFile:
     setActiveMenu(`dd${props.workspace.descriptor.workspaceId}`);
   }, [isFilesDropdownOpen, props.workspace.descriptor.workspaceId]);
 
-  const drillIn = useCallback((fromMenuId, toMenuId, pathId) => {
+  const drillIn = useCallback((_event, fromMenuId, toMenuId, pathId) => {
     setMenuDrilledIn((prev) => [...prev, fromMenuId]);
     setDrilldownPath((prev) => [...prev, pathId]);
     setActiveMenu(toMenuId);
   }, []);
 
-  const drillOut = useCallback((toMenuId) => {
+  const drillOut = useCallback((_event, toMenuId) => {
     setMenuDrilledIn((prev) => prev.slice(0, prev.length - 1));
     setDrilldownPath((prev) => prev.slice(0, prev.length - 1));
     setActiveMenu(toMenuId);
   }, []);
 
   const setHeight = useCallback((menuId: string, height: number) => {
-    // do not try to simplify this ternary's condition as some heights are 0, resulting in an infinite loop.
-    setMenuHeights((prev) => (prev[menuId] === height ? prev : { ...prev, [menuId]: height }));
+    setMenuHeights((prev) => {
+      if (prev[menuId] === undefined || (menuId !== ROOT_MENU_ID && prev[menuId] !== height)) {
+        return { ...prev, [menuId]: height };
+      }
+      return prev;
+    });
   }, []);
 
   const workspacesMenuItems = useMemo(() => {
@@ -221,11 +235,11 @@ export function FileSwitcher(props: { workspace: ActiveWorkspace; workspaceFile:
         activeMenu={activeMenu}
         currentWorkspace={props.workspace}
         onSelectFile={() => setFilesDropdownOpen(false)}
-        filesDropdownMode={filesDropdownMode}
-        setFilesDropdownMode={setFilesDropdownMode}
+        filesMenuMode={filesMenuMode}
+        setFilesMenuMode={setFilesMenuMode}
       />
     );
-  }, [activeMenu, filesDropdownMode, props.workspace]);
+  }, [activeMenu, filesMenuMode, props.workspace]);
 
   return (
     <>
@@ -336,11 +350,6 @@ export function FileSwitcher(props: { workspace: ActiveWorkspace; workspaceFile:
               style={{
                 boxShadow: "none",
                 minWidth: `${MIN_FILE_SWITCHER_PANEL_WIDTH_IN_PX}px`,
-                width: `${
-                  filesDropdownMode === FilesDropdownMode.LIST_MODELS_AND_OTHERS
-                    ? MIN_FILE_SWITCHER_PANEL_WIDTH_IN_PX * 2
-                    : MIN_FILE_SWITCHER_PANEL_WIDTH_IN_PX
-                }px`,
               }}
               id={ROOT_MENU_ID}
               containsDrilldown={true}
@@ -350,37 +359,45 @@ export function FileSwitcher(props: { workspace: ActiveWorkspace; workspaceFile:
               onDrillIn={drillIn}
               onDrillOut={drillOut}
               onGetMenuHeight={setHeight}
+              className={"kie-sandbox--files-menu"}
             >
               <MenuContent
                 // MAGIC NUMBER ALERT
                 //
                 // 204px is the exact number that allows the menu to grow to
                 // the maximum size of the screen without adding scroll to the page.
-                maxMenuHeight={`calc(100vh - 204px)`}
+                maxMenuHeight={MENU_HEIGHT_MAX_LIMIT_CSS}
                 menuHeight={activeMenu === ROOT_MENU_ID ? undefined : `${menuHeights[activeMenu]}px`}
-                style={{ overflow: "hidden" }}
               >
-                <MenuList>
+                <MenuList style={{ padding: 0 }}>
                   <MenuItem
                     itemId={props.workspace.descriptor.workspaceId}
                     direction={"down"}
                     drilldownMenu={
                       <DrilldownMenu id={`dd${props.workspace.descriptor.workspaceId}`}>
                         <FilesMenuItems
-                          shouldFocusOnSearch={activeMenu === `dd${props.workspace.descriptor.workspaceId}`}
-                          filesDropdownMode={filesDropdownMode}
-                          setFilesDropdownMode={setFilesDropdownMode}
-                          workspaceDescriptor={props.workspace.descriptor}
-                          workspaceFiles={props.workspace.files}
+                          shouldFocusOnSearch={activeMenu.startsWith(`dd${props.workspace.descriptor.workspaceId}`)}
+                          filesMenuMode={filesMenuMode}
+                          setFilesMenuMode={setFilesMenuMode}
+                          workspace={props.workspace}
                           currentWorkspaceFile={props.workspaceFile}
                           onSelectFile={() => setFilesDropdownOpen(false)}
+                          currentWorkspaceGitStatusProps={props.gitStatusProps}
+                          onDeletedWorkspaceFile={props.onDeletedWorkspaceFile}
                         />
                       </DrilldownMenu>
                     }
                   >
                     Current
                   </MenuItem>
-                  {workspacesMenuItems}
+                  <MenuGroup
+                    style={{
+                      maxHeight: `calc(${MENU_HEIGHT_MAX_LIMIT_CSS} - ${DRILLDOWN_NAVIGATION_MENU_ITEM_HEIGHT_IN_PX}px)` /* height of menu minus the height of Current item*/,
+                      overflowY: "auto",
+                    }}
+                  >
+                    {workspacesMenuItems}
+                  </MenuGroup>
                 </MenuList>
               </MenuContent>
             </Menu>
@@ -395,8 +412,8 @@ export function WorkspacesMenuItems(props: {
   activeMenu: string;
   currentWorkspace: ActiveWorkspace;
   onSelectFile: () => void;
-  filesDropdownMode: FilesDropdownMode;
-  setFilesDropdownMode: React.Dispatch<React.SetStateAction<FilesDropdownMode>>;
+  filesMenuMode: FilesMenuMode;
+  setFilesMenuMode: React.Dispatch<React.SetStateAction<FilesMenuMode>>;
 }) {
   const editorEnvelopeLocator = useEditorEnvelopeLocator();
   const workspaceDescriptorsPromise = useWorkspaceDescriptorsPromise();
@@ -443,13 +460,13 @@ export function WorkspacesMenuItems(props: {
                       itemId={descriptor.workspaceId}
                       direction={"down"}
                       drilldownMenu={
-                        <DrilldownMenu id={`dd${descriptor.workspaceId}`}>
+                        <DrilldownMenu id={`dd${descriptor.workspaceId}`} style={{ position: "fixed" }}>
+                          {/* position:fixed important to render properly inside menugroup*/}
                           <FilesMenuItems
-                            shouldFocusOnSearch={props.activeMenu === `dd${descriptor.workspaceId}`}
-                            filesDropdownMode={props.filesDropdownMode}
-                            setFilesDropdownMode={props.setFilesDropdownMode}
-                            workspaceDescriptor={descriptor}
-                            workspaceFiles={workspaceFiles.get(descriptor.workspaceId) ?? []}
+                            shouldFocusOnSearch={props.activeMenu.startsWith(`dd${descriptor.workspaceId}`)}
+                            filesMenuMode={props.filesMenuMode}
+                            setFilesMenuMode={props.setFilesMenuMode}
+                            workspace={{ descriptor, files: workspaceFiles.get(descriptor.workspaceId) ?? [] }}
                             onSelectFile={props.onSelectFile}
                           />
                         </DrilldownMenu>
@@ -503,7 +520,19 @@ export function FileSvg(props: { workspaceFile: WorkspaceFile }) {
   return (
     <>
       <PromiseStateWrapper
-        pending={<Skeleton height={"180px"} style={{ margin: "10px" }} />}
+        pending={
+          imgRef.current ? (
+            <Bullseye>
+              <img
+                style={{ height: "180px", margin: "10px" }}
+                ref={imgRef}
+                alt={`SVG for ${props.workspaceFile.relativePath}`}
+              />
+            </Bullseye>
+          ) : (
+            <Skeleton height={"180px"} style={{ margin: "10px" }} />
+          )
+        }
         rejected={() => (
           <div style={{ height: "180px", margin: "10px", borderRadius: "5px", backgroundColor: "#EEE" }}>
             <Bullseye>
@@ -526,78 +555,37 @@ export function FileSvg(props: { workspaceFile: WorkspaceFile }) {
   );
 }
 
-export function SearchableFilesMenuGroup(props: {
-  shouldFocusOnSearch: boolean;
-  filesDropdownMode: FilesDropdownMode;
-  label: string;
+export function FilteredFilesMenuGroup(props: {
+  filesMenuMode: FilesMenuMode;
   allFiles: WorkspaceFile[];
+  filteredFiles: WorkspaceFile[];
   search: string;
-  setSearch: React.Dispatch<React.SetStateAction<string>>;
   children: (args: { filteredFiles: WorkspaceFile[] }) => React.ReactNode;
+  heightMaxLimitCss: string;
+  style?: React.CSSProperties;
 }) {
-  const searchInputRef = useRef<HTMLInputElement>(null);
-
-  useEffect(() => {
-    if (props.shouldFocusOnSearch) {
-      const task = setTimeout(() => {
-        searchInputRef.current?.focus();
-      }, 500);
-      return () => {
-        clearTimeout(task);
-      };
-    }
-  }, [props.shouldFocusOnSearch, props.filesDropdownMode]);
-
-  const filteredFiles = useMemo(
-    () => props.allFiles.filter((file) => file.name.toLowerCase().includes(props.search.toLowerCase())),
-    [props.allFiles, props.search]
-  );
-
   const height = useMemo(() => {
-    if (
-      props.filesDropdownMode === FilesDropdownMode.LIST_MODELS ||
-      props.filesDropdownMode === FilesDropdownMode.LIST_MODELS_AND_OTHERS
-    ) {
+    if (props.filesMenuMode === FilesMenuMode.LIST) {
       // No reason to know the exact size.
       const sizeOfFirst50Elements = props.allFiles
         .slice(0, 50)
         .map((f) => getFileDataListHeight(f))
         .reduce((a, b) => a + b, 0);
-
-      // MAGIC NUMBER ALERT
-      //
-      // 440px is the exact number that allows the menu to grow to the end of the screen without adding scroll  to the
-      // entire page, It includes the first menu item, the search bar and the "View other files" button at the bottom.
-      return `max(300px, min(calc(100vh - 440px), ${sizeOfFirst50Elements}px))`;
-    } else if (props.filesDropdownMode === FilesDropdownMode.CAROUSEL) {
-      // MAGIC NUMBER ALERT
-      //
-      // 384px is the exact number that allows the menu to grow to the end of the screen without
-      // adding a scroll to the entire page. It includes the first menu item and the search bar.
-      //
+      return `max(300px, min(${props.heightMaxLimitCss}, ${sizeOfFirst50Elements}px))`;
+    } else if (props.filesMenuMode === FilesMenuMode.CAROUSEL) {
       // 280px is the size of a File SVG card.
-      return `min(calc(100vh - 384px), calc(${props.allFiles.length} * 280px))`;
+      return `min(${props.heightMaxLimitCss}, calc(${props.allFiles.length} * 280px))`;
     } else {
       return "";
     }
-  }, [props.allFiles, props.filesDropdownMode]);
+  }, [props.allFiles, props.filesMenuMode, props.heightMaxLimitCss]);
 
   return (
-    <MenuGroup label={props.label}>
+    <MenuGroup>
       {/* Allows for arrows to work when editing the text. */}
-      <MenuInput onKeyDown={(e) => e.stopPropagation()}>
-        <TextInput
-          ref={searchInputRef}
-          value={props.search}
-          aria-label={"Other files menu items"}
-          iconVariant={"search"}
-          type={"search"}
-          onChange={(value) => props.setSearch(value)}
-        />
-      </MenuInput>
-      <div style={{ overflowY: "auto", height }}>
-        {filteredFiles.length > 0 && props.children({ filteredFiles })}
-        {filteredFiles.length <= 0 && (
+      <div style={{ ...props.style, height }}>
+        {props.filteredFiles.length > 0 && props.children({ filteredFiles: props.filteredFiles })}
+        {props.filteredFiles.length <= 0 && (
           <Bullseye>
             <EmptyState>
               <EmptyStateIcon icon={CubesIcon} />
@@ -613,72 +601,354 @@ export function SearchableFilesMenuGroup(props: {
 }
 
 export function FilesMenuItems(props: {
-  workspaceDescriptor: WorkspaceDescriptor;
-  workspaceFiles: WorkspaceFile[];
+  workspace: ActiveWorkspace;
+  currentWorkspaceGitStatusProps?: GitStatusProps;
   currentWorkspaceFile?: WorkspaceFile;
+  onDeletedWorkspaceFile?: () => void;
   onSelectFile: () => void;
-  filesDropdownMode: FilesDropdownMode;
-  setFilesDropdownMode: React.Dispatch<React.SetStateAction<FilesDropdownMode>>;
+  filesMenuMode: FilesMenuMode;
+  setFilesMenuMode: React.Dispatch<React.SetStateAction<FilesMenuMode>>;
   shouldFocusOnSearch: boolean;
 }) {
-  const history = useHistory();
-  const routes = useRoutes();
   const editorEnvelopeLocator = useEditorEnvelopeLocator();
 
-  const sortedAndFilteredFiles = useMemo(
-    () =>
-      props.workspaceFiles
-        .sort((a, b) => a.relativePath.localeCompare(b.relativePath))
-        .filter((file) => file.relativePath !== props.currentWorkspaceFile?.relativePath),
-    [props.workspaceFiles, props.currentWorkspaceFile]
+  const [topSectionHeightInPx, setTopSectionHeightInPx] = useState<number>(
+    DRILLDOWN_NAVIGATION_MENU_ITEM_HEIGHT_IN_PX +
+      MENU_SEARCH_HEIGHT_IN_PX +
+      MENU_SHOW_CHANGED_CHECKBOX_HEIGHT_IN_PX +
+      MENU_DIVIDER_HEIGHT_IN_PX
   );
+  const [bottomSectionHeightInPx, setBottomSectionHeightInPx] = useState<number>(
+    DRILLDOWN_NAVIGATION_MENU_ITEM_HEIGHT_IN_PX + MENU_DIVIDER_HEIGHT_IN_PX
+  );
+
+  const [isModelsMenuActive, setModelsMenuActive] = useState(true);
+  const [searchValue, setSearchValue] = useState("");
+  const [filteredGitSyncStatus, setFilteredGitSyncStatus] = useState<WorkspaceGitLocalChangesStatus>();
+
+  const searchInputRef = useRef<HTMLInputElement>(null);
+  const carouselScrollRef = useRef<HTMLDivElement>(null);
+  const listScrollRef = useRef<VariableSizeList>(null);
+
+  const deletedWorkspaceFiles = useMemo(() => {
+    if (!props.currentWorkspaceGitStatusProps) {
+      return [];
+    }
+    return listDeletedFiles(props.currentWorkspaceGitStatusProps);
+  }, [props.currentWorkspaceGitStatusProps]);
+
+  const allFiles = useMemo(() => {
+    return [...props.workspace.files, ...deletedWorkspaceFiles];
+  }, [deletedWorkspaceFiles, props.workspace.files]);
+
+  const sortedFiles = useMemo(() => allFiles.sort((a, b) => a.relativePath.localeCompare(b.relativePath)), [allFiles]);
 
   const models = useMemo(
-    () => sortedAndFilteredFiles.filter((file) => editorEnvelopeLocator.hasMappingFor(file.relativePath)),
-    [editorEnvelopeLocator, sortedAndFilteredFiles]
+    () => sortedFiles.filter((file) => editorEnvelopeLocator.hasMappingFor(file.relativePath)),
+    [editorEnvelopeLocator, sortedFiles]
   );
 
   const otherFiles = useMemo(
-    () => sortedAndFilteredFiles.filter((file) => !editorEnvelopeLocator.hasMappingFor(file.relativePath)),
-    [editorEnvelopeLocator, sortedAndFilteredFiles]
+    () => sortedFiles.filter((file) => !editorEnvelopeLocator.hasMappingFor(file.relativePath)),
+    [editorEnvelopeLocator, sortedFiles]
   );
 
-  const [search, setSearch] = useState("");
-  const [otherFilesSearch, setOtherFilesSearch] = useState("");
+  const filteredModels = useMemo(
+    () =>
+      models
+        .filter((file) => file.name.toLowerCase().includes(searchValue.toLowerCase()))
+        .filter(
+          (file) =>
+            !filteredGitSyncStatus ||
+            resolveGitLocalChangesStatus({
+              workspaceGitStatus: props.currentWorkspaceGitStatusProps?.workspaceGitStatusPromise.data,
+              file,
+            }) === filteredGitSyncStatus
+        ),
+    [filteredGitSyncStatus, models, props.currentWorkspaceGitStatusProps?.workspaceGitStatusPromise.data, searchValue]
+  );
+
+  const filteredOtherFiles = useMemo(
+    () => otherFiles.filter((file) => file.name.toLowerCase().includes(searchValue.toLowerCase())),
+    [otherFiles, searchValue]
+  );
+
+  const computedInitialScrollOffset = useMemo(() => {
+    if (props.filesMenuMode !== FilesMenuMode.LIST || !isModelsMenuActive || !props.currentWorkspaceFile) {
+      return;
+    }
+    const index = filteredModels.findIndex((it) => it.relativePath === props.currentWorkspaceFile?.relativePath);
+    if (index < 0) {
+      return 0;
+    }
+    return filteredModels.slice(0, index).reduce((sum, current) => sum + getFileDataListHeight(current), 0);
+  }, [filteredModels, isModelsMenuActive, props.currentWorkspaceFile, props.filesMenuMode]);
+
+  const searchInput = useCallback(
+    (searchRef?: React.RefObject<HTMLInputElement>) => {
+      return (
+        <MenuInput onKeyDown={(e) => e.stopPropagation()}>
+          <SearchInput
+            ref={searchRef}
+            value={searchValue}
+            type={"search"}
+            onChange={(_ev, value) => {
+              setSearchValue(value);
+            }}
+            placeholder={`In '${props.workspace.descriptor.name}'`}
+            style={{ fontSize: "small" }}
+            onClick={(e) => {
+              e.stopPropagation();
+            }}
+          />
+        </MenuInput>
+      );
+    },
+    [props.workspace.descriptor.name, searchValue]
+  );
+
+  const fileListMenuItemsHeightMaxLimitCss = useMemo(() => {
+    return `calc(${MENU_HEIGHT_MAX_LIMIT_CSS} - ${
+      topSectionHeightInPx + (otherFiles.length ? bottomSectionHeightInPx : 0)
+    }px)`;
+  }, [bottomSectionHeightInPx, otherFiles.length, topSectionHeightInPx]);
+
+  const isCurrentWorkspaceFile = useCallback(
+    (file: WorkspaceFile) => {
+      return (
+        props.workspace.descriptor.workspaceId === file.workspaceId &&
+        props.currentWorkspaceFile?.relativePath === file.relativePath
+      );
+    },
+    [props.currentWorkspaceFile?.relativePath, props.workspace.descriptor.workspaceId]
+  );
+
+  const getFileListItemDisplayMode = useCallback(
+    (file: WorkspaceFile) =>
+      deletedWorkspaceFiles.some((it) => it.relativePath === file.relativePath)
+        ? FileListItemDisplayMode.deleted
+        : FileListItemDisplayMode.enabled,
+    [deletedWorkspaceFiles]
+  );
+
+  useEffect(() => {
+    const task = setTimeout(() => {
+      if (props.filesMenuMode === FilesMenuMode.CAROUSEL && isModelsMenuActive) {
+        carouselScrollRef.current?.scrollIntoView({ block: "nearest", behavior: "smooth" });
+      }
+      if (props.filesMenuMode === FilesMenuMode.LIST && isModelsMenuActive) {
+        listScrollRef.current?.scrollToItem(
+          filteredModels.findIndex((it) => it.relativePath === props.currentWorkspaceFile?.relativePath)
+        );
+      }
+      if (props.shouldFocusOnSearch) {
+        searchInputRef.current?.focus({ preventScroll: true });
+      }
+    }, 500);
+    return () => {
+      clearTimeout(task);
+    };
+  }, [
+    props.filesMenuMode,
+    isModelsMenuActive,
+    filteredGitSyncStatus,
+    props.currentWorkspaceFile?.relativePath,
+    filteredModels,
+    props.shouldFocusOnSearch,
+  ]);
 
   return (
     <>
-      <Split>
-        <SplitItem isFilled={true}>
-          <MenuItem direction="up" itemId={props.workspaceDescriptor.workspaceId}>
-            All
-          </MenuItem>
-        </SplitItem>
-        <SplitItem>
-          <FilesDropdownModeIcons
-            filesDropdownMode={props.filesDropdownMode}
-            setFilesDropdownMode={props.setFilesDropdownMode}
-          />
-          &nbsp; &nbsp;
-        </SplitItem>
-      </Split>
+      <MenuItem direction={"up"} itemId={`${props.workspace.descriptor.workspaceId}-breadcrumb`}>
+        All
+      </MenuItem>
+      {searchInput(isModelsMenuActive ? searchInputRef : undefined)}
+      <Flex
+        justifyContent={{ default: "justifyContentFlexEnd" }}
+        alignItems={{ default: "alignItemsCenter" }}
+        style={{ paddingRight: "16px" }}
+      >
+        <FlexItem>
+          {props.currentWorkspaceGitStatusProps !== undefined && (
+            <Tooltip content={"Select to display only modified, added, or deleted files"} position={"bottom"}>
+              <Checkbox
+                label={"Only modified"}
+                id={"filter-git-status-modified-locally"}
+                aria-label={"Select to display only modified, added, or deleted files"}
+                isChecked={filteredGitSyncStatus === WorkspaceGitLocalChangesStatus.pending}
+                onChange={(checked) => {
+                  setFilteredGitSyncStatus(checked ? WorkspaceGitLocalChangesStatus.pending : undefined);
+                }}
+              />
+            </Tooltip>
+          )}
+        </FlexItem>
+        <FlexItem>
+          <Flex justifyContent={{ default: "justifyContentCenter" }}>
+            <FilesMenuModeIcons filesMenuMode={props.filesMenuMode} setFilesMenuMode={props.setFilesMenuMode} />
+          </Flex>
+        </FlexItem>
+      </Flex>
       <Divider component={"li"} />
 
-      <Split>
-        {(props.filesDropdownMode === FilesDropdownMode.LIST_MODELS ||
-          props.filesDropdownMode === FilesDropdownMode.LIST_MODELS_AND_OTHERS) && (
-          <SplitItem isFilled={true} style={{ minWidth: `${MIN_FILE_SWITCHER_PANEL_WIDTH_IN_PX}px` }}>
-            <>
-              <SearchableFilesMenuGroup
-                search={search}
-                setSearch={setSearch}
-                filesDropdownMode={props.filesDropdownMode}
-                shouldFocusOnSearch={props.shouldFocusOnSearch}
-                label={`Models in '${props.workspaceDescriptor.name}'`}
-                allFiles={models}
+      {props.filesMenuMode === FilesMenuMode.LIST && (
+        <FilteredFilesMenuGroup
+          search={searchValue}
+          filesMenuMode={props.filesMenuMode}
+          allFiles={models}
+          filteredFiles={filteredModels}
+          heightMaxLimitCss={fileListMenuItemsHeightMaxLimitCss}
+        >
+          {({ filteredFiles }) => {
+            return (
+              <AutoSizer>
+                {({ height, width }) => (
+                  <VariableSizeList
+                    height={height}
+                    itemCount={filteredFiles.length}
+                    itemSize={(index) => getFileDataListHeight(filteredFiles[index])}
+                    width={width}
+                    initialScrollOffset={computedInitialScrollOffset}
+                    ref={listScrollRef}
+                  >
+                    {({ index, style }) => {
+                      const fileListItemDisplayMode = getFileListItemDisplayMode(filteredFiles[index]);
+                      return (
+                        <MenuItem
+                          key={filteredFiles[index].relativePath}
+                          onClick={
+                            fileListItemDisplayMode === FileListItemDisplayMode.enabled ? props.onSelectFile : undefined
+                          }
+                          className={"kie-tools--file-switcher-no-padding-menu-item"}
+                          isFocused={isCurrentWorkspaceFile(filteredFiles[index])}
+                          isActive={isCurrentWorkspaceFile(filteredFiles[index])}
+                          style={style}
+                          component={"div"}
+                        >
+                          <FileDataList
+                            file={filteredFiles[index]}
+                            displayMode={fileListItemDisplayMode}
+                            gitStatusProps={props.currentWorkspaceGitStatusProps}
+                            isCurrentWorkspaceFile={isCurrentWorkspaceFile(filteredFiles[index])}
+                            onDeletedWorkspaceFile={props.onDeletedWorkspaceFile}
+                          />
+                        </MenuItem>
+                      );
+                    }}
+                  </VariableSizeList>
+                )}
+              </AutoSizer>
+            );
+          }}
+        </FilteredFilesMenuGroup>
+      )}
+
+      {props.filesMenuMode === FilesMenuMode.CAROUSEL && (
+        <FilteredFilesMenuGroup
+          search={searchValue}
+          filesMenuMode={props.filesMenuMode}
+          allFiles={models}
+          filteredFiles={filteredModels}
+          heightMaxLimitCss={fileListMenuItemsHeightMaxLimitCss}
+          style={{ overflowY: "auto" }}
+        >
+          {({ filteredFiles }) => {
+            const isCurrentFileOutsideOfShownList =
+              props.currentWorkspaceFile &&
+              filteredFiles.findIndex((file) => file.relativePath === props.currentWorkspaceFile?.relativePath) >=
+                MAX_NUMBER_OF_CAROUSEL_ITEMS_SHOWN;
+            const shouldScrollToTop =
+              props.currentWorkspaceFile &&
+              filteredFiles.findIndex((file) => file.relativePath === props.currentWorkspaceFile?.relativePath) < 0;
+            return (
+              <Gallery
+                hasGutter={true}
+                style={{
+                  paddingLeft: "8px",
+                  paddingRight: "8px",
+                  borderTop: "var(--pf-global--BorderWidth--sm) solid var(--pf-global--BorderColor--100)",
+                }}
               >
-                {({ filteredFiles }) => (
+                {shouldScrollToTop && <div ref={carouselScrollRef} />}
+                {filteredFiles.slice(0, MAX_NUMBER_OF_CAROUSEL_ITEMS_SHOWN).map((file, index) => (
+                  <FilesMenuItemCarouselCard
+                    key={index}
+                    file={file}
+                    gitStatusProps={props.currentWorkspaceGitStatusProps}
+                    isCurrentWorkspaceFile={isCurrentWorkspaceFile(file)}
+                    displayMode={getFileListItemDisplayMode(file)}
+                    onSelectFile={props.onSelectFile}
+                    onDeletedWorkspaceFile={props.onDeletedWorkspaceFile}
+                    scrollRef={carouselScrollRef}
+                  />
+                ))}
+                {filteredFiles.length > MAX_NUMBER_OF_CAROUSEL_ITEMS_SHOWN && (
                   <>
+                    {props.currentWorkspaceFile && isCurrentFileOutsideOfShownList && (
+                      <FilesMenuItemCarouselCard
+                        file={props.currentWorkspaceFile}
+                        gitStatusProps={props.currentWorkspaceGitStatusProps}
+                        isCurrentWorkspaceFile={isCurrentWorkspaceFile(props.currentWorkspaceFile)}
+                        displayMode={getFileListItemDisplayMode(props.currentWorkspaceFile)}
+                        onSelectFile={props.onSelectFile}
+                        onDeletedWorkspaceFile={props.onDeletedWorkspaceFile}
+                        scrollRef={carouselScrollRef}
+                      />
+                    )}
+                    <Card style={{ border: 0 }}>
+                      <CardBody>
+                        <Bullseye>
+                          <div>
+                            ...and{" "}
+                            {filteredFiles.length -
+                              MAX_NUMBER_OF_CAROUSEL_ITEMS_SHOWN -
+                              (isCurrentFileOutsideOfShownList ? 1 : 0)}{" "}
+                            more.
+                          </div>
+                        </Bullseye>
+                      </CardBody>
+                    </Card>
+                  </>
+                )}
+              </Gallery>
+            );
+          }}
+        </FilteredFilesMenuGroup>
+      )}
+      {otherFiles.length > 0 && (
+        <>
+          <Divider component={"li"} />
+          <MenuItem
+            itemId={`${props.workspace.descriptor.workspaceId}-other`}
+            direction={"down"}
+            onClick={(_event) => {
+              setModelsMenuActive(false);
+              setBottomSectionHeightInPx(0);
+              setTopSectionHeightInPx((prev) => prev - MENU_SHOW_CHANGED_CHECKBOX_HEIGHT_IN_PX);
+            }}
+            drilldownMenu={
+              <DrilldownMenu id={`dd${props.workspace.descriptor.workspaceId}-other`} style={{ position: "fixed" }}>
+                <MenuItem
+                  itemId={"back-up"}
+                  direction={"up"}
+                  onClick={(_event) => {
+                    setModelsMenuActive(true);
+                    setBottomSectionHeightInPx(MENU_DIVIDER_HEIGHT_IN_PX + DRILLDOWN_NAVIGATION_MENU_ITEM_HEIGHT_IN_PX);
+                    setTopSectionHeightInPx((prev) => prev + MENU_SHOW_CHANGED_CHECKBOX_HEIGHT_IN_PX);
+                  }}
+                >
+                  Back
+                </MenuItem>
+                {searchInput(isModelsMenuActive ? undefined : searchInputRef)}
+                <Divider component={"li"} />
+                <FilteredFilesMenuGroup
+                  search={searchValue}
+                  filesMenuMode={FilesMenuMode.LIST} // always LIST for otherFiles, even for mode CAROUSEL
+                  allFiles={otherFiles}
+                  filteredFiles={filteredOtherFiles}
+                  heightMaxLimitCss={fileListMenuItemsHeightMaxLimitCss}
+                >
+                  {({ filteredFiles }) => (
                     <AutoSizer>
                       {({ height, width }) => (
                         <VariableSizeList
@@ -690,190 +960,112 @@ export function FilesMenuItems(props: {
                           {({ index, style }) => (
                             <MenuItem
                               key={filteredFiles[index].relativePath}
-                              onClick={props.onSelectFile}
                               style={style}
+                              component={"div"}
                               className={"kie-tools--file-switcher-no-padding-menu-item"}
                             >
-                              <FileDataList file={filteredFiles[index]} isEditable={true} />
+                              <FileDataList
+                                file={filteredFiles[index]}
+                                displayMode={FileListItemDisplayMode.readonly}
+                                gitStatusProps={props.currentWorkspaceGitStatusProps}
+                                onDeletedWorkspaceFile={props.onDeletedWorkspaceFile}
+                              />
                             </MenuItem>
                           )}
                         </VariableSizeList>
                       )}
                     </AutoSizer>
-                  </>
-                )}
-              </SearchableFilesMenuGroup>
-              {otherFiles.length > 0 && (
-                <>
-                  <Divider component={"li"} />
-                  <MenuGroup>
-                    <MenuList>
-                      <MenuItem
-                        onClick={(e) => {
-                          e.stopPropagation();
-                          props.setFilesDropdownMode((prev) =>
-                            prev === FilesDropdownMode.LIST_MODELS
-                              ? FilesDropdownMode.LIST_MODELS_AND_OTHERS
-                              : FilesDropdownMode.LIST_MODELS
-                          );
-                        }}
-                      >
-                        {props.filesDropdownMode === FilesDropdownMode.LIST_MODELS
-                          ? "View other files"
-                          : "Hide other files"}
-                        &nbsp;&nbsp;
-                        {props.filesDropdownMode === FilesDropdownMode.LIST_MODELS ? (
-                          <ArrowRightIcon />
-                        ) : (
-                          <ArrowLeftIcon />
-                        )}
-                      </MenuItem>
-                    </MenuList>
-                  </MenuGroup>
-                </>
-              )}
-            </>
-          </SplitItem>
-        )}
-
-        {props.filesDropdownMode === FilesDropdownMode.LIST_MODELS_AND_OTHERS && (
-          <SplitItem isFilled={true} style={{ minWidth: `${MIN_FILE_SWITCHER_PANEL_WIDTH_IN_PX}px` }}>
-            <SearchableFilesMenuGroup
-              search={otherFilesSearch}
-              setSearch={setOtherFilesSearch}
-              filesDropdownMode={props.filesDropdownMode}
-              shouldFocusOnSearch={props.shouldFocusOnSearch}
-              label={`Other files in '${props.workspaceDescriptor.name}'`}
-              allFiles={otherFiles}
-            >
-              {({ filteredFiles }) => (
-                <>
-                  <AutoSizer>
-                    {({ height, width }) => (
-                      <VariableSizeList
-                        height={height}
-                        itemCount={filteredFiles.length}
-                        itemSize={(index) => getFileDataListHeight(filteredFiles[index])}
-                        width={width}
-                      >
-                        {({ index, style }) => (
-                          <MenuItem
-                            component={"span"}
-                            onClick={() => {}}
-                            style={style}
-                            className={"kie-tools--file-switcher-no-padding-menu-item"}
-                          >
-                            <FileDataList file={filteredFiles[index]} isEditable={false} />
-                          </MenuItem>
-                        )}
-                      </VariableSizeList>
-                    )}
-                  </AutoSizer>
-                </>
-              )}
-            </SearchableFilesMenuGroup>
-          </SplitItem>
-        )}
-
-        {props.filesDropdownMode === FilesDropdownMode.CAROUSEL && (
-          <SplitItem isFilled={true}>
-            <SearchableFilesMenuGroup
-              search={search}
-              setSearch={setSearch}
-              filesDropdownMode={props.filesDropdownMode}
-              shouldFocusOnSearch={props.shouldFocusOnSearch}
-              label={`Models in '${props.workspaceDescriptor.name}'`}
-              allFiles={models}
-            >
-              {({ filteredFiles }) => (
-                <Gallery
-                  hasGutter={true}
-                  style={{
-                    padding: "8px",
-                    borderTop: "var(--pf-global--BorderWidth--sm) solid var(--pf-global--BorderColor--100)",
-                  }}
-                >
-                  {filteredFiles.slice(0, MAX_NUMBER_OF_CAROUSEL_ITEMS_SHOWN).map((file) => (
-                    <Card
-                      key={file.relativePath}
-                      isSelectable={true}
-                      isRounded={true}
-                      isCompact={true}
-                      isHoverable={true}
-                      isFullHeight={true}
-                      onClick={() => {
-                        history.push({
-                          pathname: routes.workspaceWithFilePath.path({
-                            workspaceId: file.workspaceId,
-                            fileRelativePath: file.relativePathWithoutExtension,
-                            extension: file.extension,
-                          }),
-                        });
-
-                        props.onSelectFile();
-                      }}
-                    >
-                      <FileLink file={file}>
-                        {/* The default display:flex makes the text overflow */}
-                        <CardHeader style={{ display: "block" }}>
-                          <CardHeaderMain>
-                            <FileListItem file={file} isEditable={true} />
-                          </CardHeaderMain>
-                        </CardHeader>
-                      </FileLink>
-                      <Divider inset={{ default: "insetMd" }} />
-                      <CardBody style={{ padding: 0 }}>
-                        <FileSvg workspaceFile={file} />
-                      </CardBody>
-                    </Card>
-                  ))}
-                  {filteredFiles.length > MAX_NUMBER_OF_CAROUSEL_ITEMS_SHOWN && (
-                    <Card style={{ border: 0 }}>
-                      <CardBody>
-                        <Bullseye>
-                          <div>...and {filteredFiles.length - MAX_NUMBER_OF_CAROUSEL_ITEMS_SHOWN} more.</div>
-                        </Bullseye>
-                      </CardBody>
-                    </Card>
                   )}
-                </Gallery>
-              )}
-            </SearchableFilesMenuGroup>
-          </SplitItem>
-        )}
-      </Split>
+                </FilteredFilesMenuGroup>
+              </DrilldownMenu>
+            }
+          >
+            Other files
+          </MenuItem>
+        </>
+      )}
     </>
   );
 }
 
-export function FilesDropdownModeIcons(props: {
-  filesDropdownMode: FilesDropdownMode;
-  setFilesDropdownMode: React.Dispatch<React.SetStateAction<FilesDropdownMode>>;
+const FilesMenuItemCarouselCard = (props: {
+  file: WorkspaceFile;
+  gitStatusProps?: GitStatusProps;
+  isCurrentWorkspaceFile?: boolean;
+  onDeletedWorkspaceFile?: () => void;
+  displayMode: FileListItemDisplayMode;
+  onSelectFile: () => void;
+  scrollRef: React.RefObject<HTMLDivElement>;
+}) => {
+  const cardInternals = [
+    <CardHeader style={{ display: "block" }} key={0}>
+      <CardHeaderMain>
+        <FileListItem
+          file={props.file}
+          displayMode={props.displayMode}
+          gitStatusProps={props.gitStatusProps}
+          isCurrentWorkspaceFile={props.isCurrentWorkspaceFile}
+          onDeletedWorkspaceFile={props.onDeletedWorkspaceFile}
+        />
+      </CardHeaderMain>
+    </CardHeader>,
+    <Divider inset={{ default: "insetMd" }} key={1} />,
+    <CardBody style={{ padding: 0 }} key={2}>
+      <FileSvg workspaceFile={props.file} />
+    </CardBody>,
+  ];
+  return (
+    <Card
+      key={props.file.relativePath}
+      isSelectable={props.displayMode === FileListItemDisplayMode.enabled}
+      isRounded={true}
+      isCompact={true}
+      isFullHeight={true}
+      onClick={props.displayMode === FileListItemDisplayMode.enabled ? props.onSelectFile : undefined}
+      className={switchExpression(props.displayMode, {
+        enabled: "kie-tools--file-list-item-enabled",
+        deleted: "kie-tools--file-list-item-deleted",
+        readonly: "kie-tools--file-list-item-readonly",
+      })}
+    >
+      <div id={`scrollRef-${props.file.relativePath}`} ref={props.isCurrentWorkspaceFile ? props.scrollRef : undefined}>
+        {props.displayMode === FileListItemDisplayMode.enabled ? (
+          <FileLink file={props.file}>{cardInternals}</FileLink>
+        ) : (
+          cardInternals
+        )}
+      </div>
+    </Card>
+  );
+};
+
+export function FilesMenuModeIcons(props: {
+  filesMenuMode: FilesMenuMode;
+  setFilesMenuMode: React.Dispatch<React.SetStateAction<FilesMenuMode>>;
 }) {
   return (
     <>
-      {props.filesDropdownMode === FilesDropdownMode.CAROUSEL && (
+      {props.filesMenuMode === FilesMenuMode.CAROUSEL && (
         <Button
           className={"kie-tools--masthead-hoverable"}
           variant="plain"
           aria-label="Switch to list view"
           onClick={(e) => {
             e.stopPropagation();
-            props.setFilesDropdownMode(FilesDropdownMode.LIST_MODELS);
+            props.setFilesMenuMode(FilesMenuMode.LIST);
           }}
         >
           <ListIcon />
         </Button>
       )}
-      {(props.filesDropdownMode === FilesDropdownMode.LIST_MODELS ||
-        props.filesDropdownMode === FilesDropdownMode.LIST_MODELS_AND_OTHERS) && (
+      {props.filesMenuMode === FilesMenuMode.LIST && (
         <Button
           className={"kie-tools--masthead-hoverable"}
           variant="plain"
           aria-label="Switch to carousel view"
           onClick={(e) => {
             e.stopPropagation();
-            props.setFilesDropdownMode(FilesDropdownMode.CAROUSEL);
+            props.setFilesMenuMode(FilesMenuMode.CAROUSEL);
           }}
         >
           <ThLargeIcon />
diff --git a/packages/online-editor/src/editor/CreateGistOrSnippetModal.tsx b/packages/online-editor/src/editor/Toolbar/GitIntegration/CreateGistOrSnippetModal.tsx
similarity index 89%
rename from packages/online-editor/src/editor/CreateGistOrSnippetModal.tsx
rename to packages/online-editor/src/editor/Toolbar/GitIntegration/CreateGistOrSnippetModal.tsx
index 28100c07f4..04033b0907 100644
--- a/packages/online-editor/src/editor/CreateGistOrSnippetModal.tsx
+++ b/packages/online-editor/src/editor/Toolbar/GitIntegration/CreateGistOrSnippetModal.tsx
@@ -27,22 +27,23 @@ import { LockIcon } from "@patternfly/react-icons/dist/js/icons/lock-icon";
 import { ExclamationCircleIcon } from "@patternfly/react-icons/dist/js/icons/exclamation-circle-icon";
 import { Button } from "@patternfly/react-core/dist/js/components/Button";
 import { GIST_ORIGIN_REMOTE_NAME } from "@kie-tools-core/workspaces-git-fs/dist/constants/GitConstants";
-import { useSettingsDispatch } from "../settings/SettingsContext";
 import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
-import { useAuthSession } from "../authSessions/AuthSessionsContext";
-import { useBitbucketClient } from "../bitbucket/Hooks";
-import { GithubIcon, BitbucketIcon } from "@patternfly/react-icons";
-import { useGitHubClient } from "../github/Hooks";
+import { useAuthSession } from "../../../authSessions/AuthSessionsContext";
+import { useBitbucketClient } from "../../../bitbucket/Hooks";
+import { BitbucketIcon } from "@patternfly/react-icons/dist/js/icons/bitbucket-icon";
+import { GithubIcon } from "@patternfly/react-icons/dist/js/icons/github-icon";
+import { useGitHubClient } from "../../../github/Hooks";
 import {
   AuthProviderType,
   GistEnabledAuthProviderType,
   isGistEnabledAuthProviderType,
   isSupportedGitAuthProviderType,
-} from "../authProviders/AuthProvidersApi";
-import { useAuthProvider } from "../authProviders/AuthProvidersContext";
-import { switchExpression } from "../switchExpression/switchExpression";
-import { useOnlineI18n } from "../i18n";
+} from "../../../authProviders/AuthProvidersApi";
+import { useAuthProvider } from "../../../authProviders/AuthProvidersContext";
+import { switchExpression } from "../../../switchExpression/switchExpression";
+import { useOnlineI18n } from "../../../i18n";
 import { LoadOrganizationsSelect, SelectOptionObjectType } from "./LoadOrganizationsSelect";
+import { useGitIntegration } from "./GitIntegrationContextProvider";
 
 export interface CreateGistOrSnippetResponse {
   cloneUrl: string;
@@ -52,11 +53,10 @@ export const CreateGistOrSnippetModal = (props: {
   workspace: WorkspaceDescriptor;
   isOpen: boolean;
   onClose: () => void;
-  onSuccess: (args: { url: string }) => void;
-  onError: () => void;
+  onSuccess?: (args: { url: string }) => void;
+  onError?: () => void;
 }) => {
   const workspaces = useWorkspaces();
-  const settingsDispatch = useSettingsDispatch();
   const { authSession, gitConfig, authInfo } = useAuthSession(props.workspace.gitAuthSessionId);
   const authProvider = useAuthProvider(authSession);
   const bitbucketClient = useBitbucketClient(authSession);
@@ -68,6 +68,10 @@ export const CreateGistOrSnippetModal = (props: {
   const [selectedOrganization, setSelectedOrganization] = useState<SelectOptionObjectType>();
   const [isGistOrSnippetLoading, setGistOrSnippetLoading] = useState(false);
 
+  const {
+    alerts: { successfullyUpdatedGistOrSnippetAlert, errorAlert },
+  } = useGitIntegration();
+
   const createGitHubGist: () => Promise<CreateGistOrSnippetResponse> = useCallback(async () => {
     const gist = await gitHubClient.gists.create({
       description: props.workspace.name ?? "",
@@ -193,16 +197,28 @@ If you are, it means that creating this Snippet failed and it can safely be dele
       });
 
       props.onClose();
-      props.onSuccess({ url: gistOrSnippet.cloneUrl });
+      successfullyUpdatedGistOrSnippetAlert.show({ url: gistOrSnippet.cloneUrl });
+      props.onSuccess?.({ url: gistOrSnippet.cloneUrl });
       return;
     } catch (err) {
       setError(err);
-      props.onError();
+      errorAlert.show();
+      props.onError?.();
       throw err;
     } finally {
       setGistOrSnippetLoading(false);
     }
-  }, [authInfo, authProvider?.type, createGitHubGist, createBitbucketSnippet, workspaces, props, gitConfig]);
+  }, [
+    authInfo,
+    authProvider?.type,
+    createGitHubGist,
+    createBitbucketSnippet,
+    workspaces,
+    props,
+    gitConfig,
+    successfullyUpdatedGistOrSnippetAlert,
+    errorAlert,
+  ]);
 
   if (!authProvider?.type || !isSupportedGitAuthProviderType(authProvider?.type)) {
     return <></>;
diff --git a/packages/online-editor/src/editor/CreateGitRepositoryModal.tsx b/packages/online-editor/src/editor/Toolbar/GitIntegration/CreateGitRepositoryModal.tsx
similarity index 91%
rename from packages/online-editor/src/editor/CreateGitRepositoryModal.tsx
rename to packages/online-editor/src/editor/Toolbar/GitIntegration/CreateGitRepositoryModal.tsx
index 6481dd7649..9f4e69a1f5 100644
--- a/packages/online-editor/src/editor/CreateGitRepositoryModal.tsx
+++ b/packages/online-editor/src/editor/Toolbar/GitIntegration/CreateGitRepositoryModal.tsx
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -30,17 +30,18 @@ import { Button } from "@patternfly/react-core/dist/js/components/Button";
 import { ValidatedOptions } from "@patternfly/react-core/dist/js/helpers/constants";
 import { Divider } from "@patternfly/react-core/dist/js/components/Divider";
 import { GIT_ORIGIN_REMOTE_NAME } from "@kie-tools-core/workspaces-git-fs/dist/constants/GitConstants";
-import { useSettingsDispatch } from "../settings/SettingsContext";
 import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
-import { useAuthSession } from "../authSessions/AuthSessionsContext";
-import { useBitbucketClient } from "../bitbucket/Hooks";
-import { GithubIcon, BitbucketIcon } from "@patternfly/react-icons";
-import { useGitHubClient } from "../github/Hooks";
-import { isSupportedGitAuthProviderType } from "../authProviders/AuthProvidersApi";
-import { useAuthProvider } from "../authProviders/AuthProvidersContext";
-import { switchExpression } from "../switchExpression/switchExpression";
-import { useOnlineI18n } from "../i18n";
+import { useAuthSession } from "../../../authSessions/AuthSessionsContext";
+import { useBitbucketClient } from "../../../bitbucket/Hooks";
+import { BitbucketIcon } from "@patternfly/react-icons/dist/js/icons/bitbucket-icon";
+import { GithubIcon } from "@patternfly/react-icons/dist/js/icons/github-icon";
+import { useGitHubClient } from "../../../github/Hooks";
+import { isSupportedGitAuthProviderType } from "../../../authProviders/AuthProvidersApi";
+import { useAuthProvider } from "../../../authProviders/AuthProvidersContext";
+import { switchExpression } from "../../../switchExpression/switchExpression";
+import { useOnlineI18n } from "../../../i18n";
 import { LoadOrganizationsSelect, SelectOptionObjectType } from "./LoadOrganizationsSelect";
+import { useGitIntegration } from "./GitIntegrationContextProvider";
 
 export interface CreateRepositoryResponse {
   cloneUrl: string;
@@ -57,10 +58,9 @@ export function CreateGitRepositoryModal(props: {
   workspace: WorkspaceDescriptor;
   isOpen: boolean;
   onClose: () => void;
-  onSuccess: (args: { url: string }) => void;
+  onSuccess?: (args: { url: string }) => void;
 }) {
   const workspaces = useWorkspaces();
-  const settingsDispatch = useSettingsDispatch();
   const { authSession, gitConfig, authInfo } = useAuthSession(props.workspace.gitAuthSessionId);
   const authProvider = useAuthProvider(authSession);
   const bitbucketClient = useBitbucketClient(authSession);
@@ -73,6 +73,10 @@ export function CreateGitRepositoryModal(props: {
   const { i18n } = useOnlineI18n();
   const [selectedOrganization, setSelectedOrganization] = useState<SelectOptionObjectType>();
 
+  const {
+    alerts: { createRepositorySuccessAlert, errorAlert },
+  } = useGitIntegration();
+
   useEffect(() => {
     setName(getSuggestedRepositoryName(props.workspace.name));
   }, [props.workspace.name]);
@@ -196,8 +200,10 @@ export function CreateGitRepositoryModal(props: {
       });
 
       props.onClose();
-      props.onSuccess({ url: websiteUrl });
+      createRepositorySuccessAlert.show({ url: websiteUrl });
+      props.onSuccess?.({ url: websiteUrl });
     } catch (err) {
+      errorAlert.show();
       setError(err);
       throw err;
     } finally {
@@ -212,6 +218,8 @@ export function CreateGitRepositoryModal(props: {
     pushEmptyCommitIntoBitbucket,
     workspaces,
     props,
+    createRepositorySuccessAlert,
+    errorAlert,
   ]);
 
   const isNameValid = useMemo(() => {
@@ -229,6 +237,7 @@ export function CreateGitRepositoryModal(props: {
   if (!authProvider?.type || !isSupportedGitAuthProviderType(authProvider?.type)) {
     return <></>;
   }
+
   return (
     <Modal
       variant={ModalVariant.medium}
diff --git a/packages/online-editor/src/editor/Toolbar/GitIntegration/GitIntegrationAlerts.tsx b/packages/online-editor/src/editor/Toolbar/GitIntegration/GitIntegrationAlerts.tsx
new file mode 100644
index 0000000000..e9867eea81
--- /dev/null
+++ b/packages/online-editor/src/editor/Toolbar/GitIntegration/GitIntegrationAlerts.tsx
@@ -0,0 +1,396 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { useCallback } from "react";
+import { useGlobalAlert } from "../../../alerts";
+import { ActiveWorkspace } from "@kie-tools-core/workspaces-git-fs/dist/model/ActiveWorkspace";
+import {
+  WorkspaceKind,
+  WorkspaceKindGistLike,
+  isGistLikeWorkspaceKind,
+} from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceOrigin";
+import { Alert, AlertActionCloseButton, AlertActionLink } from "@patternfly/react-core/dist/js/components/Alert";
+import { Spinner } from "@patternfly/react-core/dist/js/components/Spinner";
+import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
+import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
+import { switchExpression } from "../../../switchExpression/switchExpression";
+import { useOnlineI18n } from "../../../i18n";
+
+export function useGitIntegrationAlerts(workspace: ActiveWorkspace) {
+  const { i18n } = useOnlineI18n();
+
+  const createRepositorySuccessAlert = useGlobalAlert<{ url: string }>(
+    useCallback(({ close }, { url }) => {
+      return (
+        <Alert
+          variant="success"
+          title={`GitHub repository created.`}
+          actionClose={<AlertActionCloseButton onClose={close} />}
+          actionLinks={<AlertActionLink onClick={() => window.open(url, "_blank")}>{url}</AlertActionLink>}
+        />
+      );
+    }, [])
+  );
+
+  const pushingAlert = useGlobalAlert(
+    useCallback(() => {
+      if (workspace.descriptor.origin.kind !== WorkspaceKind.GIT) {
+        return <></>;
+      }
+
+      return (
+        <Alert
+          variant="info"
+          title={
+            <>
+              <Spinner size={"sm"} />
+              &nbsp;&nbsp; {`Pushing to '${workspace.descriptor.origin.url}'...`}
+            </>
+          }
+        />
+      );
+    }, [workspace.descriptor])
+  );
+
+  const comittingAlert = useGlobalAlert(
+    useCallback(() => {
+      return (
+        <Alert
+          variant="info"
+          title={
+            <>
+              <Spinner size={"sm"} />
+              &nbsp;&nbsp; {`Creating commit...`}
+            </>
+          }
+        />
+      );
+    }, [])
+  );
+
+  const commitSuccessAlert = useGlobalAlert(
+    useCallback(() => {
+      return <Alert variant="success" title={`Commit created.`} />;
+    }, []),
+    { durationInSeconds: 2 }
+  );
+
+  const commitFailAlert = useGlobalAlert(
+    useCallback(({ close }, staticArgs: { reason: string }) => {
+      return (
+        <Alert
+          variant="danger"
+          title={`Failed to commit: ${staticArgs.reason}`}
+          actionClose={<AlertActionCloseButton onClose={close} />}
+        />
+      );
+    }, [])
+  );
+
+  const pushSuccessAlert = useGlobalAlert(
+    useCallback(() => {
+      if (workspace.descriptor.origin.kind !== WorkspaceKind.GIT) {
+        return <></>;
+      }
+
+      return <Alert variant="success" title={`Pushed to '${workspace.descriptor.origin.url}'`} />;
+    }, [workspace.descriptor]),
+    { durationInSeconds: 4 }
+  );
+
+  const pushErrorAlert = useGlobalAlert(
+    useCallback(
+      ({ close }) => {
+        if (workspace.descriptor.origin.kind !== WorkspaceKind.GIT) {
+          return <></>;
+        }
+
+        return (
+          <Alert
+            variant="danger"
+            title={`Error Pushing to '${workspace.descriptor.origin.url}'`}
+            actionClose={<AlertActionCloseButton onClose={close} />}
+          />
+        );
+      },
+      [workspace.descriptor]
+    )
+  );
+
+  const pullingAlert = useGlobalAlert(
+    useCallback(() => {
+      if (workspace.descriptor.origin.kind !== WorkspaceKind.GIT) {
+        return <></>;
+      }
+
+      return (
+        <Alert
+          variant="info"
+          title={
+            <>
+              <Spinner size={"sm"} />
+              &nbsp;&nbsp; {`Pulling from '${workspace.descriptor.origin.url}'...`}
+            </>
+          }
+        />
+      );
+    }, [workspace.descriptor])
+  );
+
+  const pullSuccessAlert = useGlobalAlert(
+    useCallback(() => {
+      if (workspace.descriptor.origin.kind !== WorkspaceKind.GIT) {
+        return <></>;
+      }
+
+      return <Alert variant="success" title={`Pulled from '${workspace.descriptor.origin.url}'`} />;
+    }, [workspace.descriptor]),
+    { durationInSeconds: 4 }
+  );
+
+  const pullErrorAlert = useGlobalAlert<{
+    newBranchName: string;
+    canPushToGitRepository: boolean;
+    pushNewBranch: (branchName: string) => Promise<void>;
+  }>(
+    useCallback(
+      ({ close }, { newBranchName, canPushToGitRepository, pushNewBranch }) => {
+        if (workspace.descriptor.origin.kind !== WorkspaceKind.GIT) {
+          return <></>;
+        }
+
+        return (
+          <Alert
+            variant="danger"
+            title={`Error Pulling from '${workspace.descriptor.origin.url}'`}
+            actionClose={<AlertActionCloseButton onClose={close} />}
+            actionLinks={<></>}
+          >
+            {`This usually happens when your branch has conflicts with the upstream branch or you don't have permission to Pull.`}
+            <br />
+            <br />
+            {`You can save your work to a new branch.`}
+            <br />
+            <br />
+            <Tooltip
+              data-testid={"gist-it-tooltip"}
+              content={<div>{`You need select an authentication source to be able to Push to a new branch.`}</div>}
+              trigger={!canPushToGitRepository ? "mouseenter click" : ""}
+              position="left"
+            >
+              <Button
+                onClick={() => pushNewBranch(newBranchName)}
+                variant={ButtonVariant.link}
+                style={{ paddingLeft: 0 }}
+                isSmall={true}
+                isDisabled={!canPushToGitRepository}
+              >
+                {`Switch to '${newBranchName}'`}
+              </Button>
+            </Tooltip>
+            <br />
+            <br />
+
+            {`Or change the authentication source for '${workspace.descriptor.name}' and try again`}
+            <br />
+          </Alert>
+        );
+      },
+      [workspace.descriptor]
+    )
+  );
+
+  const nothingToCommitAlert = useGlobalAlert(
+    useCallback(() => {
+      return <Alert variant="info" title={"Nothing to commit."} />;
+    }, []),
+    { durationInSeconds: 2 }
+  );
+
+  const successfullyCreatedGistOrSnippetAlert = useGlobalAlert(
+    useCallback(
+      ({ close }) => {
+        if (!isGistLikeWorkspaceKind(workspace.descriptor.origin.kind)) {
+          return <></>;
+        }
+
+        const gistOrSnippetUrl = workspace.descriptor.origin.url;
+        return (
+          <Alert
+            variant="success"
+            title={switchExpression(workspace.descriptor.origin.kind, {
+              GITHUB_GIST: i18n.editorPage.alerts.createGist,
+              BITBUCKET_SNIPPET: i18n.editorPage.alerts.createSnippet,
+            })}
+            actionClose={<AlertActionCloseButton onClose={close} />}
+            actionLinks={
+              <AlertActionLink onClick={() => window.open(gistOrSnippetUrl, "_blank")}>
+                {gistOrSnippetUrl}
+              </AlertActionLink>
+            }
+          />
+        );
+      },
+      [
+        i18n.editorPage.alerts.createGist,
+        i18n.editorPage.alerts.createSnippet,
+        workspace.descriptor.origin.kind,
+        workspace.descriptor.origin.url,
+      ]
+    ),
+    { durationInSeconds: 4 }
+  );
+
+  const loadingGistOrSnippetAlert = useGlobalAlert(
+    useCallback(
+      ({ close }) => {
+        if (!isGistLikeWorkspaceKind(workspace.descriptor.origin.kind)) {
+          return <></>;
+        }
+
+        const gistOrSnippetUrl = workspace.descriptor.origin.url;
+        return (
+          <Alert
+            variant="info"
+            title={
+              <>
+                <Spinner size={"sm"} />
+                &nbsp;&nbsp; Updating{" "}
+                {switchExpression(workspace.descriptor.origin.kind, {
+                  BITBUCKET_SNIPPET: "Snippet",
+                  GITHUB_GIST: "Gist",
+                })}
+                ...
+              </>
+            }
+            actionClose={<AlertActionCloseButton onClose={close} />}
+            actionLinks={
+              <AlertActionLink onClick={() => window.open(gistOrSnippetUrl, "_blank")}>
+                {gistOrSnippetUrl}
+              </AlertActionLink>
+            }
+          />
+        );
+      },
+      [workspace.descriptor.origin.kind, workspace.descriptor.origin.url]
+    )
+  );
+
+  const successfullyUpdatedGistOrSnippetAlert = useGlobalAlert(
+    useCallback(
+      ({ close }) => {
+        if (!isGistLikeWorkspaceKind(workspace.descriptor.origin.kind)) {
+          return <></>;
+        }
+
+        const gistOrSnippetUrl = workspace.descriptor.origin.url;
+        return (
+          <Alert
+            variant="success"
+            title={switchExpression(workspace.descriptor.origin.kind, {
+              GITHUB_GIST: i18n.editorPage.alerts.updateGist,
+              BITBUCKET_SNIPPET: i18n.editorPage.alerts.updateSnippet,
+            })}
+            actionClose={<AlertActionCloseButton onClose={close} />}
+            actionLinks={
+              <AlertActionLink onClick={() => window.open(gistOrSnippetUrl, "_blank")}>
+                {gistOrSnippetUrl}
+              </AlertActionLink>
+            }
+          />
+        );
+      },
+      [
+        i18n.editorPage.alerts.updateGist,
+        i18n.editorPage.alerts.updateSnippet,
+        workspace.descriptor.origin.kind,
+        workspace.descriptor.origin.url,
+      ]
+    ),
+    { durationInSeconds: 4 }
+  );
+
+  const errorPushingGistOrSnippet = useGlobalAlert<{ forceUpdateGistOrSnippet: () => Promise<void> }>(
+    useCallback(
+      ({ close }, { forceUpdateGistOrSnippet }) => {
+        return (
+          <Alert
+            variant="danger"
+            title={switchExpression(workspace.descriptor.origin.kind as WorkspaceKindGistLike, {
+              GITHUB_GIST: i18n.editorPage.alerts.errorPushingGist,
+              BITBUCKET_SNIPPET: i18n.editorPage.alerts.errorPushingSnippet,
+            })}
+            actionLinks={[
+              <AlertActionLink
+                key="force"
+                onClick={() => {
+                  close();
+                  forceUpdateGistOrSnippet();
+                }}
+              >
+                Push forcefully
+              </AlertActionLink>,
+              <AlertActionLink key="dismiss" onClick={close}>
+                Dismiss
+              </AlertActionLink>,
+            ]}
+            actionClose={<AlertActionCloseButton onClose={close} />}
+          >
+            <b>{i18n.editorPage.alerts.forcePushWarning}</b>
+          </Alert>
+        );
+      },
+      [
+        workspace.descriptor.origin.kind,
+        i18n.editorPage.alerts.errorPushingGist,
+        i18n.editorPage.alerts.errorPushingSnippet,
+        i18n.editorPage.alerts.forcePushWarning,
+      ]
+    )
+  );
+
+  const errorAlert = useGlobalAlert(
+    useCallback(
+      ({ close }) => (
+        <Alert
+          variant="danger"
+          title={i18n.editorPage.alerts.error}
+          actionClose={<AlertActionCloseButton onClose={close} />}
+        />
+      ),
+      [i18n]
+    )
+  );
+
+  return {
+    createRepositorySuccessAlert,
+    comittingAlert,
+    commitSuccessAlert,
+    commitFailAlert,
+    pushingAlert,
+    pushSuccessAlert,
+    pushErrorAlert,
+    pullingAlert,
+    pullSuccessAlert,
+    pullErrorAlert,
+    nothingToCommitAlert,
+    successfullyCreatedGistOrSnippetAlert,
+    loadingGistOrSnippetAlert,
+    successfullyUpdatedGistOrSnippetAlert,
+    errorPushingGistOrSnippet,
+    errorAlert,
+  };
+}
diff --git a/packages/online-editor/src/editor/Toolbar/GitIntegration/GitIntegrationContextProvider.tsx b/packages/online-editor/src/editor/Toolbar/GitIntegration/GitIntegrationContextProvider.tsx
new file mode 100644
index 0000000000..be98c9ca2c
--- /dev/null
+++ b/packages/online-editor/src/editor/Toolbar/GitIntegration/GitIntegrationContextProvider.tsx
@@ -0,0 +1,630 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, {
+  ReactNode,
+  SetStateAction,
+  createContext,
+  useCallback,
+  useContext,
+  useEffect,
+  useMemo,
+  useState,
+} from "react";
+import { useWorkspaces } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+import { AuthSessionSelectFilter } from "../../../authSessions/AuthSessionSelect";
+import { ActiveWorkspace } from "@kie-tools-core/workspaces-git-fs/dist/model/ActiveWorkspace";
+import { useAuthSession } from "../../../authSessions/AuthSessionsContext";
+import { useAuthProvider } from "../../../authProviders/AuthProvidersContext";
+import { useGitHubClient } from "../../../github/Hooks";
+import { useBitbucketClient } from "../../../bitbucket/Hooks";
+import {
+  WorkspaceKind,
+  isGistLikeWorkspaceKind,
+} from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceOrigin";
+import {
+  authSessionsSelectFilterCompatibleWithGistOrSnippetUrlDomain,
+  authSessionsSelectFilterCompatibleWithGitUrlDomain,
+  gitAuthSessionSelectFilter,
+} from "../../../authSessions/CompatibleAuthSessions";
+import type { RestEndpointMethodTypes as OctokitRestEndpointMethodTypes } from "@octokit/plugin-rest-endpoint-methods/dist-types/generated/parameters-and-response-types";
+import { useCancelableEffect } from "@kie-tools-core/react-hooks/dist/useCancelableEffect";
+import { ImportableUrl, UrlType, useImportableUrl } from "../../../importFromUrl/ImportableUrlHooks";
+import {
+  GIST_ORIGIN_REMOTE_NAME,
+  GIT_ORIGIN_REMOTE_NAME,
+} from "@kie-tools-core/workspaces-git-fs/dist/constants/GitConstants";
+import { useNavigationBlockersBypass, useRoutes } from "../../../navigation/Hooks";
+import { useHistory } from "react-router";
+import { useGitIntegrationAlerts } from "./GitIntegrationAlerts";
+import { isGistEnabledAuthProviderType } from "../../../authProviders/AuthProvidersApi";
+import { useEditorToolbarDispatchContext } from "../EditorToolbarContextProvider";
+
+export type GitIntegrationContextType = {
+  workspaceImportableUrl: ImportableUrl;
+  git: {
+    canPushToGitRepository: boolean;
+    canCreateGitRepository: boolean;
+    pushNewBranch: (newBranchName: string) => Promise<void>;
+    pushToGitRepository: () => Promise<void>;
+    pullFromGitRepository: (args: { showAlerts: boolean }) => Promise<void>;
+  };
+  gistOrSnippet: {
+    canCreateGistOrSnippet: boolean;
+    canUpdateGistOrSnippet: boolean;
+    canForkGitHubGist: boolean;
+    forceUpdateGistOrSnippet: () => Promise<void>;
+    updateGistOrSnippet: () => Promise<void>;
+    forkGitHubGist: () => Promise<void>;
+  };
+  auth: {
+    changeGitAuthSessionId: (
+      newGitAuthSessionId: SetStateAction<string | undefined>,
+      lastAuthSessionId: string | undefined
+    ) => void;
+    authSessionSelectFilter: AuthSessionSelectFilter;
+  };
+  alerts: ReturnType<typeof useGitIntegrationAlerts>;
+};
+
+export const GitIntegrationContext = createContext<GitIntegrationContextType>({} as any);
+
+export type GitIntegrationContextProviderProps = {
+  children: ReactNode;
+  workspace: ActiveWorkspace;
+};
+
+export function GitIntegrationContextProvider(props: GitIntegrationContextProviderProps) {
+  const workspaces = useWorkspaces();
+  const routes = useRoutes();
+  const history = useHistory();
+  const { authSession, authInfo, gitConfig } = useAuthSession(props.workspace.descriptor.gitAuthSessionId);
+  const authProvider = useAuthProvider(authSession);
+  const workspaceImportableUrl = useImportableUrl(props.workspace.descriptor.origin.url?.toString());
+  const alerts = useGitIntegrationAlerts(props.workspace);
+  const navigationBlockersBypass = useNavigationBlockersBypass();
+  const { setSyncGistOrSnippetDropdownOpen } = useEditorToolbarDispatchContext();
+
+  const gitHubClient = useGitHubClient(authSession);
+  const bitbucketClient = useBitbucketClient(authSession);
+
+  const [isGistOrSnippetLoading, setGistOrSnippetLoading] = useState(false);
+  const [gitHubGist, setGitHubGist] =
+    useState<OctokitRestEndpointMethodTypes["gists"]["get"]["response"]["data"] | undefined>(undefined);
+  const [bitbucketSnippet, setBitbucketSnippet] = useState<any>(undefined);
+
+  useCancelableEffect(
+    useCallback(
+      ({ canceled }) => {
+        if (gitHubGist || workspaceImportableUrl.type !== UrlType.GIST_DOT_GITHUB_DOT_COM) {
+          return;
+        }
+
+        const { gistId } = workspaceImportableUrl;
+
+        if (!gistId) {
+          return;
+        }
+
+        gitHubClient.gists.get({ gist_id: gistId }).then(({ data: gist }) => {
+          if (canceled.get()) {
+            return;
+          }
+
+          if (gist) {
+            setGitHubGist(gist);
+          }
+        });
+      },
+      [gitHubGist, workspaceImportableUrl, gitHubClient.gists]
+    )
+  );
+
+  useCancelableEffect(
+    useCallback(
+      ({ canceled }) => {
+        if (bitbucketSnippet || workspaceImportableUrl.type !== UrlType.BITBUCKET_DOT_ORG_SNIPPET) {
+          return;
+        }
+
+        const { snippetId, org } = workspaceImportableUrl;
+
+        if (!snippetId || !org) {
+          return;
+        }
+
+        bitbucketClient.getSnippet({ workspace: org, snippetId }).then(async (response) => {
+          if (canceled.get()) {
+            return;
+          }
+          const json = await response.json();
+          setBitbucketSnippet(json);
+        });
+      },
+      [bitbucketSnippet, workspaceImportableUrl, bitbucketClient]
+    )
+  );
+
+  const authSessionSelectFilter = useMemo(() => {
+    if (!props.workspace) {
+      return gitAuthSessionSelectFilter();
+    }
+
+    if (props.workspace.descriptor.origin.kind === WorkspaceKind.LOCAL) {
+      return gitAuthSessionSelectFilter();
+    }
+
+    if (props.workspace.descriptor.origin.kind === WorkspaceKind.GIT) {
+      return authSessionsSelectFilterCompatibleWithGitUrlDomain(
+        new URL(props.workspace.descriptor.origin.url).hostname
+      );
+    }
+
+    if (props.workspace.descriptor.origin.kind === WorkspaceKind.GITHUB_GIST) {
+      return authSessionsSelectFilterCompatibleWithGistOrSnippetUrlDomain(
+        new URL(props.workspace.descriptor.origin.url).hostname,
+        gitHubGist?.owner?.login
+      );
+    }
+
+    if (props.workspace.descriptor.origin.kind === WorkspaceKind.BITBUCKET_SNIPPET) {
+      return authSessionsSelectFilterCompatibleWithGistOrSnippetUrlDomain(
+        new URL(props.workspace.descriptor.origin.url).hostname,
+        bitbucketSnippet?.owner?.login
+      );
+    }
+
+    return gitAuthSessionSelectFilter();
+  }, [bitbucketSnippet?.owner?.login, gitHubGist?.owner?.login, props.workspace]);
+
+  const changeGitAuthSessionId = useCallback(
+    (newGitAuthSessionId: React.SetStateAction<string | undefined>, lastAuthSessionId: string | undefined) => {
+      workspaces.changeGitAuthSessionId({
+        workspaceId: props.workspace.descriptor.workspaceId,
+        gitAuthSessionId:
+          typeof newGitAuthSessionId === "function" ? newGitAuthSessionId(lastAuthSessionId) : newGitAuthSessionId,
+      });
+    },
+    [props.workspace.descriptor.workspaceId, workspaces]
+  );
+
+  const workspaceHasNestedDirectories = useMemo(
+    () => props.workspace.files.filter((f) => f.relativePath !== f.name).length !== 0,
+    [props.workspace]
+  );
+
+  const canCreateGitHubRepository = useMemo(() => authProvider?.type === "github", [authProvider?.type]);
+
+  const canCreateBitbucketRepository = useMemo(() => authProvider?.type === "bitbucket", [authProvider?.type]);
+
+  const canCreateGitRepository = useMemo(
+    () => canCreateGitHubRepository || canCreateBitbucketRepository,
+    [canCreateGitHubRepository, canCreateBitbucketRepository]
+  );
+
+  const canPushToGitRepository = useMemo(
+    () => authSession?.type === "git" && !!authProvider,
+    [authProvider, authSession?.type]
+  );
+
+  const isGitHubGistOwner = useMemo(() => {
+    return authInfo?.username && gitHubGist?.owner?.login === authInfo.username;
+  }, [authInfo, gitHubGist]);
+
+  const isBitbucketSnippetOwner = useMemo(() => {
+    return authInfo?.uuid && bitbucketSnippet?.creator.uuid === authInfo.uuid;
+  }, [authInfo, bitbucketSnippet]);
+
+  const isGistOrSnippetOwner = isGitHubGistOwner || isBitbucketSnippetOwner;
+
+  const canCreateGistOrSnippet = useMemo(
+    () =>
+      Boolean(
+        authProvider &&
+          isGistEnabledAuthProviderType(authProvider?.type) &&
+          props.workspace.descriptor.origin.kind === WorkspaceKind.LOCAL &&
+          !workspaceHasNestedDirectories
+      ),
+    [authProvider, props.workspace.descriptor.origin.kind, workspaceHasNestedDirectories]
+  );
+
+  const canUpdateGistOrSnippet = useMemo(
+    () =>
+      Boolean(
+        authProvider &&
+          isGistEnabledAuthProviderType(authProvider?.type) &&
+          !!isGistOrSnippetOwner &&
+          props.workspace &&
+          isGistLikeWorkspaceKind(props.workspace.descriptor.origin.kind) &&
+          !workspaceHasNestedDirectories
+      ),
+    [authProvider, isGistOrSnippetOwner, props.workspace, workspaceHasNestedDirectories]
+  );
+
+  const canForkGitHubGist = useMemo(
+    () =>
+      authProvider?.type === "github" &&
+      !isGistOrSnippetOwner &&
+      props.workspace.descriptor.origin.kind === WorkspaceKind.GITHUB_GIST &&
+      !workspaceHasNestedDirectories,
+    [authProvider?.type, isGistOrSnippetOwner, props.workspace.descriptor.origin.kind, workspaceHasNestedDirectories]
+  );
+
+  const pushNewBranch = useCallback(
+    async (newBranchName: string) => {
+      if (!authInfo || !props.workspace) {
+        return;
+      }
+
+      try {
+        alerts.pushingAlert.show();
+
+        await workspaces.createSavePoint({
+          workspaceId: props.workspace.descriptor.workspaceId,
+          gitConfig,
+        });
+
+        await workspaces.branch({
+          workspaceId: props.workspace.descriptor.workspaceId,
+          checkout: false,
+          name: newBranchName,
+        });
+
+        await workspaces.push({
+          workspaceId: props.workspace.descriptor.workspaceId,
+          remote: GIT_ORIGIN_REMOTE_NAME,
+          remoteRef: `refs/heads/${newBranchName}`,
+          ref: newBranchName,
+          force: false,
+          authInfo,
+        });
+
+        history.push({
+          pathname: routes.import.path({}),
+          search: routes.import.queryString({
+            url: `${props.workspace.descriptor.origin.url}`,
+            branch: newBranchName,
+            authSessionId: props.workspace.descriptor.gitAuthSessionId,
+          }),
+        });
+      } catch (e) {
+        alerts.pushErrorAlert.show();
+      } finally {
+        alerts.pushingAlert.close();
+      }
+    },
+    [
+      authInfo,
+      props.workspace,
+      alerts.pushingAlert,
+      alerts.pushErrorAlert,
+      workspaces,
+      gitConfig,
+      history,
+      routes.import,
+    ]
+  );
+
+  const pullFromGitRepository = useCallback(
+    async (args: { showAlerts: boolean }) => {
+      alerts.pullingAlert.close();
+      alerts.pullErrorAlert.close();
+      alerts.pullSuccessAlert.close();
+
+      if (args.showAlerts) {
+        alerts.pullingAlert.show();
+      }
+      await workspaces.createSavePoint({
+        workspaceId: props.workspace.descriptor.workspaceId,
+        gitConfig,
+      });
+
+      try {
+        await workspaces.pull({
+          workspaceId: props.workspace.descriptor.workspaceId,
+          authInfo,
+        });
+
+        if (args.showAlerts) {
+          alerts.pullSuccessAlert.show();
+        }
+      } catch (e) {
+        console.error(e);
+        if (args.showAlerts) {
+          const randomString = (Math.random() + 1).toString(36).substring(7);
+          const newBranchName = `${props.workspace.descriptor.origin.branch}-${randomString}`;
+          alerts.pullErrorAlert.show({ newBranchName, canPushToGitRepository, pushNewBranch });
+        }
+      } finally {
+        if (args.showAlerts) {
+          alerts.pullingAlert.close();
+        }
+      }
+    },
+    [
+      alerts.pullingAlert,
+      alerts.pullErrorAlert,
+      alerts.pullSuccessAlert,
+      workspaces,
+      props.workspace.descriptor.workspaceId,
+      props.workspace.descriptor.origin.branch,
+      gitConfig,
+      authInfo,
+      canPushToGitRepository,
+      pushNewBranch,
+    ]
+  );
+
+  const pushToGitRepository = useCallback(async () => {
+    alerts.pushingAlert.close();
+    alerts.pushErrorAlert.close();
+    alerts.pushSuccessAlert.close();
+
+    if (!authInfo) {
+      return;
+    }
+
+    alerts.pushingAlert.show();
+    try {
+      const workspaceId = props.workspace.descriptor.workspaceId;
+      await workspaces.createSavePoint({
+        workspaceId: workspaceId,
+        gitConfig,
+      });
+
+      const workspace = await workspaces.getWorkspace({ workspaceId });
+      await workspaces.push({
+        workspaceId: props.workspace.descriptor.workspaceId,
+        ref: workspace.origin.branch,
+        remote: GIST_ORIGIN_REMOTE_NAME,
+        remoteRef: `refs/heads/${workspace.origin.branch}`,
+        force: false,
+        authInfo,
+      });
+      await pullFromGitRepository({ showAlerts: false });
+      alerts.pushSuccessAlert.show();
+    } catch (e) {
+      console.error(e);
+      alerts.pushErrorAlert.show();
+    } finally {
+      alerts.pushingAlert.close();
+    }
+  }, [
+    alerts.pushingAlert,
+    alerts.pushErrorAlert,
+    alerts.pushSuccessAlert,
+    authInfo,
+    props.workspace.descriptor.workspaceId,
+    workspaces,
+    gitConfig,
+    pullFromGitRepository,
+  ]);
+
+  const forceUpdateGistOrSnippet = useCallback(async () => {
+    try {
+      if (!authInfo || !props.workspace) {
+        return;
+      }
+
+      setGistOrSnippetLoading(true);
+
+      await workspaces.push({
+        workspaceId: props.workspace.descriptor.workspaceId,
+        remote: GIST_ORIGIN_REMOTE_NAME,
+        ref: props.workspace.descriptor.origin.branch,
+        remoteRef: `refs/heads/${props.workspace.descriptor.origin.branch}`,
+        force: true,
+        authInfo,
+      });
+
+      await workspaces.pull({
+        workspaceId: props.workspace.descriptor.workspaceId,
+        authInfo,
+      });
+    } catch (e) {
+      alerts.errorAlert.show();
+    } finally {
+      setGistOrSnippetLoading(false);
+      setSyncGistOrSnippetDropdownOpen(false);
+    }
+
+    alerts.successfullyUpdatedGistOrSnippetAlert.show();
+  }, [
+    alerts.errorAlert,
+    alerts.successfullyUpdatedGistOrSnippetAlert,
+    authInfo,
+    props.workspace,
+    setSyncGistOrSnippetDropdownOpen,
+    workspaces,
+  ]);
+
+  const updateGistOrSnippet = useCallback(async () => {
+    try {
+      if (
+        !authInfo ||
+        !props.workspace ||
+        !isGistEnabledAuthProviderType(authProvider?.type) ||
+        !isGistLikeWorkspaceKind(props.workspace.descriptor.origin.kind)
+      ) {
+        return;
+      }
+      setGistOrSnippetLoading(true);
+
+      await workspaces.createSavePoint({
+        workspaceId: props.workspace.descriptor.workspaceId,
+        gitConfig,
+      });
+
+      await workspaces.push({
+        workspaceId: props.workspace.descriptor.workspaceId,
+        remote: GIST_ORIGIN_REMOTE_NAME,
+        ref: props.workspace.descriptor.origin.branch,
+        remoteRef: `refs/heads/${props.workspace.descriptor.origin.branch}`,
+        force: false,
+        authInfo,
+      });
+
+      await workspaces.pull({
+        workspaceId: props.workspace.descriptor.workspaceId,
+        authInfo,
+      });
+    } catch (e) {
+      alerts.errorPushingGistOrSnippet.show({ forceUpdateGistOrSnippet });
+      throw e;
+    } finally {
+      setGistOrSnippetLoading(false);
+      setSyncGistOrSnippetDropdownOpen(false);
+    }
+
+    alerts.successfullyUpdatedGistOrSnippetAlert.show();
+  }, [
+    alerts.successfullyUpdatedGistOrSnippetAlert,
+    alerts.errorPushingGistOrSnippet,
+    authInfo,
+    props.workspace,
+    authProvider?.type,
+    workspaces,
+    gitConfig,
+    forceUpdateGistOrSnippet,
+    setSyncGistOrSnippetDropdownOpen,
+  ]);
+
+  const forkGitHubGist = useCallback(async () => {
+    try {
+      if (!authSession || !authInfo || !gitHubGist?.id || !props.workspace) {
+        return;
+      }
+
+      setGistOrSnippetLoading(true);
+
+      // Fork Gist
+      const gist = await gitHubClient.gists.fork({
+        gist_id: gitHubGist.id,
+      });
+
+      const remoteName = gist.data.id;
+
+      // Adds forked gist remote to current one
+      await workspaces.addRemote({
+        workspaceId: props.workspace.descriptor.workspaceId,
+        url: gist.data.git_push_url,
+        name: remoteName,
+        force: true,
+      });
+
+      // Commit
+      await workspaces.createSavePoint({
+        workspaceId: props.workspace.descriptor.workspaceId,
+        gitConfig,
+      });
+
+      // Push to forked gist remote
+      await workspaces.push({
+        workspaceId: props.workspace.descriptor.workspaceId,
+        remote: remoteName,
+        ref: props.workspace.descriptor.origin.branch,
+        remoteRef: `refs/heads/${props.workspace.descriptor.origin.branch}`,
+        force: true,
+        authInfo,
+      });
+
+      // Redirect to import workspace
+      navigationBlockersBypass.execute(() => {
+        history.push({
+          pathname: routes.import.path({}),
+          search: routes.import.queryString({
+            url: gist.data.html_url,
+            authSessionId: authSession.id,
+          }),
+        });
+      });
+    } catch (err) {
+      alerts.errorAlert.show();
+      throw err;
+    } finally {
+      setGistOrSnippetLoading(false);
+    }
+  }, [
+    authSession,
+    authInfo,
+    gitHubGist,
+    props.workspace,
+    gitHubClient.gists,
+    workspaces,
+    gitConfig,
+    navigationBlockersBypass,
+    history,
+    routes.import,
+    alerts.errorAlert,
+  ]);
+
+  useEffect(() => {
+    if (isGistOrSnippetLoading) {
+      alerts.loadingGistOrSnippetAlert.show();
+    } else {
+      alerts.loadingGistOrSnippetAlert.close();
+    }
+  }, [alerts.loadingGistOrSnippetAlert, isGistOrSnippetLoading]);
+
+  const value = useMemo(
+    () => ({
+      workspaceImportableUrl,
+      git: {
+        canPushToGitRepository,
+        canCreateGitRepository,
+        pushNewBranch,
+        pushToGitRepository,
+        pullFromGitRepository,
+      },
+      gistOrSnippet: {
+        canCreateGistOrSnippet,
+        canUpdateGistOrSnippet,
+        canForkGitHubGist,
+        forceUpdateGistOrSnippet,
+        updateGistOrSnippet,
+        forkGitHubGist,
+      },
+      auth: {
+        authSessionSelectFilter,
+        changeGitAuthSessionId,
+      },
+      alerts,
+    }),
+    [
+      workspaceImportableUrl,
+      canPushToGitRepository,
+      canCreateGitRepository,
+      pushNewBranch,
+      pushToGitRepository,
+      pullFromGitRepository,
+      canCreateGistOrSnippet,
+      canUpdateGistOrSnippet,
+      canForkGitHubGist,
+      forceUpdateGistOrSnippet,
+      updateGistOrSnippet,
+      forkGitHubGist,
+      authSessionSelectFilter,
+      changeGitAuthSessionId,
+      alerts,
+    ]
+  );
+
+  return <GitIntegrationContext.Provider value={value}>{props.children}</GitIntegrationContext.Provider>;
+}
+
+export function useGitIntegration() {
+  return useContext(GitIntegrationContext);
+}
diff --git a/packages/online-editor/src/editor/LoadOrganizationsSelect.tsx b/packages/online-editor/src/editor/Toolbar/GitIntegration/LoadOrganizationsSelect.tsx
similarity index 82%
rename from packages/online-editor/src/editor/LoadOrganizationsSelect.tsx
rename to packages/online-editor/src/editor/Toolbar/GitIntegration/LoadOrganizationsSelect.tsx
index 43ec3f76d4..15aa56d71a 100644
--- a/packages/online-editor/src/editor/LoadOrganizationsSelect.tsx
+++ b/packages/online-editor/src/editor/Toolbar/GitIntegration/LoadOrganizationsSelect.tsx
@@ -14,28 +14,25 @@
  * limitations under the License.
  */
 
-import * as React from "react";
-import { useMemo } from "react";
+import React, { useMemo } from "react";
 import { WorkspaceDescriptor } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceDescriptor";
-import {
-  Button,
-  Divider,
-  Flex,
-  FlexItem,
-  Select,
-  SelectGroup,
-  SelectOption,
-  SelectVariant,
-} from "@patternfly/react-core";
+import { Button } from "@patternfly/react-core/dist/js/components/Button";
+import { Divider } from "@patternfly/react-core/dist/js/components/Divider";
+import { Flex, FlexItem } from "@patternfly/react-core/dist/js/layouts/Flex";
+import { Select, SelectGroup, SelectOption, SelectVariant } from "@patternfly/react-core/dist/js/components/Select";
 import { useCallback, useEffect, useState } from "react";
-import { AuthProviderType, isSupportedGitAuthProviderType } from "../authProviders/AuthProvidersApi";
-import { useAuthProvider } from "../authProviders/AuthProvidersContext";
-import { useAuthSession } from "../authSessions/AuthSessionsContext";
-import { useBitbucketClient } from "../bitbucket/Hooks";
-import { useGitHubClient } from "../github/Hooks";
-import { switchExpression } from "../switchExpression/switchExpression";
-import { BitbucketIcon, GithubIcon, SyncAltIcon, UserAltIcon, UserIcon, UsersIcon } from "@patternfly/react-icons";
-import { useOnlineI18n } from "../i18n";
+import { AuthProviderType, isSupportedGitAuthProviderType } from "../../../authProviders/AuthProvidersApi";
+import { useAuthProvider } from "../../../authProviders/AuthProvidersContext";
+import { useAuthSession } from "../../../authSessions/AuthSessionsContext";
+import { useBitbucketClient } from "../../../bitbucket/Hooks";
+import { useGitHubClient } from "../../../github/Hooks";
+import { switchExpression } from "../../../switchExpression/switchExpression";
+import { BitbucketIcon } from "@patternfly/react-icons/dist/js/icons/bitbucket-icon";
+import { GithubIcon } from "@patternfly/react-icons/dist/js/icons/github-icon";
+import { SyncAltIcon } from "@patternfly/react-icons/dist/js/icons/sync-alt-icon";
+import { UserIcon } from "@patternfly/react-icons/dist/js/icons/user-icon";
+import { UsersIcon } from "@patternfly/react-icons/dist/js/icons/users-icon";
+import { useOnlineI18n } from "../../../i18n";
 
 export interface LoadOrganizationsReponse {
   organizations: {
@@ -105,12 +102,13 @@ export const LoadOrganizationsSelect = (props: Props) => {
     return { organizations: values.map((it) => ({ name: it.workspace.slug })) };
   }, [bitbucketClient]);
 
+  const { onSelect } = props;
   const setSelectedOption = useCallback(
     (option?: SelectOptionObjectType) => {
-      props.onSelect(option);
+      onSelect(option);
       setInternalSelectedOption(option);
     },
-    [props]
+    [onSelect]
   );
 
   const selectDefaultOption = useCallback(
@@ -125,7 +123,7 @@ export const LoadOrganizationsSelect = (props: Props) => {
         })
       );
     },
-    [authInfo?.username, authProvider?.type]
+    [authInfo, authProvider?.type, setSelectedOption]
   );
 
   const loadOrganizations = useCallback(() => {
@@ -152,9 +150,9 @@ export const LoadOrganizationsSelect = (props: Props) => {
     if (authProvider && isSupportedGitAuthProviderType(authProvider?.type)) {
       loadOrganizations();
     }
-  }, [loadOrganizations, authProvider?.type, authProvider]);
+  }, [loadOrganizations, setSelectedOption, authProvider]);
 
-  const selectOptions = useCallback(() => {
+  const selectOptions = useMemo(() => {
     const options: JSX.Element[] = [];
     if (!authProvider || !isSupportedGitAuthProviderType(authProvider.type)) {
       return options;
@@ -215,7 +213,7 @@ export const LoadOrganizationsSelect = (props: Props) => {
             selections={internalSelectedOption}
             isDisabled={props.readonly}
           >
-            {selectOptions()}
+            {selectOptions}
           </Select>
         )}
       </FlexItem>
diff --git a/packages/online-editor/src/editor/Toolbar/GitIntegration/PushToGitAlertActionLinks.tsx b/packages/online-editor/src/editor/Toolbar/GitIntegration/PushToGitAlertActionLinks.tsx
new file mode 100644
index 0000000000..6ab16f1801
--- /dev/null
+++ b/packages/online-editor/src/editor/Toolbar/GitIntegration/PushToGitAlertActionLinks.tsx
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { useMemo } from "react";
+import { WorkspaceDescriptor } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceDescriptor";
+import { AuthSessionSelect, AuthSessionSelectFilter } from "../../../authSessions/AuthSessionSelect";
+import { AccountsDispatchActionKind, useAccountsDispatch } from "../../../accounts/AccountsContext";
+import { WorkspaceKind } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceOrigin";
+import { Alert, AlertActionLink } from "@patternfly/react-core/dist/js/components/Alert";
+import { switchExpression } from "../../../switchExpression/switchExpression";
+import { SelectPosition } from "@patternfly/react-core/dist/js/components/Select";
+import { AuthProviderGroup } from "../../../authProviders/AuthProvidersApi";
+
+export function PushToGitAlertActionLinks(props: {
+  onPush: () => void;
+  canPush?: boolean;
+  remoteRef?: string;
+  workspaceDescriptor: WorkspaceDescriptor | undefined;
+  changeGitAuthSessionId: (a: React.SetStateAction<string | undefined>, b: string | undefined) => void;
+  authSessionSelectFilter: AuthSessionSelectFilter;
+}) {
+  const accountsDispatch = useAccountsDispatch();
+  if (props.workspaceDescriptor?.origin.kind === WorkspaceKind.GIT && !props.remoteRef) {
+    throw new Error("Should specify remoteRef for GIT workspaces");
+  }
+
+  const pushButton = useMemo(
+    () => (
+      <AlertActionLink onClick={props.onPush} style={{ fontWeight: "bold" }} isDisabled={!props.canPush}>
+        {props.workspaceDescriptor
+          ? switchExpression(props.workspaceDescriptor.origin.kind, {
+              GIT: `Push to '${props.remoteRef}'`,
+              GITHUB_GIST: "Update Gist",
+              BITBUCKET_SNIPPET: "Update Snippet",
+              default: "",
+            })
+          : ""}
+      </AlertActionLink>
+    ),
+    [props]
+  );
+
+  return (
+    <>
+      {!props.canPush && (
+        <Alert
+          isInline={true}
+          variant={"default"}
+          title={"Can't Push without selecting an authentication source"}
+          actionLinks={
+            <>
+              <AuthSessionSelect
+                title={`Select Git authentication for '${props.workspaceDescriptor?.name}'...`}
+                position={SelectPosition.right}
+                isPlain={false}
+                authSessionId={props.workspaceDescriptor?.gitAuthSessionId}
+                showOnlyThisAuthProviderGroupWhenConnectingToNewAccount={AuthProviderGroup.GIT}
+                setAuthSessionId={(newAuthSessionId) => {
+                  props.changeGitAuthSessionId(newAuthSessionId, props.workspaceDescriptor?.gitAuthSessionId);
+                  accountsDispatch({ kind: AccountsDispatchActionKind.CLOSE });
+                }}
+                filter={props.authSessionSelectFilter}
+              />
+              <br />
+              <br />
+              {pushButton}
+            </>
+          }
+        >
+          {`Select an authentication source for '${props.workspaceDescriptor?.name}' to be able to Push.`}
+          <br />
+        </Alert>
+      )}
+      {props.canPush && pushButton}
+    </>
+  );
+}
diff --git a/packages/online-editor/src/editor/Toolbar/KebabDropdown.tsx b/packages/online-editor/src/editor/Toolbar/KebabDropdown.tsx
new file mode 100644
index 0000000000..0743a3b0a4
--- /dev/null
+++ b/packages/online-editor/src/editor/Toolbar/KebabDropdown.tsx
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from "react";
+import { Dropdown, DropdownPosition, DropdownToggle } from "@patternfly/react-core/dist/js/components/Dropdown";
+import EllipsisVIcon from "@patternfly/react-icons/dist/js/icons/ellipsis-v-icon";
+
+export function KebabDropdown(props: {
+  id: string;
+  items: React.ReactNode[];
+  state: [boolean, React.Dispatch<React.SetStateAction<boolean>>];
+}) {
+  return (
+    <Dropdown
+      className={"kie-tools--masthead-hoverable"}
+      isOpen={props.state[0]}
+      isPlain={true}
+      position={DropdownPosition.right}
+      onSelect={() => props.state[1](false)}
+      toggle={
+        <DropdownToggle
+          id={props.id}
+          toggleIndicator={null}
+          onToggle={(isOpen) => props.state[1](isOpen)}
+          ouiaId={props.id}
+        >
+          <EllipsisVIcon />
+        </DropdownToggle>
+      }
+      dropdownItems={props.items}
+    />
+  );
+}
diff --git a/packages/online-editor/src/editor/NewFileDropdownMenu.tsx b/packages/online-editor/src/editor/Toolbar/NewFileDropdownMenu.tsx
similarity index 81%
rename from packages/online-editor/src/editor/NewFileDropdownMenu.tsx
rename to packages/online-editor/src/editor/Toolbar/NewFileDropdownMenu.tsx
index 17e88deb70..14094d632c 100644
--- a/packages/online-editor/src/editor/NewFileDropdownMenu.tsx
+++ b/packages/online-editor/src/editor/Toolbar/NewFileDropdownMenu.tsx
@@ -17,7 +17,7 @@
 import * as React from "react";
 import { useCallback, useEffect, useMemo, useRef, useState } from "react";
 import { useWorkspaces, WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
-import { FileLabel } from "../filesList/FileLabel";
+import { FileLabel } from "../../filesList/FileLabel";
 import { Flex, FlexItem } from "@patternfly/react-core/dist/js/layouts/Flex";
 import { Divider } from "@patternfly/react-core/dist/js/components/Divider";
 import {
@@ -32,22 +32,25 @@ import {
 import {
   SupportedFileExtensions,
   useEditorEnvelopeLocator,
-} from "../envelopeLocator/hooks/EditorEnvelopeLocatorContext";
+} from "../../envelopeLocator/hooks/EditorEnvelopeLocatorContext";
 import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
 import { Alert, AlertActionCloseButton } from "@patternfly/react-core/dist/js/components/Alert";
 import { basename, extname } from "path";
-import { ImportSingleFileFromUrlForm } from "../importFromUrl/ImportSingleFileFromUrlForm";
-import { ImportableUrl, UrlType, useImportableUrl } from "../importFromUrl/ImportableUrlHooks";
-import { useRoutes } from "../navigation/Hooks";
-import { fetchSingleFileContent } from "../importFromUrl/fetchSingleFileContent";
-import { useAuthSession, useAuthSessions } from "../authSessions/AuthSessionsContext";
-import { useGitHubClient } from "../github/Hooks";
-import { useAuthProviders } from "../authProviders/AuthProvidersContext";
-import { getCompatibleAuthSessionWithUrlDomain } from "../authSessions/CompatibleAuthSessions";
+import { ImportSingleFileFromUrlForm } from "../../importFromUrl/ImportSingleFileFromUrlForm";
+import { ImportableUrl, UrlType, useImportableUrl } from "../../importFromUrl/ImportableUrlHooks";
+import { useRoutes } from "../../navigation/Hooks";
+import { fetchSingleFileContent } from "../../importFromUrl/fetchSingleFileContent";
+import { useAuthSession, useAuthSessions } from "../../authSessions/AuthSessionsContext";
+import { useGitHubClient } from "../../github/Hooks";
+import { useAuthProviders } from "../../authProviders/AuthProvidersContext";
+import { getCompatibleAuthSessionWithUrlDomain } from "../../authSessions/CompatibleAuthSessions";
 import { decoder } from "@kie-tools-core/workspaces-git-fs/dist/encoderdecoder/EncoderDecoder";
 import { WorkspaceDescriptor } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceDescriptor";
-import { useGlobalAlert } from "../alerts";
-import { useBitbucketClient } from "../bitbucket/Hooks";
+import { useGlobalAlert } from "../../alerts";
+import { useBitbucketClient } from "../../bitbucket/Hooks";
+import { isEditable } from "../../envelopeLocator/EditorEnvelopeLocatorFactory";
+
+const ROOT_MENU_ID = "addFileRootMenu";
 
 export function NewFileDropdownMenu(props: {
   destinationDirPath: string;
@@ -59,28 +62,33 @@ export function NewFileDropdownMenu(props: {
   const [menuDrilledIn, setMenuDrilledIn] = useState<string[]>([]);
   const [drilldownPath, setDrilldownPath] = useState<string[]>([]);
   const [menuHeights, setMenuHeights] = useState<{ [key: string]: number }>({});
-  const [activeMenu, setActiveMenu] = useState("addFileRootMenu");
+  const [activeMenu, setActiveMenu] = useState(ROOT_MENU_ID);
 
-  const drillIn = useCallback((fromMenuId, toMenuId, pathId) => {
+  const drillIn = useCallback((_event, fromMenuId, toMenuId, pathId) => {
     setMenuDrilledIn((prev) => [...prev, fromMenuId]);
     setDrilldownPath((prev) => [...prev, pathId]);
     setActiveMenu(toMenuId);
   }, []);
 
-  const drillOut = useCallback((toMenuId) => {
+  const drillOut = useCallback((_event, toMenuId) => {
     setMenuDrilledIn((prev) => prev.slice(0, prev.length - 1));
     setDrilldownPath((prev) => prev.slice(0, prev.length - 1));
     setActiveMenu(toMenuId);
   }, []);
 
   const setHeight = useCallback((menuId: string, height: number) => {
-    // do not try to simplify this ternary's condition as some heights are 0, resulting in an infinite loop.
-    setMenuHeights((prev) => (prev[menuId] !== undefined ? prev : { ...prev, [menuId]: height }));
+    setMenuHeights((prev) => {
+      if (prev[menuId] === undefined || (menuId !== ROOT_MENU_ID && prev[menuId] !== height)) {
+        return { ...prev, [menuId]: height };
+      }
+      return prev;
+    });
   }, []);
 
   const workspaces = useWorkspaces();
   const routes = useRoutes();
   const editorEnvelopeLocator = useEditorEnvelopeLocator();
+  const { gitConfig } = useAuthSession(props.workspaceDescriptor.gitAuthSessionId);
 
   const addEmptyFile = useCallback(
     async (extension: SupportedFileExtensions) => {
@@ -147,12 +155,30 @@ export function NewFileDropdownMenu(props: {
         })
       );
 
+      // Since non-editable files are not checked for changes, manually stage and commit these files
+      await Promise.all(
+        uploadedFiles.map(async (file) => {
+          if (!isEditable(file.relativePath)) {
+            return workspaces.stageFile({
+              workspaceId: props.workspaceDescriptor.workspaceId,
+              relativePath: file.relativePath,
+            });
+          }
+        })
+      );
+      await workspaces.createSavePoint({
+        workspaceId: props.workspaceDescriptor.workspaceId,
+        gitConfig,
+        commitMessage: `KIE Sandbox: Added files${uploadedFiles.map((file) => `\n- ${file.relativePath}`)}`,
+        forceHasChanges: true,
+      });
+
       const fileToGoTo = uploadedFiles.filter((file) => editorEnvelopeLocator.hasMappingFor(file.relativePath)).pop();
 
       await props.onAddFile(fileToGoTo);
       successfullyUploadedAlert.show({ qtt: uploadedFiles.length });
     },
-    [editorEnvelopeLocator, workspaces, props, successfullyUploadedAlert]
+    [editorEnvelopeLocator, workspaces, props, successfullyUploadedAlert, gitConfig]
   );
 
   const [url, setUrl] = useState("");
@@ -247,7 +273,7 @@ export function NewFileDropdownMenu(props: {
     <Menu
       tabIndex={1}
       style={{ boxShadow: "none", minWidth: "400px" }}
-      id="addFileRootMenu"
+      id={ROOT_MENU_ID}
       containsDrilldown={true}
       onDrillIn={drillIn}
       onDrillOut={drillOut}
@@ -257,7 +283,7 @@ export function NewFileDropdownMenu(props: {
       drilledInMenus={menuDrilledIn}
     >
       <MenuContent menuHeight={`${menuHeights[activeMenu]}px`}>
-        <MenuList>
+        <MenuList style={{ padding: 0 }}>
           <MenuItem
             itemId={"newBpmnItemId"}
             onClick={() => addEmptyFile("bpmn")}
@@ -267,28 +293,24 @@ export function NewFileDropdownMenu(props: {
               <FileLabel style={{ marginBottom: "4px" }} extension={"bpmn"} />
             </b>
           </MenuItem>
-          <MenuGroup label={" "}>
-            <MenuItem
-              itemId={"newDmnItemId"}
-              onClick={() => addEmptyFile("dmn")}
-              description="DMN files are used to generate decision models"
-            >
-              <b>
-                <FileLabel style={{ marginBottom: "4px" }} extension={"dmn"} />
-              </b>
-            </MenuItem>
-          </MenuGroup>
-          <MenuGroup label={" "}>
-            <MenuItem
-              itemId={"newPmmlItemId"}
-              onClick={() => addEmptyFile("pmml")}
-              description="PMML files are used to generate scorecards"
-            >
-              <b>
-                <FileLabel style={{ marginBottom: "4px" }} extension={"pmml"} />
-              </b>
-            </MenuItem>
-          </MenuGroup>
+          <MenuItem
+            itemId={"newDmnItemId"}
+            onClick={() => addEmptyFile("dmn")}
+            description="DMN files are used to generate decision models"
+          >
+            <b>
+              <FileLabel style={{ marginBottom: "4px" }} extension={"dmn"} />
+            </b>
+          </MenuItem>
+          <MenuItem
+            itemId={"newPmmlItemId"}
+            onClick={() => addEmptyFile("pmml")}
+            description="PMML files are used to generate scorecards"
+          >
+            <b>
+              <FileLabel style={{ marginBottom: "4px" }} extension={"pmml"} />
+            </b>
+          </MenuItem>
           <Divider />
           <MenuItem
             description={"Try sample models"}
diff --git a/packages/online-editor/src/editor/Toolbar/Share/DownloadDropdownGroup.tsx b/packages/online-editor/src/editor/Toolbar/Share/DownloadDropdownGroup.tsx
new file mode 100644
index 0000000000..ed0d17e583
--- /dev/null
+++ b/packages/online-editor/src/editor/Toolbar/Share/DownloadDropdownGroup.tsx
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { useCallback, useEffect, useMemo } from "react";
+import { DropdownGroup, DropdownItem } from "@patternfly/react-core/dist/js/components/Dropdown";
+import DownloadIcon from "@patternfly/react-icons/dist/js/icons/download-icon";
+import FolderIcon from "@patternfly/react-icons/dist/js/icons/folder-icon";
+import ImageIcon from "@patternfly/react-icons/dist/js/icons/image-icon";
+import { WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+import { useGlobalAlertsDispatchContext } from "../../../alerts";
+import { ActiveWorkspace } from "@kie-tools-core/workspaces-git-fs/dist/model/ActiveWorkspace";
+import { EmbeddedEditorRef } from "@kie-tools-core/editor/dist/embedded";
+import { useEditorToolbarContext } from "../EditorToolbarContextProvider";
+
+type Props = {
+  workspaceFile: WorkspaceFile;
+  workspace: ActiveWorkspace;
+  editor: EmbeddedEditorRef | undefined;
+};
+
+export const DownloadDropdownGroup = (props: Props) => {
+  const alertsDispatch = useGlobalAlertsDispatchContext();
+  const { downloadRef, downloadAllRef, downloadPreviewRef, downloadWorkspaceZip } = useEditorToolbarContext();
+
+  useEffect(() => {
+    if (!props.workspaceFile) {
+      return;
+    }
+    if (downloadRef.current) {
+      downloadRef.current.download = `${props.workspaceFile.name}`;
+    }
+    if (downloadAllRef.current) {
+      downloadAllRef.current.download = `${props.workspace.descriptor.name}.zip`;
+    }
+    if (downloadPreviewRef.current) {
+      downloadPreviewRef.current.download = `${props.workspaceFile.name}.svg`;
+    }
+  }, [props.workspaceFile, props.workspace.descriptor, downloadRef, downloadAllRef, downloadPreviewRef]);
+
+  const shouldIncludeDownloadSvgDropdownItem = useMemo(() => {
+    return props.workspaceFile.extension.toLowerCase() !== "pmml";
+  }, [props.workspaceFile]);
+
+  const onDownload = useCallback(() => {
+    props.editor?.getStateControl().setSavedCommand();
+    alertsDispatch.closeAll();
+    props.workspaceFile.getFileContents().then((content) => {
+      if (downloadRef.current) {
+        const fileBlob = new Blob([content], { type: "text/plain" });
+        downloadRef.current.href = URL.createObjectURL(fileBlob);
+        downloadRef.current.click();
+      }
+    });
+  }, [props.editor, props.workspaceFile, alertsDispatch, downloadRef]);
+
+  const downloadSvg = useCallback(() => {
+    props.editor?.getPreview().then((previewSvg) => {
+      if (downloadPreviewRef.current && previewSvg) {
+        const fileBlob = new Blob([previewSvg], { type: "image/svg+xml" });
+        downloadPreviewRef.current.href = URL.createObjectURL(fileBlob);
+        downloadPreviewRef.current.click();
+      }
+    });
+  }, [downloadPreviewRef, props.editor]);
+
+  return (
+    <DropdownGroup key={"download-group"} label="Download">
+      <DropdownItem
+        onClick={onDownload}
+        key={"download-file-item"}
+        description={`${props.workspaceFile.name} will be downloaded`}
+        icon={<DownloadIcon />}
+        ouiaId="download-file-dropdown-button"
+      >
+        Current file
+      </DropdownItem>
+      {shouldIncludeDownloadSvgDropdownItem && (
+        <DropdownItem
+          key={`dropdown-download-svg`}
+          data-testid="dropdown-download-svg"
+          component="button"
+          onClick={downloadSvg}
+          description={`Image of ${props.workspaceFile.name} will be downloaded in SVG format`}
+          icon={<ImageIcon />}
+        >
+          {"Current file's SVG"}
+        </DropdownItem>
+      )}
+      <DropdownItem
+        onClick={downloadWorkspaceZip}
+        key={"download-zip-item"}
+        description={`A zip file including all files will be downloaded`}
+        icon={<FolderIcon />}
+      >
+        All files
+      </DropdownItem>
+    </DropdownGroup>
+  );
+};
diff --git a/packages/online-editor/src/editor/Toolbar/Share/EmbedDropdownGroup.tsx b/packages/online-editor/src/editor/Toolbar/Share/EmbedDropdownGroup.tsx
new file mode 100644
index 0000000000..7c6520d23e
--- /dev/null
+++ b/packages/online-editor/src/editor/Toolbar/Share/EmbedDropdownGroup.tsx
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { useCallback, useMemo } from "react";
+import { DropdownGroup, DropdownItem } from "@patternfly/react-core/dist/js/components/Dropdown";
+import { WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+import { ActiveWorkspace } from "@kie-tools-core/workspaces-git-fs/dist/model/ActiveWorkspace";
+import { Divider } from "@patternfly/react-core/dist/js/components/Divider";
+import ColumnsIcon from "@patternfly/react-icons/dist/js/icons/columns-icon";
+import { useOnlineI18n } from "../../../i18n";
+import { useEditorToolbarDispatchContext } from "../EditorToolbarContextProvider";
+
+type Props = {
+  workspaceFile: WorkspaceFile;
+  workspace: ActiveWorkspace;
+};
+
+export const EmbedDropdownGroup = (props: Props) => {
+  const { i18n } = useOnlineI18n();
+  const { setEmbedModalOpen } = useEditorToolbarDispatchContext();
+
+  const shouldIncludeEmbedDropdownItem = useMemo(() => {
+    return props.workspaceFile.extension.toLowerCase() !== "pmml";
+  }, [props.workspaceFile]);
+
+  const openEmbedModal = useCallback(() => {
+    setEmbedModalOpen(true);
+  }, [setEmbedModalOpen]);
+
+  if (!shouldIncludeEmbedDropdownItem) {
+    return null;
+  }
+
+  return (
+    <>
+      <Divider key={"divider-other-group"} />
+      <DropdownGroup key={"other-group"} label="Other">
+        <DropdownItem
+          key={`dropdown-embed`}
+          data-testid="dropdown-embed"
+          component="button"
+          onClick={openEmbedModal}
+          icon={<ColumnsIcon />}
+        >
+          {i18n.editorToolbar.embed}...
+        </DropdownItem>
+      </DropdownGroup>
+    </>
+  );
+};
diff --git a/packages/online-editor/src/editor/EmbedModal.tsx b/packages/online-editor/src/editor/Toolbar/Share/EmbedModal.tsx
similarity index 98%
rename from packages/online-editor/src/editor/EmbedModal.tsx
rename to packages/online-editor/src/editor/Toolbar/Share/EmbedModal.tsx
index 569edcb5af..1573209906 100644
--- a/packages/online-editor/src/editor/EmbedModal.tsx
+++ b/packages/online-editor/src/editor/Toolbar/Share/EmbedModal.tsx
@@ -1,5 +1,5 @@
 /*
- * Copyright 2020 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,7 +20,7 @@ import { Modal, ModalVariant } from "@patternfly/react-core/dist/js/components/M
 import { Radio } from "@patternfly/react-core/dist/js/components/Radio";
 import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
 import { ClipboardCopy, ClipboardCopyVariant } from "@patternfly/react-core/dist/js/components/ClipboardCopy";
-import { useOnlineI18n } from "../i18n";
+import { useOnlineI18n } from "../../../i18n";
 import { WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
 import { WorkspaceDescriptor } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceDescriptor";
 import { GistOrigin, WorkspaceKind } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceOrigin";
diff --git a/packages/online-editor/src/editor/Toolbar/Share/GitDropdownGroup.tsx b/packages/online-editor/src/editor/Toolbar/Share/GitDropdownGroup.tsx
new file mode 100644
index 0000000000..771eba4d54
--- /dev/null
+++ b/packages/online-editor/src/editor/Toolbar/Share/GitDropdownGroup.tsx
@@ -0,0 +1,161 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from "react";
+import { ActiveWorkspace } from "@kie-tools-core/workspaces-git-fs/dist/model/ActiveWorkspace";
+import {
+  WorkspaceKind,
+  isGistLikeWorkspaceKind,
+} from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceOrigin";
+import { useOnlineI18n } from "../../../i18n";
+import {
+  AuthProviderGroup,
+  GistEnabledAuthProviderType,
+  GitAuthProviderType,
+} from "../../../authProviders/AuthProvidersApi";
+import { SelectPosition } from "@patternfly/react-core/dist/js/components/Select";
+import { DropdownGroup, DropdownItem } from "@patternfly/react-core/dist/js/components/Dropdown";
+import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
+import { AuthSessionSelect } from "../../../authSessions/AuthSessionSelect";
+import { AccountsDispatchActionKind, useAccountsDispatch } from "../../../accounts/AccountsContext";
+import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
+import { switchExpression } from "../../../switchExpression/switchExpression";
+import BitbucketIcon from "@patternfly/react-icons/dist/js/icons/bitbucket-icon";
+import GithubIcon from "@patternfly/react-icons/dist/js/icons/github-icon";
+import GitIcon from "@patternfly/react-icons/dist/js/icons/git-icon";
+import { useAuthSession } from "../../../authSessions/AuthSessionsContext";
+import { useAuthProvider } from "../../../authProviders/AuthProvidersContext";
+import { useGitIntegration } from "../GitIntegration/GitIntegrationContextProvider";
+import { useEditorToolbarDispatchContext } from "../EditorToolbarContextProvider";
+
+type Props = {
+  workspace: ActiveWorkspace;
+};
+
+export const GitDropdownGroup = (props: Props) => {
+  const { i18n } = useOnlineI18n();
+  const { authSession } = useAuthSession(props.workspace.descriptor.gitAuthSessionId);
+  const authProvider = useAuthProvider(authSession);
+  const accountsDispatch = useAccountsDispatch();
+
+  const {
+    auth: { authSessionSelectFilter, changeGitAuthSessionId },
+    git: { canCreateGitRepository },
+    gistOrSnippet: { canCreateGistOrSnippet },
+  } = useGitIntegration();
+  const { setCreateGitRepositoryModalOpen, setCreateGistOrSnippetModalOpen, setShareDropdownOpen, setSmallKebabOpen } =
+    useEditorToolbarDispatchContext();
+
+  if (
+    props.workspace.descriptor.origin.kind !== WorkspaceKind.LOCAL &&
+    !isGistLikeWorkspaceKind(props.workspace.descriptor.origin.kind)
+  ) {
+    return null;
+  }
+
+  return (
+    <>
+      <DropdownGroup key={"git-group"} label={i18n.names.git}>
+        <Alert
+          isInline={true}
+          variant={"info"}
+          title={"Authentication source"}
+          actionLinks={
+            <AuthSessionSelect
+              title={`Select Git authentication for '${props.workspace.descriptor.name}'...`}
+              position={SelectPosition.right}
+              isPlain={false}
+              authSessionId={props.workspace.descriptor.gitAuthSessionId}
+              showOnlyThisAuthProviderGroupWhenConnectingToNewAccount={AuthProviderGroup.GIT}
+              setAuthSessionId={(newAuthSessionId) => {
+                changeGitAuthSessionId(newAuthSessionId, props.workspace.descriptor.gitAuthSessionId);
+                setTimeout(() => {
+                  accountsDispatch({ kind: AccountsDispatchActionKind.CLOSE });
+                  setShareDropdownOpen(true);
+                  setSmallKebabOpen(true);
+                }, 0);
+              }}
+              filter={authSessionSelectFilter}
+            />
+          }
+        >
+          {`Manage authentication sources for '${props.workspace.descriptor.name}' to be able to create Repository, GitHub Gist or Bitbucket Snippet.`}
+        </Alert>
+        {canCreateGitRepository && (
+          <Tooltip
+            data-testid={"create-git-repository-tooltip"}
+            key={`dropdown-create-git-repository`}
+            content={<div>{"Click to create a repository."}</div>}
+            trigger={!canCreateGitRepository ? "mouseenter click" : ""}
+            position="left"
+          >
+            <DropdownItem
+              icon={switchExpression(authProvider?.type as GitAuthProviderType, {
+                bitbucket: <BitbucketIcon />,
+                github: <GithubIcon />,
+                default: <GitIcon />,
+              })}
+              data-testid={"create-git-repository-button"}
+              component="button"
+              onClick={() => setCreateGitRepositoryModalOpen(true)}
+              isDisabled={!canCreateGitRepository}
+            >
+              Create{" "}
+              {switchExpression(authProvider?.type as GitAuthProviderType, {
+                github: "GitHub repository",
+                bitbucket: "Bitbucket repository",
+                default: "Git repository",
+              })}
+              ...
+            </DropdownItem>
+          </Tooltip>
+        )}
+        {canCreateGistOrSnippet && (
+          <Tooltip
+            data-testid={"create-gist-or-snippet-tooltip"}
+            key={`dropdown-create-gist-or-snippet`}
+            content={
+              <div>
+                {switchExpression(authProvider?.type as GistEnabledAuthProviderType, {
+                  github: i18n.editorToolbar.cantCreateGistTooltip,
+                  bitbucket: i18n.editorToolbar.cantCreateSnippetTooltip,
+                })}
+              </div>
+            }
+            trigger={!canCreateGistOrSnippet ? "mouseenter click" : ""}
+            position="left"
+          >
+            <DropdownItem
+              icon={switchExpression(authProvider?.type as GistEnabledAuthProviderType, {
+                bitbucket: <BitbucketIcon />,
+                github: <GithubIcon />,
+              })}
+              data-testid={"create-gist-or-snippet-button"}
+              component="button"
+              onClick={() => setCreateGistOrSnippetModalOpen(true)}
+              isDisabled={!canCreateGistOrSnippet}
+            >
+              {switchExpression(authProvider?.type as GistEnabledAuthProviderType, {
+                github: i18n.editorToolbar.createGist,
+                bitbucket: i18n.editorToolbar.createSnippet,
+              })}
+            </DropdownItem>
+          </Tooltip>
+        )}
+      </DropdownGroup>
+    </>
+  );
+};
diff --git a/packages/online-editor/src/editor/Toolbar/SyncDropdownMenu.tsx b/packages/online-editor/src/editor/Toolbar/SyncDropdownMenu.tsx
new file mode 100644
index 0000000000..ca0452e58f
--- /dev/null
+++ b/packages/online-editor/src/editor/Toolbar/SyncDropdownMenu.tsx
@@ -0,0 +1,279 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from "react";
+import { ActiveWorkspace } from "@kie-tools-core/workspaces-git-fs/dist/model/ActiveWorkspace";
+import {
+  WorkspaceKind,
+  WorkspaceKindGistLike,
+  isGistLikeWorkspaceKind,
+} from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceOrigin";
+import {
+  Dropdown,
+  DropdownGroup,
+  DropdownItem,
+  DropdownPosition,
+  DropdownToggle,
+} from "@patternfly/react-core/dist/js/components/Dropdown";
+import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
+import { switchExpression } from "../../switchExpression/switchExpression";
+import { useOnlineI18n } from "../../i18n";
+import BitbucketIcon from "@patternfly/react-icons/dist/js/icons/bitbucket-icon";
+import GithubIcon from "@patternfly/react-icons/dist/js/icons/github-icon";
+import { Divider } from "@patternfly/react-core/dist/js/components/Divider";
+import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
+import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
+import { AuthSessionSelect } from "../../authSessions/AuthSessionSelect";
+import { AuthProviderGroup, GitAuthProviderType } from "../../authProviders/AuthProvidersApi";
+import { AccountsDispatchActionKind, useAccountsDispatch } from "../../accounts/AccountsContext";
+import SyncAltIcon from "@patternfly/react-icons/dist/js/icons/sync-alt-icon";
+import { GIT_ORIGIN_REMOTE_NAME } from "@kie-tools-core/workspaces-git-fs/dist/constants/GitConstants";
+import ArrowCircleUpIcon from "@patternfly/react-icons/dist/js/icons/arrow-circle-up-icon";
+import { useEditorToolbarContext, useEditorToolbarDispatchContext } from "./EditorToolbarContextProvider";
+import { useGitIntegration } from "./GitIntegration/GitIntegrationContextProvider";
+import { useAuthProvider } from "../../authProviders/AuthProvidersContext";
+import { useAuthSession } from "../../authSessions/AuthSessionsContext";
+
+type Props = {
+  workspace: ActiveWorkspace;
+};
+
+export function SyncDropdownMenu(props: Props) {
+  const { i18n } = useOnlineI18n();
+  const accountsDispatch = useAccountsDispatch();
+  const { authSession } = useAuthSession(props.workspace.descriptor.gitAuthSessionId);
+  const authProvider = useAuthProvider(authSession);
+  const { isSyncGistOrSnippetDropdownOpen, isSyncGitRepositoryDropdownOpen } = useEditorToolbarContext();
+
+  const { setSyncGistOrSnippetDropdownOpen, setSyncGitRepositoryDropdownOpen } = useEditorToolbarDispatchContext();
+
+  const {
+    auth: { changeGitAuthSessionId, authSessionSelectFilter },
+    git: { canPushToGitRepository, pushToGitRepository, pullFromGitRepository },
+    gistOrSnippet: { canUpdateGistOrSnippet, updateGistOrSnippet, canForkGitHubGist, forkGitHubGist },
+  } = useGitIntegration();
+
+  return (
+    <>
+      {isGistLikeWorkspaceKind(props.workspace.descriptor.origin.kind) && (
+        <Dropdown
+          onSelect={() => setSyncGistOrSnippetDropdownOpen(false)}
+          isOpen={isSyncGistOrSnippetDropdownOpen}
+          position={DropdownPosition.right}
+          toggle={
+            <DropdownToggle
+              id={"sync-dropdown"}
+              data-testid={"sync-dropdown"}
+              onToggle={(isOpen) => setSyncGistOrSnippetDropdownOpen(isOpen)}
+            >
+              Sync
+            </DropdownToggle>
+          }
+          dropdownItems={[
+            <DropdownGroup key={"sync-gist-or-snippet-dropdown-group"}>
+              <Tooltip
+                data-testid={"gist-or-snippet-it-tooltip"}
+                content={
+                  <div>
+                    {switchExpression(props.workspace.descriptor.origin.kind as WorkspaceKindGistLike, {
+                      GITHUB_GIST: i18n.editorToolbar.cantUpdateGistTooltip,
+                      BITBUCKET_SNIPPET: i18n.editorToolbar.cantUpdateSnippetTooltip,
+                    })}
+                  </div>
+                }
+                trigger={!canUpdateGistOrSnippet ? "mouseenter click" : ""}
+                position="left"
+              >
+                <>
+                  <DropdownItem
+                    style={{ minWidth: "300px" }}
+                    icon={switchExpression(props.workspace.descriptor.origin.kind as WorkspaceKindGistLike, {
+                      BITBUCKET_SNIPPET: <BitbucketIcon />,
+                      GITHUB_GIST: <GithubIcon />,
+                    })}
+                    onClick={updateGistOrSnippet}
+                    isDisabled={!canUpdateGistOrSnippet}
+                  >
+                    Update{" "}
+                    {switchExpression(props.workspace.descriptor.origin.kind as WorkspaceKindGistLike, {
+                      BITBUCKET_SNIPPET: "Bitbucket Snippet",
+                      GITHUB_GIST: "GitHub Gist",
+                    })}
+                  </DropdownItem>
+                  {canForkGitHubGist && (
+                    <>
+                      <Divider />
+                      <li role="menuitem">
+                        <Alert
+                          isInline={true}
+                          variant={"default"}
+                          title={<span style={{ whiteSpace: "nowrap" }}>{"Can't update Gists you don't own"}</span>}
+                        >
+                          <br />
+                          {`You can create a fork of '${props.workspace.descriptor.name}' to save your updates.`}
+                          <br />
+                          <br />
+                          <Button
+                            onClick={forkGitHubGist}
+                            variant={ButtonVariant.link}
+                            isSmall={true}
+                            style={{ paddingLeft: 0 }}
+                          >
+                            {`Fork Gist`}
+                          </Button>
+                          <br />
+                          <br />
+                          {`Or you can change the authentication source for '${props.workspace.descriptor.name}' to be able to Update Gist.`}
+                          <br />
+                          <br />
+                          <AuthSessionSelect
+                            title={`Select Git authentication for '${props.workspace.descriptor.name}'...`}
+                            isPlain={false}
+                            authSessionId={props.workspace.descriptor.gitAuthSessionId}
+                            showOnlyThisAuthProviderGroupWhenConnectingToNewAccount={AuthProviderGroup.GIT}
+                            setAuthSessionId={(newAuthSessionId) => {
+                              changeGitAuthSessionId(newAuthSessionId, props.workspace.descriptor.gitAuthSessionId);
+                              accountsDispatch({ kind: AccountsDispatchActionKind.CLOSE });
+                              setTimeout(() => {
+                                setSyncGistOrSnippetDropdownOpen(true);
+                              }, 0);
+                            }}
+                            filter={authSessionSelectFilter}
+                          />
+                        </Alert>
+                      </li>
+                    </>
+                  )}
+                  {!canPushToGitRepository && (
+                    <>
+                      <Divider />
+                      <Alert
+                        isInline={true}
+                        variant={"default"}
+                        title={`Can't Update ${switchExpression(authProvider?.type as GitAuthProviderType, {
+                          github: "GitHub repository",
+                          bitbucket: "Bitbucket repository",
+                          default: "Git repository",
+                        })} without selecting a matching authentication source`}
+                        actionLinks={
+                          <AuthSessionSelect
+                            title={`Select Git authentication for '${props.workspace.descriptor.name}'...`}
+                            isPlain={false}
+                            authSessionId={props.workspace.descriptor.gitAuthSessionId}
+                            showOnlyThisAuthProviderGroupWhenConnectingToNewAccount={AuthProviderGroup.GIT}
+                            setAuthSessionId={(newAuthSessionId) => {
+                              changeGitAuthSessionId(newAuthSessionId, props.workspace.descriptor.gitAuthSessionId);
+                              accountsDispatch({ kind: AccountsDispatchActionKind.CLOSE });
+                              setTimeout(() => {
+                                setSyncGistOrSnippetDropdownOpen(true);
+                              }, 0);
+                            }}
+                            filter={authSessionSelectFilter}
+                          />
+                        }
+                      >
+                        {`Select an authentication source for '${
+                          props.workspace.descriptor.name
+                        }' to be able to Update ${switchExpression(
+                          props.workspace.descriptor.origin.kind as WorkspaceKindGistLike,
+                          {
+                            GITHUB_GIST: "Github Gist",
+                            BITBUCKET_SNIPPET: "Bitbucket Snippet",
+                          }
+                        )}.`}
+                      </Alert>
+                    </>
+                  )}
+                </>
+              </Tooltip>
+            </DropdownGroup>,
+          ]}
+        />
+      )}
+      {props.workspace.descriptor.origin.kind === WorkspaceKind.GIT && (
+        <Dropdown
+          onSelect={() => setSyncGitRepositoryDropdownOpen(false)}
+          isOpen={isSyncGitRepositoryDropdownOpen}
+          position={DropdownPosition.right}
+          toggle={
+            <DropdownToggle
+              id={"sync-dropdown"}
+              data-testid={"sync-dropdown"}
+              onToggle={(isOpen) => setSyncGitRepositoryDropdownOpen(isOpen)}
+            >
+              Sync
+            </DropdownToggle>
+          }
+          dropdownItems={[
+            <DropdownGroup key={"sync-git-dropdown-group"}>
+              <DropdownItem
+                icon={<SyncAltIcon />}
+                onClick={() => pullFromGitRepository({ showAlerts: true })}
+                description={`Get new changes made upstream at '${GIT_ORIGIN_REMOTE_NAME}/${props.workspace.descriptor.origin.branch}'.`}
+              >
+                Pull
+              </DropdownItem>
+              <Tooltip
+                data-testid={"git-it-tooltip"}
+                content={<div>{`You need to select an authentication source to Push to this repository.`}</div>}
+                trigger={!canPushToGitRepository ? "mouseenter click" : ""}
+                position="left"
+              >
+                <>
+                  <DropdownItem
+                    icon={<ArrowCircleUpIcon />}
+                    onClick={pushToGitRepository}
+                    isDisabled={!canPushToGitRepository}
+                    description={`Send your changes upstream to '${GIT_ORIGIN_REMOTE_NAME}/${props.workspace.descriptor.origin.branch}'.`}
+                  >
+                    Push
+                  </DropdownItem>
+                  {!canPushToGitRepository && (
+                    <>
+                      <Alert
+                        isInline={true}
+                        variant={"default"}
+                        title={"Can't Push without selecting an authentication source"}
+                        actionLinks={
+                          <AuthSessionSelect
+                            title={`Select Git authentication for '${props.workspace.descriptor.name}'...`}
+                            isPlain={false}
+                            authSessionId={props.workspace.descriptor.gitAuthSessionId}
+                            showOnlyThisAuthProviderGroupWhenConnectingToNewAccount={AuthProviderGroup.GIT}
+                            setAuthSessionId={(newAuthSessionId) => {
+                              changeGitAuthSessionId(newAuthSessionId, props.workspace.descriptor.gitAuthSessionId);
+                              accountsDispatch({ kind: AccountsDispatchActionKind.CLOSE });
+                              setTimeout(() => {
+                                setSyncGitRepositoryDropdownOpen(true);
+                              });
+                            }}
+                            filter={authSessionSelectFilter}
+                          />
+                        }
+                      >
+                        {`Select an authentication source for '${props.workspace.descriptor.name}' to be able to Push.`}
+                      </Alert>
+                    </>
+                  )}
+                </>
+              </Tooltip>
+            </DropdownGroup>,
+          ]}
+        />
+      )}
+    </>
+  );
+}
diff --git a/packages/online-editor/src/editor/Toolbar/VsCodeDropdownMenu.tsx b/packages/online-editor/src/editor/Toolbar/VsCodeDropdownMenu.tsx
new file mode 100644
index 0000000000..4566beba98
--- /dev/null
+++ b/packages/online-editor/src/editor/Toolbar/VsCodeDropdownMenu.tsx
@@ -0,0 +1,160 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { useState } from "react";
+import {
+  Dropdown,
+  DropdownGroup,
+  DropdownItem,
+  DropdownToggle,
+} from "@patternfly/react-core/dist/js/components/Dropdown";
+import { Flex, FlexItem } from "@patternfly/react-core/dist/js/layouts/Flex";
+import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
+import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
+import CaretDownIcon from "@patternfly/react-icons/dist/js/icons/caret-down-icon";
+import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
+import { PushToGitAlertActionLinks } from "./GitIntegration/PushToGitAlertActionLinks";
+import { Divider } from "@patternfly/react-core/dist/js/components/Divider";
+import ExternalLinkAltIcon from "@patternfly/react-icons/dist/js/icons/external-link-alt-icon";
+import { ActiveWorkspace } from "@kie-tools-core/workspaces-git-fs/dist/model/ActiveWorkspace";
+import { useNavigationStatus, useRoutes } from "../../navigation/Hooks";
+import { WorkspaceKind } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceOrigin";
+import { UrlType } from "../../importFromUrl/ImportableUrlHooks";
+import { GIT_ORIGIN_REMOTE_NAME } from "@kie-tools-core/workspaces-git-fs/dist/constants/GitConstants";
+import { useGitIntegration } from "./GitIntegration/GitIntegrationContextProvider";
+
+export function VsCodeDropdownMenu(props: { workspace: ActiveWorkspace }) {
+  const routes = useRoutes();
+  const navigationStatus = useNavigationStatus();
+  const [isVsCodeDropdownOpen, setVsCodeDropdownOpen] = useState(false);
+
+  const {
+    workspaceImportableUrl,
+    auth: { changeGitAuthSessionId, authSessionSelectFilter },
+    git: { canPushToGitRepository, pushToGitRepository },
+  } = useGitIntegration();
+
+  if (
+    props.workspace.descriptor.origin.kind !== WorkspaceKind.GIT ||
+    workspaceImportableUrl.type !== UrlType.GITHUB_DOT_COM
+  ) {
+    return null;
+  }
+
+  return (
+    <FlexItem
+      style={{
+        minWidth: "137px",
+      }}
+    >
+      <Dropdown
+        className={"kie-tools--masthead-hoverable"}
+        isPlain={true}
+        onSelect={() => setVsCodeDropdownOpen(false)}
+        isOpen={isVsCodeDropdownOpen}
+        position={"right"}
+        toggle={
+          <DropdownToggle toggleIndicator={null} onToggle={setVsCodeDropdownOpen}>
+            <Flex flexWrap={{ default: "nowrap" }}>
+              <FlexItem
+                style={{
+                  minWidth: 0 /* This is to make the flex parent not overflow horizontally */,
+                }}
+              >
+                <Tooltip distance={5} position={"top-start"} content={props.workspace.descriptor.name}>
+                  <TextContent>
+                    <Text
+                      component={TextVariants.small}
+                      style={{
+                        whiteSpace: "nowrap",
+                        overflow: "hidden",
+                        textOverflow: "ellipsis",
+                      }}
+                    >
+                      <img
+                        style={{
+                          minWidth: "14px",
+                          maxWidth: "14px",
+                          marginTop: "-2px",
+                          verticalAlign: "middle",
+                        }}
+                        alt="vscode-logo-blue"
+                        src={routes.static.images.vscodeLogoBlue.path({})}
+                      />
+                      &nbsp;&nbsp;
+                      {`Open "${props.workspace.descriptor.name}"`}
+                    </Text>
+                  </TextContent>
+                </Tooltip>
+              </FlexItem>
+              <FlexItem>
+                <CaretDownIcon />
+              </FlexItem>
+            </Flex>
+          </DropdownToggle>
+        }
+        dropdownItems={[
+          <DropdownGroup key={"open-in-vscode"}>
+            {navigationStatus.shouldBlockNavigationTo({ pathname: "__external" }) && (
+              <>
+                <Alert
+                  isInline={true}
+                  variant={"warning"}
+                  title={"You have new changes to Push"}
+                  actionLinks={
+                    <PushToGitAlertActionLinks
+                      changeGitAuthSessionId={changeGitAuthSessionId}
+                      workspaceDescriptor={props.workspace.descriptor}
+                      canPush={canPushToGitRepository}
+                      authSessionSelectFilter={authSessionSelectFilter}
+                      remoteRef={`${GIT_ORIGIN_REMOTE_NAME}/${props.workspace.descriptor.origin.branch}`}
+                      onPush={pushToGitRepository}
+                    />
+                  }
+                >
+                  {`Opening '${props.workspace.descriptor.name}' on vscode.dev won't show your latest changes.`}
+                </Alert>
+                <Divider />
+              </>
+            )}
+            <DropdownItem
+              style={{ minWidth: "400px" }}
+              href={`https://vscode.dev/github${
+                new URL(props.workspace.descriptor.origin.url).pathname.endsWith(".git")
+                  ? new URL(props.workspace.descriptor.origin.url).pathname.replace(".git", "")
+                  : new URL(props.workspace.descriptor.origin.url).pathname
+              }/tree/${props.workspace.descriptor.origin.branch}`}
+              target={"_blank"}
+              icon={<ExternalLinkAltIcon />}
+              description={`The '${props.workspace.descriptor.origin.branch}' branch will be opened.`}
+            >
+              vscode.dev
+            </DropdownItem>
+            <Divider />
+            <DropdownItem
+              href={`vscode://vscode.git/clone?url=${props.workspace.descriptor.origin.url.toString()}`}
+              target={"_blank"}
+              icon={<ExternalLinkAltIcon />}
+              description={"The default branch will be opened."}
+            >
+              VS Code Desktop
+            </DropdownItem>
+          </DropdownGroup>,
+        ]}
+      />
+    </FlexItem>
+  );
+}
diff --git a/packages/online-editor/src/editor/Toolbar/Workspace/Hooks.tsx b/packages/online-editor/src/editor/Toolbar/Workspace/Hooks.tsx
new file mode 100644
index 0000000000..581774a8c4
--- /dev/null
+++ b/packages/online-editor/src/editor/Toolbar/Workspace/Hooks.tsx
@@ -0,0 +1,154 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { useCallback, useEffect } from "react";
+import { ActiveWorkspace } from "@kie-tools-core/workspaces-git-fs/dist/model/ActiveWorkspace";
+import { useNavigationBlockersBypass, useNavigationStatus, useNavigationStatusToggle } from "../../../navigation/Hooks";
+import { useGlobalAlert } from "../../../alerts";
+import { Alert, AlertActionCloseButton, AlertActionLink } from "@patternfly/react-core/dist/js/components/Alert";
+import {
+  WorkspaceKind,
+  WorkspaceKindGitBased,
+} from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceOrigin";
+import { useOnlineI18n } from "../../../i18n";
+import { Divider } from "@patternfly/react-core/dist/js/components/Divider";
+import { PushToGitAlertActionLinks } from "../GitIntegration/PushToGitAlertActionLinks";
+import { useGitIntegration } from "../GitIntegration/GitIntegrationContextProvider";
+import { switchExpression } from "../../../switchExpression/switchExpression";
+import { GIT_ORIGIN_REMOTE_NAME } from "@kie-tools-core/workspaces-git-fs/dist/constants/GitConstants";
+import { useHistory } from "react-router";
+import { useEditorToolbarContext } from "../EditorToolbarContextProvider";
+
+export function useWorkspaceNavigationBlocker(workspace: ActiveWorkspace) {
+  const { i18n } = useOnlineI18n();
+  const history = useHistory();
+
+  const {
+    auth: { changeGitAuthSessionId, authSessionSelectFilter },
+    git: { canPushToGitRepository, pushToGitRepository },
+    gistOrSnippet: { canUpdateGistOrSnippet, updateGistOrSnippet },
+  } = useGitIntegration();
+
+  const { downloadWorkspaceZip } = useEditorToolbarContext();
+
+  const navigationStatus = useNavigationStatus();
+  const navigationStatusToggle = useNavigationStatusToggle();
+  const navigationBlockersBypass = useNavigationBlockersBypass();
+
+  const confirmNavigationAlert = useGlobalAlert<{
+    lastBlockedLocation: Location;
+  }>(
+    useCallback(
+      (_, { lastBlockedLocation }) => (
+        <Alert
+          data-testid="unsaved-alert"
+          variant="warning"
+          title={
+            workspace.descriptor.origin.kind === WorkspaceKind.LOCAL
+              ? i18n.editorPage.alerts.unsaved.titleLocal
+              : i18n.editorPage.alerts.unsaved.titleGit
+          }
+          actionClose={
+            <AlertActionCloseButton data-testid="unsaved-alert-close-button" onClose={navigationStatusToggle.unblock} />
+          }
+          actionLinks={
+            <>
+              <Divider inset={{ default: "insetMd" }} />
+              <br />
+              {(workspace.descriptor.origin.kind === WorkspaceKind.LOCAL && (
+                <AlertActionLink
+                  data-testid="unsaved-alert-save-button"
+                  onClick={() => {
+                    navigationStatusToggle.unblock();
+                    return downloadWorkspaceZip();
+                  }}
+                  style={{ fontWeight: "bold" }}
+                >
+                  {`${i18n.terms.download} '${workspace.descriptor.name}'`}
+                </AlertActionLink>
+              )) || (
+                <PushToGitAlertActionLinks
+                  changeGitAuthSessionId={changeGitAuthSessionId}
+                  workspaceDescriptor={workspace.descriptor}
+                  canPush={switchExpression(workspace.descriptor.origin.kind as WorkspaceKindGitBased, {
+                    BITBUCKET_SNIPPET: canUpdateGistOrSnippet,
+                    GITHUB_GIST: canUpdateGistOrSnippet,
+                    GIT: canPushToGitRepository,
+                  })}
+                  remoteRef={`${GIT_ORIGIN_REMOTE_NAME}/${workspace.descriptor.origin.branch}`}
+                  authSessionSelectFilter={authSessionSelectFilter}
+                  onPush={() => {
+                    navigationStatusToggle.unblock();
+                    switchExpression(workspace.descriptor.origin.kind as WorkspaceKindGitBased, {
+                      BITBUCKET_SNIPPET: updateGistOrSnippet,
+                      GITHUB_GIST: updateGistOrSnippet,
+                      GIT: pushToGitRepository,
+                    })();
+                  }}
+                />
+              )}
+              <br />
+              <br />
+              <AlertActionLink
+                data-testid="unsaved-alert-close-without-save-button"
+                onClick={() =>
+                  navigationBlockersBypass.execute(() => {
+                    history.push(lastBlockedLocation);
+                  })
+                }
+              >
+                {i18n.editorPage.alerts.unsaved.proceedAnyway}
+              </AlertActionLink>
+              <br />
+              <br />
+            </>
+          }
+        >
+          <br />
+          <p>{i18n.editorPage.alerts.unsaved.message}</p>
+        </Alert>
+      ),
+      [
+        workspace.descriptor,
+        i18n.editorPage.alerts.unsaved.titleLocal,
+        i18n.editorPage.alerts.unsaved.titleGit,
+        i18n.editorPage.alerts.unsaved.proceedAnyway,
+        i18n.editorPage.alerts.unsaved.message,
+        i18n.terms.download,
+        navigationStatusToggle,
+        changeGitAuthSessionId,
+        canUpdateGistOrSnippet,
+        canPushToGitRepository,
+        authSessionSelectFilter,
+        downloadWorkspaceZip,
+        updateGistOrSnippet,
+        pushToGitRepository,
+        navigationBlockersBypass,
+        history,
+      ]
+    )
+  );
+
+  useEffect(() => {
+    if (navigationStatus.lastBlockedLocation) {
+      confirmNavigationAlert.show({ lastBlockedLocation: navigationStatus.lastBlockedLocation });
+    } else {
+      confirmNavigationAlert.close();
+    }
+  }, [confirmNavigationAlert, navigationStatus]);
+
+  return;
+}
diff --git a/packages/online-editor/src/editor/Toolbar/Workspace/WorkspaceToolbar.tsx b/packages/online-editor/src/editor/Toolbar/Workspace/WorkspaceToolbar.tsx
new file mode 100644
index 0000000000..01dec5770b
--- /dev/null
+++ b/packages/online-editor/src/editor/Toolbar/Workspace/WorkspaceToolbar.tsx
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { useCallback, useEffect, useRef } from "react";
+import { ActiveWorkspace } from "@kie-tools-core/workspaces-git-fs/dist/model/ActiveWorkspace";
+import { Flex, FlexItem } from "@patternfly/react-core/dist/js/layouts/Flex";
+import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
+import { useHistory } from "react-router";
+import { useRoutes } from "../../../navigation/Hooks";
+import AngleLeftIcon from "@patternfly/react-icons/dist/js/icons/angle-left-icon";
+import { AuthSessionSelect } from "../../../authSessions/AuthSessionSelect";
+import { AuthProviderGroup } from "../../../authProviders/AuthProvidersApi";
+import { useGitIntegration } from "../GitIntegration/GitIntegrationContextProvider";
+import { AccountsDispatchActionKind, useAccountsDispatch } from "../../../accounts/AccountsContext";
+import { WorkspaceLabel } from "../../../workspace/components/WorkspaceLabel";
+import FolderIcon from "@patternfly/react-icons/dist/js/icons/folder-icon";
+import { Title } from "@patternfly/react-core/dist/js/components/Title";
+import { TextInput } from "@patternfly/react-core/dist/js/components/TextInput";
+import { useWorkspaces, WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+import { WorkspaceStatusIndicator } from "../../../workspace/components/WorkspaceStatusIndicator";
+import { AcceleratorIndicator } from "../Accelerators/AcceleratorIndicator";
+import { PromiseState } from "@kie-tools-core/react-hooks/dist/PromiseState";
+import { WorkspaceGitStatusType } from "@kie-tools-core/workspaces-git-fs/dist/hooks/WorkspaceHooks";
+
+type Props = {
+  workspace: ActiveWorkspace;
+  currentWorkspaceFile: WorkspaceFile;
+  workspaceGitStatusPromise: PromiseState<WorkspaceGitStatusType>;
+  onDeletedWorkspaceFile: () => void;
+};
+
+export function WorkspaceToolbar(props: Props) {
+  const history = useHistory();
+  const routes = useRoutes();
+  const workspaces = useWorkspaces();
+
+  const {
+    auth: { changeGitAuthSessionId, authSessionSelectFilter },
+  } = useGitIntegration();
+
+  const accountsDispatch = useAccountsDispatch();
+
+  const workspaceNameRef = useRef<HTMLInputElement>(null);
+
+  const resetWorkspaceName = useCallback(() => {
+    if (workspaceNameRef.current) {
+      workspaceNameRef.current.value = props.workspace.descriptor.name;
+    }
+  }, [props.workspace]);
+
+  useEffect(resetWorkspaceName, [resetWorkspaceName]);
+
+  const onRenameWorkspace = useCallback(
+    async (newName: string | undefined) => {
+      if (!newName) {
+        resetWorkspaceName();
+        return;
+      }
+
+      if (newName === props.workspace.descriptor.name) {
+        return;
+      }
+
+      await workspaces.renameWorkspace({
+        workspaceId: props.workspace.descriptor.workspaceId,
+        newName: newName.trim(),
+      });
+    },
+    [props.workspace.descriptor, workspaces, resetWorkspaceName]
+  );
+
+  const onWorkspaceNameKeyDown = useCallback(
+    (e: React.KeyboardEvent<HTMLInputElement>) => {
+      e.stopPropagation();
+      if (e.keyCode === 13 /* Enter */) {
+        e.currentTarget.blur();
+      } else if (e.keyCode === 27 /* ESC */) {
+        resetWorkspaceName();
+        e.currentTarget.blur();
+      }
+    },
+    [resetWorkspaceName]
+  );
+
+  return (
+    <Flex
+      justifyContent={{ default: "justifyContentFlexStart" }}
+      flexWrap={{ default: "nowrap" }}
+      spaceItems={{ default: "spaceItemsSm" }}
+      alignItems={{ default: "alignItemsCenter" }}
+    >
+      <FlexItem>
+        <Button
+          className={"kie-tools--masthead-hoverable"}
+          variant={ButtonVariant.plain}
+          onClick={() => history.push({ pathname: routes.home.path({}) })}
+        >
+          <AngleLeftIcon />
+        </Button>
+      </FlexItem>
+      <FlexItem>
+        <AuthSessionSelect
+          title={`Select Git authentication for '${props.workspace.descriptor.name}'...`}
+          isPlain={true}
+          authSessionId={props.workspace.descriptor.gitAuthSessionId}
+          showOnlyThisAuthProviderGroupWhenConnectingToNewAccount={AuthProviderGroup.GIT}
+          setAuthSessionId={(newAuthSessionId) => {
+            changeGitAuthSessionId(newAuthSessionId, props.workspace.descriptor.gitAuthSessionId);
+            accountsDispatch({ kind: AccountsDispatchActionKind.CLOSE });
+          }}
+          filter={authSessionSelectFilter}
+        />
+      </FlexItem>
+      <FlexItem>
+        <WorkspaceLabel descriptor={props.workspace.descriptor} />
+      </FlexItem>
+      <FlexItem>
+        <AcceleratorIndicator workspaceId={props.workspace.descriptor.workspaceId} />
+      </FlexItem>
+      <FlexItem
+        style={{ minWidth: 0, padding: "0 8px 0 8px", flexShrink: 0 }}
+        className={"kie-tools--masthead-hoverable"}
+      >
+        <FolderIcon style={{ marginRight: "8px", verticalAlign: "middle" }} />
+        <div
+          data-testid={"toolbar-title-workspace"}
+          className={"kogito--editor__toolbar-name-container"}
+          style={{ display: "inline-block", verticalAlign: "middle" }}
+        >
+          <Title
+            aria-label={"EmbeddedEditorFile name"}
+            headingLevel={"h3"}
+            size={"md"}
+            style={{
+              fontStyle: "italic",
+            }}
+          >
+            {props.workspace.descriptor.name}
+          </Title>
+          <TextInput
+            ref={workspaceNameRef}
+            type={"text"}
+            aria-label={"Edit workspace name"}
+            onKeyDown={onWorkspaceNameKeyDown}
+            className={"kogito--editor__toolbar-subtitle"}
+            onBlur={(e) => onRenameWorkspace(e.target.value)}
+            style={{ fontStyle: "italic", top: "4px", height: "calc(100% - 8px)" }}
+          />
+        </div>
+      </FlexItem>
+      <FlexItem>
+        <WorkspaceStatusIndicator
+          gitStatusProps={{
+            workspaceDescriptor: props.workspace.descriptor,
+            workspaceGitStatusPromise: props.workspaceGitStatusPromise,
+          }}
+          currentWorkspaceFile={props.currentWorkspaceFile}
+          onDeletedWorkspaceFile={props.onDeletedWorkspaceFile}
+          workspaceFiles={props.workspace.files}
+        />
+      </FlexItem>
+    </Flex>
+  );
+}
diff --git a/packages/online-editor/src/env/EnvJson.ts b/packages/online-editor/src/env/EnvJson.ts
index 2b92854ec7..4df37326a9 100644
--- a/packages/online-editor/src/env/EnvJson.ts
+++ b/packages/online-editor/src/env/EnvJson.ts
@@ -15,6 +15,7 @@
  */
 
 import { AuthProvider } from "../authProviders/AuthProvidersApi";
+import { AcceleratorConfig } from "../accelerators/AcceleratorsApi";
 
 export interface EnvJson {
   KIE_SANDBOX_EXTENDED_SERVICES_URL: string;
@@ -22,4 +23,5 @@ export interface EnvJson {
   KIE_SANDBOX_REQUIRE_CUSTOM_COMMIT_MESSAGE: boolean;
   KIE_SANDBOX_CUSTOM_COMMIT_MESSAGE_VALIDATION_SERVICE_URL: string;
   KIE_SANDBOX_AUTH_PROVIDERS: AuthProvider[];
+  KIE_SANDBOX_ACCELERATORS: AcceleratorConfig[];
 }
diff --git a/packages/online-editor/src/envelopeLocator/EditorEnvelopeLocatorFactory.ts b/packages/online-editor/src/envelopeLocator/EditorEnvelopeLocatorFactory.ts
index 91c8332fca..d278130ad8 100644
--- a/packages/online-editor/src/envelopeLocator/EditorEnvelopeLocatorFactory.ts
+++ b/packages/online-editor/src/envelopeLocator/EditorEnvelopeLocatorFactory.ts
@@ -20,24 +20,82 @@ import {
   EnvelopeMapping,
 } from "@kie-tools-core/editor/dist/api/EditorEnvelopeLocator";
 
+const REGEX = {
+  supported: /(\.bpmn|\.bpmn2|\.dmn|\.pmml|\.scesim)$/i,
+  dmn: /^.*\.dmn$/i,
+  bpmn: /^.*\.(bpmn|bpmn2)$/i,
+  scesim: /^.*\.scesim$/i,
+  pmml: /^.*\.pmml$/i,
+};
+
+export const GLOB_PATTERN = {
+  all: "**/*",
+  dmn: "**/*.dmn",
+  bpmn: "**/*.bpmn?(2)",
+  scesim: "**/*.scesim",
+  pmml: "**/*.pmml",
+};
+
+export enum FileTypes {
+  DMN = "dmn",
+  BPMN = "bpmn",
+  BPMN2 = "bpmn2",
+  SCESIM = "scesim",
+  PMML = "pmml",
+}
+
+export const supportedFileExtensionArray = [
+  FileTypes.DMN,
+  FileTypes.BPMN,
+  FileTypes.BPMN2,
+  FileTypes.SCESIM,
+  FileTypes.PMML,
+];
+
+export type SupportedFileExtensions = typeof supportedFileExtensionArray[number];
+
+export function isDecision(path: string): boolean {
+  return REGEX.dmn.test(path);
+}
+
+export function isWorkflow(path: string): boolean {
+  return REGEX.bpmn.test(path);
+}
+
+export function isTestScenario(path: string): boolean {
+  return REGEX.scesim.test(path);
+}
+
+export function isScorecard(path: string): boolean {
+  return REGEX.pmml.test(path);
+}
+
+export function isModel(path: string): boolean {
+  return isDecision(path) || isWorkflow(path) || isScorecard(path);
+}
+
+export function isEditable(path: string): boolean {
+  return isModel(path) || isTestScenario(path);
+}
+
 export class EditorEnvelopeLocatorFactory {
   public create(args: { targetOrigin: string }) {
     return new EditorEnvelopeLocator(args.targetOrigin, [
       new EnvelopeMapping({
-        type: "bpmn",
-        filePathGlob: "**/*.bpmn?(2)",
+        type: FileTypes.BPMN,
+        filePathGlob: GLOB_PATTERN.bpmn,
         resourcesPathPrefix: "gwt-editors/bpmn",
         envelopeContent: { type: EnvelopeContentType.PATH, path: "bpmn-envelope.html" },
       }),
       new EnvelopeMapping({
-        type: "dmn",
-        filePathGlob: "**/*.dmn",
+        type: FileTypes.DMN,
+        filePathGlob: GLOB_PATTERN.dmn,
         resourcesPathPrefix: "gwt-editors/dmn",
         envelopeContent: { type: EnvelopeContentType.PATH, path: "dmn-envelope.html" },
       }),
       new EnvelopeMapping({
-        type: "pmml",
-        filePathGlob: "**/*.pmml",
+        type: FileTypes.PMML,
+        filePathGlob: GLOB_PATTERN.pmml,
         resourcesPathPrefix: "",
         envelopeContent: { type: EnvelopeContentType.PATH, path: "pmml-envelope.html" },
       }),
diff --git a/packages/online-editor/src/filesList/FileDataList.tsx b/packages/online-editor/src/filesList/FileDataList.tsx
index e1b4152f94..e5fd724a91 100644
--- a/packages/online-editor/src/filesList/FileDataList.tsx
+++ b/packages/online-editor/src/filesList/FileDataList.tsx
@@ -32,6 +32,10 @@ import { useRoutes } from "../navigation/Hooks";
 import { TaskIcon } from "@patternfly/react-icons/dist/js/icons/task-icon";
 import { WorkspaceDescriptor } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceDescriptor";
 import { WorkspaceDescriptorDates } from "../workspace/components/WorkspaceDescriptorDates";
+import { EyeIcon } from "@patternfly/react-icons/dist/js/icons/eye-icon";
+import { GitStatusIndicator } from "../workspace/components/WorkspaceStatusIndicator";
+import { GitStatusIndicatorActions, GitStatusProps } from "../workspace/components/GitStatusIndicatorActions";
+import { switchExpression } from "../switchExpression/switchExpression";
 
 const FILE_DATA_LIST_HEIGHTS = {
   atRoot: 55 + 24,
@@ -42,31 +46,73 @@ export function getFileDataListHeight(file: WorkspaceFile) {
   return file.relativePath.indexOf("/") >= 0 ? FILE_DATA_LIST_HEIGHTS.atSubDir : FILE_DATA_LIST_HEIGHTS.atRoot;
 }
 
-export function FileListItem(props: { file: WorkspaceFile; isEditable: boolean }) {
+export enum FileListItemDisplayMode {
+  enabled = "enabled",
+  readonly = "readonly",
+  deleted = "deleted",
+}
+
+export function FileListItem(props: {
+  file: WorkspaceFile;
+  displayMode: FileListItemDisplayMode;
+  isCurrentWorkspaceFile?: boolean;
+  onDeletedWorkspaceFile?: () => void;
+  gitStatusProps?: GitStatusProps;
+}) {
+  const [keepGitStatusActionsDisplayed, setKeepGitStatusActionsDisplayed] = React.useState(false);
   const fileDirPath = props.file.relativeDirPath.split("/").join(" > ");
-  const fileName = props.isEditable ? props.file.nameWithoutExtension : props.file.name;
+  const fileName = [FileListItemDisplayMode.enabled, FileListItemDisplayMode.deleted].includes(props.displayMode)
+    ? props.file.nameWithoutExtension
+    : props.file.name;
   return (
     <>
-      <Flex flexWrap={{ default: "nowrap" }}>
+      <Flex
+        flexWrap={{ default: "nowrap" }}
+        onClick={(e) => {
+          if (props.displayMode !== FileListItemDisplayMode.enabled) {
+            // this prevents the FileSwitcher from closing on click.
+            e.stopPropagation();
+            e.preventDefault();
+          }
+        }}
+      >
+        {props.isCurrentWorkspaceFile && (
+          <FlexItem align={{ default: "alignLeft" }}>
+            <EyeIcon title="Currently selected file." />
+          </FlexItem>
+        )}
         <FlexItem style={{ minWidth: 0 /* This is to make the flex parent not overflow horizontally */ }}>
-          <Tooltip distance={5} position={"top-start"} content={fileName}>
+          <Tooltip
+            distance={5}
+            position={"top-start"}
+            content={fileName + (props.displayMode === FileListItemDisplayMode.deleted ? " (Deleted)" : "")}
+          >
             <TextContent>
-              <Text
-                component={TextVariants.p}
-                style={{
-                  whiteSpace: "nowrap",
-                  overflow: "hidden",
-                  textOverflow: "ellipsis",
-                }}
-              >
-                {fileName}
-              </Text>
+              <Text component={TextVariants.p}>{fileName}</Text>
             </TextContent>
           </Tooltip>
         </FlexItem>
         <FlexItem>
           <FileLabel extension={props.file.extension} />
         </FlexItem>
+        {props.gitStatusProps && (
+          <FlexItem align={{ default: "alignRight" }}>
+            <GitStatusIndicator
+              gitStatusProps={props.gitStatusProps}
+              workspaceFile={props.file}
+              isHoverable={!keepGitStatusActionsDisplayed}
+            >
+              <GitStatusIndicatorActions
+                gitStatusProps={props.gitStatusProps}
+                workspaceFile={props.file}
+                currentWorkspaceFile={props.isCurrentWorkspaceFile ? props.file : undefined}
+                onDeletedWorkspaceFile={props.onDeletedWorkspaceFile}
+                isOpen={keepGitStatusActionsDisplayed}
+                setOpen={setKeepGitStatusActionsDisplayed}
+              />
+            </GitStatusIndicator>
+          </FlexItem>
+        )}
       </Flex>
       <TextContent>
         <Text
@@ -86,13 +132,25 @@ export function FileListItem(props: { file: WorkspaceFile; isEditable: boolean }
   );
 }
 
-export function FileDataListItem(props: { file: WorkspaceFile; isEditable: boolean }) {
+export function FileDataListItem(props: {
+  file: WorkspaceFile;
+  displayMode: FileListItemDisplayMode;
+  isCurrentWorkspaceFile?: boolean;
+  onDeletedWorkspaceFile?: () => void;
+  gitStatusProps?: GitStatusProps;
+}) {
   return (
-    <DataListItemRow>
+    <DataListItemRow disabled={props.displayMode !== FileListItemDisplayMode.enabled}>
       <DataListItemCells
         dataListCells={[
-          <DataListCell key="link" isFilled={false}>
-            <FileListItem file={props.file} isEditable={props.isEditable} />
+          <DataListCell key="link" isFilled={true} autoFocus={props.isCurrentWorkspaceFile}>
+            <FileListItem
+              gitStatusProps={props.gitStatusProps}
+              file={props.file}
+              displayMode={props.displayMode}
+              isCurrentWorkspaceFile={props.isCurrentWorkspaceFile}
+              onDeletedWorkspaceFile={props.onDeletedWorkspaceFile}
+            />
           </DataListCell>,
         ]}
       />
@@ -100,16 +158,37 @@ export function FileDataListItem(props: { file: WorkspaceFile; isEditable: boole
   );
 }
 
-export function FileDataList(props: { file: WorkspaceFile; isEditable: boolean; style?: React.CSSProperties }) {
+export function FileDataList(props: {
+  file: WorkspaceFile;
+  displayMode: FileListItemDisplayMode;
+  style?: React.CSSProperties;
+  isCurrentWorkspaceFile?: boolean;
+  onDeletedWorkspaceFile?: () => void;
+  gitStatusProps?: GitStatusProps;
+}) {
+  const fileDataListItem = (
+    <FileDataListItem
+      gitStatusProps={props.gitStatusProps}
+      key={props.file.relativePath}
+      file={props.file}
+      displayMode={props.displayMode}
+      isCurrentWorkspaceFile={props.isCurrentWorkspaceFile}
+      onDeletedWorkspaceFile={props.onDeletedWorkspaceFile}
+    />
+  );
   return (
-    <DataList aria-label="file-data-list" style={props.style}>
+    <DataList
+      aria-label="file-data-list"
+      style={props.style}
+      className={switchExpression(props.displayMode, {
+        enabled: "kie-tools--file-list-item-enabled",
+        deleted: "kie-tools--file-list-item-deleted",
+        readonly: "kie-tools--file-list-item-readonly",
+      })}
+    >
       <DataListItem style={{ border: 0 }}>
-        {(!props.isEditable && (
-          <FileDataListItem key={props.file.relativePath} file={props.file} isEditable={props.isEditable} />
-        )) || (
-          <FileLink file={props.file}>
-            <FileDataListItem file={props.file} isEditable={props.isEditable} />
-          </FileLink>
+        {(props.displayMode !== FileListItemDisplayMode.enabled && fileDataListItem) || (
+          <FileLink file={props.file}>{fileDataListItem}</FileLink>
         )}
       </DataListItem>
     </DataList>
@@ -133,9 +212,13 @@ export function FileLink(props: React.PropsWithChildren<{ file: WorkspaceFile; s
   );
 }
 
-export function SingleFileWorkspaceDataList(props: { workspaceDescriptor: WorkspaceDescriptor; file: WorkspaceFile }) {
+export function SingleFileWorkspaceDataList(props: {
+  workspaceDescriptor: WorkspaceDescriptor;
+  file: WorkspaceFile;
+  style?: React.CSSProperties;
+}) {
   return (
-    <DataList aria-label="file-data-list">
+    <DataList aria-label="file-data-list" style={props.style}>
       <DataListItem style={{ border: 0 }}>
         <FileLink file={props.file}>
           <DataListItemRow>
diff --git a/packages/online-editor/src/home/HomePage.tsx b/packages/online-editor/src/home/HomePage.tsx
index c10e8f328e..3e6a07446d 100644
--- a/packages/online-editor/src/home/HomePage.tsx
+++ b/packages/online-editor/src/home/HomePage.tsx
@@ -69,19 +69,26 @@ import { UploadCard } from "./UploadCard";
 import { ImportFromUrlCard } from "../importFromUrl/ImportFromUrlHomePageCard";
 import { WorkspaceKind } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceOrigin";
 import { PlusIcon } from "@patternfly/react-icons/dist/js/icons/plus-icon";
-import { NewFileDropdownMenu } from "../editor/NewFileDropdownMenu";
+import { NewFileDropdownMenu } from "../editor/Toolbar/NewFileDropdownMenu";
 import { Spinner } from "@patternfly/react-core/dist/js/components/Spinner";
 import { useRoutes } from "../navigation/Hooks";
 import { ErrorBoundary } from "../reactExt/ErrorBoundary";
 import { WorkspaceDescriptor } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceDescriptor";
 import { VariableSizeList } from "react-window";
 import AutoSizer from "react-virtualized-auto-sizer";
-import { FileDataList, FileLink, getFileDataListHeight, SingleFileWorkspaceListItem } from "../filesList/FileDataList";
+import {
+  FileDataList,
+  FileLink,
+  FileListItemDisplayMode,
+  getFileDataListHeight,
+  SingleFileWorkspaceListItem,
+} from "../filesList/FileDataList";
 import { WorkspaceListItem } from "../workspace/components/WorkspaceListItem";
 import { WorkspaceLoadingCard } from "../workspace/components/WorkspaceLoadingCard";
 import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
 import { ResponsiveDropdown } from "../ResponsiveDropdown/ResponsiveDropdown";
 import { ResponsiveDropdownToggle } from "../ResponsiveDropdown/ResponsiveDropdownToggle";
+import { listDeletedFiles } from "../workspace/components/WorkspaceStatusIndicator";
 
 export function HomePage() {
   const routes = useRoutes();
@@ -117,10 +124,6 @@ export function HomePage() {
     document.title = "KIE Sandbox :: Home";
   }, []);
 
-  const buildInfo = useMemo(() => {
-    return process.env["WEBPACK_REPLACE__buildInfo"];
-  }, []);
-
   return (
     <OnlineEditorPage>
       <PageSection
@@ -243,11 +246,6 @@ export function HomePage() {
           }}
         />
       </PageSection>
-      {buildInfo && (
-        <div className={"kie-tools--build-info"}>
-          <Label>{buildInfo}</Label>
-        </div>
-      )}
     </OnlineEditorPage>
   );
 }
@@ -569,7 +567,9 @@ export function WorkspacesListDrawerPanelContent(props: { workspaceId: string |
                   {({ index, style }) => (
                     <FileDataList
                       file={arrayWithModelsThenOtherFiles[index]}
-                      isEditable={index < models.length}
+                      displayMode={
+                        index < models.length ? FileListItemDisplayMode.enabled : FileListItemDisplayMode.readonly
+                      }
                       style={style}
                     />
                   )}
diff --git a/packages/online-editor/src/i18n/OnlineI18n.ts b/packages/online-editor/src/i18n/OnlineI18n.ts
index 8a4bbc2ef3..a6eec372c0 100644
--- a/packages/online-editor/src/i18n/OnlineI18n.ts
+++ b/packages/online-editor/src/i18n/OnlineI18n.ts
@@ -18,6 +18,7 @@ import { ReferenceDictionary, Wrapped } from "@kie-tools-core/i18n/dist/core";
 import { CommonI18n } from "@kie-tools/i18n-common-dictionary";
 import { DmnUnitablesI18n } from "@kie-tools/unitables-dmn/dist/i18n";
 import { GistEnabledAuthProviderType, SupportedGitAuthProviders } from "../authProviders/AuthProvidersApi";
+import { SupportedActions } from "../workspace/components/GitStatusIndicatorActions";
 
 interface OnlineDictionary extends ReferenceDictionary {
   editorPage: {
@@ -64,6 +65,25 @@ interface OnlineDictionary extends ReferenceDictionary {
     share: string;
     embed: string;
   };
+  accelerators: {
+    commitMessage: (acceleratorName: string) => string;
+    loadingAlert: (acceleratorName: string) => string;
+    successAlert: (acceleratorName: string) => string;
+    failAlert: (acceleratorName: string) => string;
+    acceleratorDescription: string;
+    acceleratorDetails: string;
+    dmnFilesMove: string;
+    dmnFilesLocation: string;
+    pmmlFilesMove: string;
+    pmmlFilesLocation: string;
+    bpmnFilesMove: string;
+    bpmnFilesLocation: string;
+    otherFilesMove: string;
+    otherFilesLocation: string;
+    applyAccelerator: string;
+    appliedAt: string;
+    applyDisclaimer: string;
+  };
   devDeployments: {
     common: {
       deployYourModel: string;
@@ -516,6 +536,14 @@ interface OnlineDictionary extends ReferenceDictionary {
       organizations: string;
     };
   };
+  gitStatusIndicatorActions: {
+    [key in SupportedActions]: {
+      title: string;
+      warning: string;
+      description: string;
+      confirmButtonText: string;
+    };
+  };
 }
 
 export interface OnlineI18n extends OnlineDictionary, CommonI18n {}
diff --git a/packages/online-editor/src/i18n/locales/en.ts b/packages/online-editor/src/i18n/locales/en.ts
index 3df8360971..a20ad37aa4 100644
--- a/packages/online-editor/src/i18n/locales/en.ts
+++ b/packages/online-editor/src/i18n/locales/en.ts
@@ -18,7 +18,6 @@ import { OnlineI18n } from "..";
 import { en as en_common } from "@kie-tools/i18n-common-dictionary";
 import { en as en_unitables } from "@kie-tools/unitables/dist/i18n/locales/en";
 import { wrapped } from "@kie-tools-core/i18n/dist/core";
-import { names } from "@kie-tools/i18n-common-dictionary/dist/names";
 
 export const en: OnlineI18n = {
   ...en_common,
@@ -66,6 +65,28 @@ export const en: OnlineI18n = {
     share: "Share",
     embed: "Embed",
   },
+  accelerators: {
+    commitMessage: (acceleratorName: string) =>
+      `${en_common.names.businessModeler.online}: Applying ${acceleratorName} Accelerator`,
+    loadingAlert: (acceleratorName: string) => `Applying ${acceleratorName} Accelerator...`,
+    successAlert: (acceleratorName: string) => `Successfully applied ${acceleratorName} Accelerator`,
+    failAlert: (acceleratorName: string) => `Failed to apply ${acceleratorName} Accelerator`,
+    acceleratorDescription:
+      "An Accelerator is a template. Applying it will move your current files according to the Accelerator specifications and create a new commit for it.",
+    acceleratorDetails: "This Accelerator is hosted at",
+    dmnFilesMove: "Decisions (.dmn) will be moved to:",
+    dmnFilesLocation: "Decisions (.dmn) were moved to:",
+    pmmlFilesMove: "Score cards (.pmml) will moved to:",
+    pmmlFilesLocation: "Score cards (.pmml) were moved to:",
+    bpmnFilesMove: "Workflows (.bpmn, .bpmn2) will be moved to:",
+    bpmnFilesLocation: "Workflows (.bpmn, .bpmn2) were moved to:",
+    otherFilesMove: "Other files will be moved to:",
+    otherFilesLocation: "Other files were moved to:",
+    applyAccelerator: "Apply Accelerator",
+    appliedAt: "This Accelerator was applied at:",
+    applyDisclaimer:
+      "This action is permanent. Any changes made after applying an Accelerator may result in your files being in different directories.",
+  },
   devDeployments: {
     common: {
       deployYourModel: "Deploy",
@@ -626,4 +647,18 @@ export const en: OnlineI18n = {
       organizations: "GitHub organizations",
     },
   },
+  gitStatusIndicatorActions: {
+    revert: {
+      title: "Revert",
+      warning: "This action is permanent",
+      description: "Are you sure you want to revert local changes to:",
+      confirmButtonText: "Yes, revert permanently",
+    },
+    revertAll: {
+      title: "Revert all changes",
+      warning: "This action is permanent",
+      description: "Are you sure? The following files will be reverted to the last commit:",
+      confirmButtonText: "Yes, revert permanently",
+    },
+  },
 };
diff --git a/packages/online-editor/src/importFromUrl/ImportFromUrlHomePageCard.tsx b/packages/online-editor/src/importFromUrl/ImportFromUrlHomePageCard.tsx
index 28d42795c1..18fa3e4016 100644
--- a/packages/online-editor/src/importFromUrl/ImportFromUrlHomePageCard.tsx
+++ b/packages/online-editor/src/importFromUrl/ImportFromUrlHomePageCard.tsx
@@ -14,14 +14,13 @@
  * limitations under the License.
  */
 
-import { FlexItem } from "@patternfly/react-core";
 import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
 import { Card, CardBody, CardFooter, CardTitle } from "@patternfly/react-core/dist/js/components/Card";
 import { Form, FormGroup } from "@patternfly/react-core/dist/js/components/Form";
 import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
 import { TextInput } from "@patternfly/react-core/dist/js/components/TextInput";
 import { ValidatedOptions } from "@patternfly/react-core/dist/js/helpers/constants";
-import { Flex } from "@patternfly/react-core/dist/js/layouts/Flex";
+import { Flex, FlexItem } from "@patternfly/react-core/dist/js/layouts/Flex";
 import { CodeIcon } from "@patternfly/react-icons/dist/js/icons/code-icon";
 import { ExclamationCircleIcon } from "@patternfly/react-icons/dist/js/icons/exclamation-circle-icon";
 import * as React from "react";
diff --git a/packages/online-editor/src/pageTemplate/OnlineEditorPage.tsx b/packages/online-editor/src/pageTemplate/OnlineEditorPage.tsx
index 3c6f5d2753..1a98f1afa4 100644
--- a/packages/online-editor/src/pageTemplate/OnlineEditorPage.tsx
+++ b/packages/online-editor/src/pageTemplate/OnlineEditorPage.tsx
@@ -27,7 +27,8 @@ import { DevDeploymentsDropdown } from "../devDeployments/DevDeploymentsDropdown
 import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
 import { AccountsIcon } from "../accounts/AccountsIcon";
 import { AboutButton } from "../aboutModal/AboutButton";
-import { MastheadContent, Toolbar, ToolbarContent } from "@patternfly/react-core";
+import { MastheadContent } from "@patternfly/react-core/dist/js/components/Masthead";
+import { Toolbar, ToolbarContent } from "@patternfly/react-core/dist/js/components/Toolbar";
 import { ToolbarGroup, ToolbarItem } from "@patternfly/react-core/dist/js/components/Toolbar";
 
 export function OnlineEditorPage(props: { children?: React.ReactNode }) {
diff --git a/packages/online-editor/src/workspace/components/GitStatusIndicatorActions.tsx b/packages/online-editor/src/workspace/components/GitStatusIndicatorActions.tsx
new file mode 100644
index 0000000000..818ea1ee7d
--- /dev/null
+++ b/packages/online-editor/src/workspace/components/GitStatusIndicatorActions.tsx
@@ -0,0 +1,479 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { PromiseState } from "@kie-tools-core/react-hooks/dist/PromiseState";
+import { useWorkspaces, WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+import { WorkspaceGitStatusType } from "@kie-tools-core/workspaces-git-fs/dist/hooks/WorkspaceHooks";
+import {
+  FileModificationStatus,
+  UnstagedModifiedFilesStatusEntryType,
+} from "@kie-tools-core/workspaces-git-fs/dist/services/GitService";
+import { WorkspaceDescriptor } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceDescriptor";
+
+import {
+  Alert,
+  AlertActionCloseButton,
+  AlertActionLink,
+  AlertVariant,
+} from "@patternfly/react-core/dist/js/components/Alert";
+import {
+  Dropdown,
+  DropdownItem,
+  DropdownPosition,
+  KebabToggle,
+} from "@patternfly/react-core/dist/js/components/Dropdown";
+import { Button } from "@patternfly/react-core/dist/js/components/Button";
+import { Flex, FlexItem } from "@patternfly/react-core/dist/js/layouts/Flex";
+import { Popover, PopoverPosition } from "@patternfly/react-core/dist/js/components/Popover";
+import { List, ListItem } from "@patternfly/react-core/dist/js/components/List";
+import { UndoAltIcon } from "@patternfly/react-icons/dist/js/icons/undo-alt-icon";
+import * as React from "react";
+import { useOnlineI18n } from "../../i18n";
+import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
+import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
+import { listDeletedFiles } from "./WorkspaceStatusIndicator";
+import { FileLabel } from "../../filesList/FileLabel";
+import CaretDownIcon from "@patternfly/react-icons/dist/js/icons/caret-down-icon";
+import { switchExpression } from "../../switchExpression/switchExpression";
+
+export type GitStatusProps = {
+  workspaceDescriptor: WorkspaceDescriptor;
+  workspaceGitStatusPromise: PromiseState<WorkspaceGitStatusType>;
+};
+
+export enum SupportedActions {
+  revert = "revert",
+  revertAll = "revertAll",
+}
+
+type GitStatusIndicatorActionType = {
+  id: SupportedActions;
+  titleText: string;
+  warningText: string;
+  titleIcon: JSX.Element;
+  description: JSX.Element;
+  alertVariant: AlertVariant;
+  confirmButtonText: string;
+  onConfirm: () => void;
+};
+interface GitStatusIndicatorActionsPropsBase {
+  gitStatusProps: GitStatusProps;
+  isOpen: boolean;
+  setOpen: (isOpen: boolean) => void;
+  currentWorkspaceFile?: WorkspaceFile;
+  onDeletedWorkspaceFile?: () => void;
+}
+
+interface GitStatusIndicatorActionsSingleFileProps extends GitStatusIndicatorActionsPropsBase {
+  workspaceFile: WorkspaceFile;
+}
+interface GitStatusIndicatorActionsMultipleFilesProps extends GitStatusIndicatorActionsPropsBase {
+  workspaceFiles: WorkspaceFile[];
+}
+const isSingleFile = (
+  maybeSingleFile: GitStatusIndicatorActionsSingleFileProps | GitStatusIndicatorActionsMultipleFilesProps
+): maybeSingleFile is GitStatusIndicatorActionsSingleFileProps => {
+  return "workspaceFile" in maybeSingleFile;
+};
+
+export const GitStatusIndicatorActions = (
+  props: GitStatusIndicatorActionsSingleFileProps | GitStatusIndicatorActionsMultipleFilesProps
+) => {
+  const { i18n } = useOnlineI18n();
+  const workspaces = useWorkspaces();
+
+  const renderFile = React.useCallback(
+    (file: WorkspaceFile) => (
+      <Flex direction={{ default: "row" }} flexWrap={{ default: "nowrap" }} spacer={{ default: "spacerMd" }}>
+        <FlexItem style={{ minWidth: 0 /* This is to make the flex parent not overflow horizontally */ }}>
+          <Tooltip distance={5} position={"top-start"} content={file.nameWithoutExtension}>
+            <TextContent>
+              <Text component={TextVariants.p}>{file.nameWithoutExtension}</Text>
+            </TextContent>
+          </Tooltip>
+        </FlexItem>
+        <FlexItem>
+          <FileLabel extension={file.extension} />
+        </FlexItem>
+        <FlexItem>
+          {switchExpression(
+            props.gitStatusProps.workspaceGitStatusPromise.data?.unstagedModifiedFilesStatus.find(
+              (entry) => entry.path === file.relativePath
+            )?.status,
+            {
+              added: (
+                <Tooltip content={"Added"} position={"right"}>
+                  <small>
+                    <i>A</i>
+                  </small>
+                </Tooltip>
+              ),
+              deleted: (
+                <Tooltip content={"Deleted"} position={"right"}>
+                  <small>
+                    <i>D</i>
+                  </small>
+                </Tooltip>
+              ),
+              modified: (
+                <Tooltip content={"Modified"} position={"right"}>
+                  <small>
+                    <i>M</i>
+                  </small>
+                </Tooltip>
+              ),
+              default: <></>,
+            }
+          )}
+        </FlexItem>
+      </Flex>
+    ),
+    [props.gitStatusProps.workspaceGitStatusPromise.data?.unstagedModifiedFilesStatus]
+  );
+
+  const workspaceFilesRendered = React.useMemo(() => {
+    return isSingleFile(props) ? (
+      <b>{renderFile(props.workspaceFile)}</b>
+    ) : (
+      <b>
+        <List>
+          {[...props.workspaceFiles, ...listDeletedFiles(props.gitStatusProps)]
+            .filter((file) =>
+              props.gitStatusProps.workspaceGitStatusPromise.data?.unstagedModifiedFilesStatus.some(
+                (entry) => entry.path === file.relativePath
+              )
+            )
+            .map((file, index) => (
+              <ListItem key={index}>{renderFile(file)}</ListItem>
+            ))}
+        </List>
+      </b>
+    );
+  }, [props, renderFile]);
+
+  const filterAcceptedStageStatuses = React.useCallback(
+    (acceptedValues: FileModificationStatus[]) => {
+      return (stageStatusEntry: UnstagedModifiedFilesStatusEntryType) => {
+        return (
+          acceptedValues.includes(stageStatusEntry.status) &&
+          (isSingleFile(props)
+            ? [props.workspaceFile.relativePath]
+            : props.gitStatusProps.workspaceGitStatusPromise!.data!.unstagedModifiedFilesStatus.map(({ path }) => path)
+          ).includes(stageStatusEntry.path)
+        );
+      };
+    },
+    [props]
+  );
+
+  const actionRevert = React.useCallback((): GitStatusIndicatorActionType | undefined => {
+    const doRevert = async (filepaths: string[]) => {
+      await workspaces.checkoutFilesFromLocalHead({
+        workspaceId: props.gitStatusProps.workspaceDescriptor.workspaceId,
+        ref: props.gitStatusProps.workspaceDescriptor.origin.branch,
+        filepaths,
+      });
+      if (
+        props.currentWorkspaceFile &&
+        !(await workspaces.existsFile({
+          workspaceId: props.gitStatusProps.workspaceDescriptor.workspaceId,
+          relativePath: props.currentWorkspaceFile.relativePath,
+        }))
+      ) {
+        props.onDeletedWorkspaceFile?.();
+      }
+    };
+    const maybeWorkspaceGitStatus = props.gitStatusProps.workspaceGitStatusPromise?.data;
+
+    if (!maybeWorkspaceGitStatus) {
+      return;
+    }
+    const id = isSingleFile(props) ? SupportedActions.revert : SupportedActions.revertAll;
+
+    const filepaths = maybeWorkspaceGitStatus.unstagedModifiedFilesStatus
+      .filter(
+        filterAcceptedStageStatuses([
+          FileModificationStatus.deleted,
+          FileModificationStatus.modified,
+          FileModificationStatus.added,
+        ])
+      )
+      .map(({ path }) => path);
+
+    if (!filepaths.length) {
+      return;
+    }
+    return {
+      onConfirm: async () => await doRevert(filepaths),
+      id,
+      titleText: i18n.gitStatusIndicatorActions[id].title,
+      titleIcon: <UndoAltIcon />,
+      alertVariant: AlertVariant.warning,
+      warningText: i18n.gitStatusIndicatorActions[id].warning,
+      description: (
+        <>
+          <span>{i18n.gitStatusIndicatorActions[id].description}</span>
+          <br />
+          <br />
+          {workspaceFilesRendered}
+          <br />
+        </>
+      ),
+      confirmButtonText: i18n.gitStatusIndicatorActions[id].confirmButtonText,
+    };
+  }, [i18n.gitStatusIndicatorActions, props, filterAcceptedStageStatuses, workspaceFilesRendered, workspaces]);
+
+  const actions: GitStatusIndicatorActionType[] = React.useMemo(() => {
+    const maybeActions = [
+      // list all actions here, which (based on internal state) could be undefined
+      actionRevert(),
+    ];
+
+    const result: GitStatusIndicatorActionType[] = [];
+
+    maybeActions.forEach((action) => {
+      if (action !== undefined) {
+        result.push(action);
+      }
+    });
+
+    return result;
+  }, [actionRevert]);
+
+  return isSingleFile(props) ? (
+    <MultipleActionsButtonsWithPopover actions={actions} isOpen={props.isOpen} setOpen={props.setOpen} />
+  ) : (
+    <MultipleActionsPopoverWithDropdown
+      title={
+        <TextContent>
+          <Text component="h3">Local Changes</Text>
+        </TextContent>
+      }
+      description={
+        <Flex direction={{ default: "column" }}>
+          <FlexItem>
+            <TextContent>
+              <Text component="p">
+                {`There are local changes to the following files in`}
+                <i>{`'${props.gitStatusProps.workspaceDescriptor.name}'`}</i>
+              </Text>
+            </TextContent>
+          </FlexItem>
+          {workspaceFilesRendered}
+        </Flex>
+      }
+      actions={actions}
+      isOpen={props.isOpen}
+      setOpen={props.setOpen}
+    />
+  );
+};
+
+const MultipleActionsButtonsWithPopover = (props: {
+  actions: GitStatusIndicatorActionType[];
+  isOpen: boolean;
+  setOpen: (value: boolean) => void;
+}) => {
+  const [openedPopoverId, setOpenedPopoverId] = React.useState<string>();
+  return (
+    <Flex spaceItems={{ default: "spaceItemsXs" }}>
+      {props.actions.map((action) => (
+        <SingleActionPopover
+          key={action.id}
+          action={action}
+          isOpen={props.isOpen && openedPopoverId === action.id}
+          setOpen={(isOpen: boolean) => {
+            setOpenedPopoverId(isOpen ? action.id : undefined);
+            props.setOpen(isOpen);
+          }}
+        />
+      ))}
+    </Flex>
+  );
+};
+
+const MultipleActionsPopoverWithDropdown = (props: {
+  actions: GitStatusIndicatorActionType[];
+  title: React.ReactNode;
+  description: JSX.Element;
+  isOpen: boolean;
+  setOpen: (isOpen: boolean) => void;
+}) => {
+  const [selectedActionId, setSelectedActionId] = React.useState<string>();
+  const [isDropdownOpen, setDropdownOpen] = React.useState<boolean>(false);
+
+  const selectedAction = React.useMemo(() => {
+    return props.actions.find((action) => action.id === selectedActionId);
+  }, [props.actions, selectedActionId]);
+
+  return (
+    <Popover
+      id={"popover-with-actions-dropdown"}
+      className={selectedActionId !== undefined ? " kie-tools--git-status-indicator__popover-no-padding" : ""} // noPadding prop not working nice for the ActionsAlert
+      position={PopoverPosition.bottom}
+      showClose={false}
+      isVisible={props.isOpen}
+      shouldOpen={() => props.setOpen(true)}
+      shouldClose={() => {
... 57738 lines suppressed ...


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 01/27: KOGITO-8147: Refactor the app bar and menu according to UX redesign (#1335)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit 7dc1f828cb66a3d8fef9aa31a796fc9ebfee1d97
Author: Bai Xiaofeng <bx...@gmail.com>
AuthorDate: Fri Jan 20 22:20:40 2023 +0800

    KOGITO-8147: Refactor the app bar and menu according to UX redesign (#1335)
    
    * KOGITO-8147 Refactor the app bar and menu according to UX redesign
    
    * refactor to function style
    
    * remove new home page
    
    * remove old home page
    
    * Fixed merge issues
    
    * Fix CI error: Missing "key" prop for element in iterator
    
    * Fix memory issue
    
    * Skip test:it until the UI changes are final
    
    Co-authored-by: fantonangeli <fa...@gmail.com>
    Co-authored-by: Guilherme Caponetto <63...@users.noreply.github.com>
---
 packages/serverless-logic-web-tools/package.json   |   3 +-
 .../src/editor/EditorPage.tsx                      |  99 ++--
 .../src/homepage/breadcrumb/HomepageBreadcrumb.tsx |  36 ++
 .../overView}/ImportFromUrlCard.tsx                |  19 +-
 .../src/homepage/overView/NewModelCard.tsx         |  51 ++
 .../homepage/overView/NewServerlessModelCard.tsx   |  66 +++
 .../src/homepage/overView/Overview.tsx             | 122 +++++
 .../src/{home => homepage/overView}/UploadCard.tsx |   7 +-
 .../src/homepage/pageTemplate/OnlineEditorPage.tsx | 142 +++++
 .../routes/HomePageRoutes.tsx}                     |  44 +-
 .../sampleCatalog}/SampleCard.tsx                  |  70 +--
 .../sampleCatalog/SampleCatalog.tsx}               |  19 +-
 .../src/homepage/sampleCatalog/Types.ts            |  65 +++
 .../serverlessModels/ServerlessModels.tsx}         | 593 ++++++++-------------
 .../src/homepage/styles.css                        |  11 +
 .../src/homepage/uiNav/HomePageNav.tsx             |  43 ++
 .../src/navigation/RoutesSwitch.tsx                |  66 +--
 .../src/pageTemplate/OnlineEditorPage.tsx          |  98 ----
 .../components/NewWorkspaceFromUrlPage.tsx         |  31 +-
 .../components/NewWorkspaceWithEmptyFilePage.tsx   |  25 +-
 .../static/images/kogito_log_workbranch.svg        |  52 ++
 21 files changed, 989 insertions(+), 673 deletions(-)

diff --git a/packages/serverless-logic-web-tools/package.json b/packages/serverless-logic-web-tools/package.json
index 788bf348f1..a183ee802b 100644
--- a/packages/serverless-logic-web-tools/package.json
+++ b/packages/serverless-logic-web-tools/package.json
@@ -16,9 +16,10 @@
   "main": "dist/index.js",
   "scripts": {
     "build:dev": "rimraf dist && webpack --env dev",
-    "build:prod": "pnpm lint && pnpm test && rimraf dist && webpack && pnpm test:it",
+    "build:prod": "pnpm lint && pnpm test && rimraf dist && webpack",
     "cy:open": "cypress open --project it-tests --config baseUrl=$(build-env serverlessLogicWebTools.dev.cypressUrl)",
     "cy:run": "cypress run --headed -b chrome --project it-tests --config baseUrl=$(build-env serverlessLogicWebTools.dev.cypressUrl)",
+    "format": "prettier --write  './src/**/*.{tsx,ts,js}'",
     "lint": "run-script-if --bool \"$(build-env linters.run)\" --then \"kie-tools--eslint ./src\"",
     "start": "webpack serve --host 0.0.0.0 --env dev",
     "test": "run-script-if --ignore-errors \"$(build-env tests.ignoreFailures)\" --bool \"$(build-env tests.run)\" --then \"jest --silent --verbose --passWithNoTests\"",
diff --git a/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx b/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx
index df45a9672c..1380f6a45d 100644
--- a/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx
@@ -34,7 +34,6 @@ import { useEditorEnvelopeLocator } from "../envelopeLocator/EditorEnvelopeLocat
 import { isEditable, isServerlessWorkflow } from "../extension";
 import { useAppI18n } from "../i18n";
 import { useRoutes } from "../navigation/Hooks";
-import { OnlineEditorPage } from "../pageTemplate/OnlineEditorPage";
 import { useQueryParams } from "../queryParams/QueryParamsContext";
 import { useCancelableEffect } from "@kie-tools-core/react-hooks/dist/useCancelableEffect";
 import { useController } from "@kie-tools-core/react-hooks/dist/useController";
@@ -389,56 +388,54 @@ export function EditorPage(props: Props) {
   );
 
   return (
-    <OnlineEditorPage>
-      <PromiseStateWrapper
-        promise={workspaceFilePromise}
-        pending={<LoadingSpinner />}
-        rejected={(errors) => <EditorPageErrorPage errors={errors} path={props.fileRelativePath} />}
-        resolved={(file) => (
-          <>
-            <Page>
-              <EditorToolbar
-                workspaceFile={file.workspaceFile}
-                editor={editor}
-                alerts={alerts}
-                alertsRef={alertsRef}
-                editorPageDock={editorPageDock}
-              />
-              <Divider />
-              <EditorPageDockDrawer
-                ref={editorPageDockRef}
-                isEditorReady={editor?.isReady}
-                workspaceFile={file.workspaceFile}
-                onNotificationClick={onNotificationClick}
-              >
-                <PageSection hasOverflowScroll={true} padding={{ default: "noPadding" }}>
-                  <div style={{ height: "100%" }}>
-                    {!isEditorReady && <LoadingSpinner />}
-                    <div style={{ display: isEditorReady ? "inline" : "none" }}>
-                      {embeddedEditorFile && (
-                        <EmbeddedEditor
-                          /* FIXME: By providing a different `key` everytime, we avoid calling `setContent` twice on the same Editor.
-                           * This is by design, and after setContent supports multiple calls on the same instance, we can remove that.
-                           */
-                          key={uniqueFileId}
-                          ref={editorRef}
-                          file={embeddedEditorFile}
-                          editorEnvelopeLocator={editorEnvelopeLocator}
-                          channelType={ChannelType.ONLINE_MULTI_FILE}
-                          locale={locale}
-                          customChannelApiImpl={apiImpl}
-                          stateControl={stateControl}
-                          isReady={isReady}
-                        />
-                      )}
-                    </div>
+    <PromiseStateWrapper
+      promise={workspaceFilePromise}
+      pending={<LoadingSpinner />}
+      rejected={(errors) => <EditorPageErrorPage errors={errors} path={props.fileRelativePath} />}
+      resolved={(file) => (
+        <>
+          <Page>
+            <EditorToolbar
+              workspaceFile={file.workspaceFile}
+              editor={editor}
+              alerts={alerts}
+              alertsRef={alertsRef}
+              editorPageDock={editorPageDock}
+            />
+            <Divider />
+            <EditorPageDockDrawer
+              ref={editorPageDockRef}
+              isEditorReady={editor?.isReady}
+              workspaceFile={file.workspaceFile}
+              onNotificationClick={onNotificationClick}
+            >
+              <PageSection hasOverflowScroll={true} padding={{ default: "noPadding" }}>
+                <div style={{ height: "100%" }}>
+                  {!isEditorReady && <LoadingSpinner />}
+                  <div style={{ display: isEditorReady ? "inline" : "none" }}>
+                    {embeddedEditorFile && (
+                      <EmbeddedEditor
+                        /* FIXME: By providing a different `key` everytime, we avoid calling `setContent` twice on the same Editor.
+                         * This is by design, and after setContent supports multiple calls on the same instance, we can remove that.
+                         */
+                        key={uniqueFileId}
+                        ref={editorRef}
+                        file={embeddedEditorFile}
+                        editorEnvelopeLocator={editorEnvelopeLocator}
+                        channelType={ChannelType.ONLINE_MULTI_FILE}
+                        locale={locale}
+                        customChannelApiImpl={apiImpl}
+                        stateControl={stateControl}
+                        isReady={isReady}
+                      />
+                    )}
                   </div>
-                </PageSection>
-              </EditorPageDockDrawer>
-            </Page>
-          </>
-        )}
-      />
-    </OnlineEditorPage>
+                </div>
+              </PageSection>
+            </EditorPageDockDrawer>
+          </Page>
+        </>
+      )}
+    />
   );
 }
diff --git a/packages/serverless-logic-web-tools/src/homepage/breadcrumb/HomepageBreadcrumb.tsx b/packages/serverless-logic-web-tools/src/homepage/breadcrumb/HomepageBreadcrumb.tsx
new file mode 100644
index 0000000000..cd0b478378
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/homepage/breadcrumb/HomepageBreadcrumb.tsx
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { Breadcrumb, BreadcrumbItem } from "@patternfly/react-core";
+
+export function HomepageBreadcrumb(props: { paths: string[] }) {
+  const getPath = (path: string): string => {
+    return "/" + path;
+  };
+  return (
+    <Breadcrumb>
+      {props.paths.map((path) => (
+        <BreadcrumbItem key={path} to={getPath(path)}>
+          {path === "/" ? { path } : "Home"}
+        </BreadcrumbItem>
+      ))}
+      ;
+    </Breadcrumb>
+  );
+}
+
+export default HomepageBreadcrumb;
diff --git a/packages/serverless-logic-web-tools/src/home/ImportFromUrlCard.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/ImportFromUrlCard.tsx
similarity index 84%
rename from packages/serverless-logic-web-tools/src/home/ImportFromUrlCard.tsx
rename to packages/serverless-logic-web-tools/src/homepage/overView/ImportFromUrlCard.tsx
index ec542735de..f644bea22f 100644
--- a/packages/serverless-logic-web-tools/src/home/ImportFromUrlCard.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/overView/ImportFromUrlCard.tsx
@@ -1,11 +1,11 @@
 /*
- * Copyright 2021 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2022 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *        http://www.apache.org/licenses/LICENSE-2.0
+ *       http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,17 +14,18 @@
  * limitations under the License.
  */
 
+import { SupportedFileExtensions } from "../../extension";
+import * as React from "react";
+import { useRoutes } from "../../navigation/Hooks";
+import { useHistory } from "react-router";
+import { useCallback, useMemo, useState } from "react";
+import { UrlType, useImportableUrl } from "../../workspace/hooks/ImportableUrlHooks";
 import { Card, CardBody, CardFooter, CardTitle } from "@patternfly/react-core/dist/js/components/Card";
 import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
 import { CodeIcon } from "@patternfly/react-icons/dist/js/icons/code-icon";
+import { ImportFromUrlForm } from "../../workspace/components/ImportFromUrlForm";
 import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
-import * as React from "react";
-import { useCallback, useMemo, useState } from "react";
-import { useRoutes } from "../navigation/Hooks";
-import { useHistory } from "react-router";
-import { ImportFromUrlForm } from "../workspace/components/ImportFromUrlForm";
-import { useEditorEnvelopeLocator } from "../envelopeLocator/EditorEnvelopeLocatorContext";
-import { UrlType, useImportableUrl } from "../workspace/hooks/ImportableUrlHooks";
+import { useEditorEnvelopeLocator } from "../../envelopeLocator/EditorEnvelopeLocatorContext";
 
 export function ImportFromUrlCard() {
   const routes = useRoutes();
diff --git a/packages/serverless-logic-web-tools/src/homepage/overView/NewModelCard.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/NewModelCard.tsx
new file mode 100644
index 0000000000..ab39d58ade
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/homepage/overView/NewModelCard.tsx
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { SupportedFileExtensions } from "../../extension";
+import * as React from "react";
+import { useRoutes } from "../../navigation/Hooks";
+import { Card, CardBody, CardFooter, CardTitle } from "@patternfly/react-core/dist/js/components/Card";
+import { FileLabel } from "../../workspace/components/FileLabel";
+import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
+import { Grid } from "@patternfly/react-core/dist/js/layouts/Grid";
+import { Link } from "react-router-dom";
+import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
+
+export function NewModelCard(props: { title: string; extension: SupportedFileExtensions; description: string }) {
+  const routes = useRoutes();
+
+  return (
+    <Card isFullHeight={true} isPlain={true} isLarge={true}>
+      <CardTitle>
+        <FileLabel style={{ fontSize: "0.6em" }} extension={props.extension} />
+      </CardTitle>
+      <CardBody>
+        <TextContent>
+          <Text component={TextVariants.p}>{props.description}</Text>
+        </TextContent>
+      </CardBody>
+      <CardFooter>
+        <Grid>
+          <Link to={{ pathname: routes.newModel.path({ extension: props.extension }) }}>
+            <Button variant={ButtonVariant.secondary} ouiaId={`new-${props.extension}-button`}>
+              New {props.title}
+            </Button>
+          </Link>
+        </Grid>
+      </CardFooter>
+    </Card>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/homepage/overView/NewServerlessModelCard.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/NewServerlessModelCard.tsx
new file mode 100644
index 0000000000..406c3825fe
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/homepage/overView/NewServerlessModelCard.tsx
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { SupportedFileExtensions } from "../../extension";
+import { useRoutes } from "../../navigation/Hooks";
+import { Card, CardBody, CardFooter, CardTitle } from "@patternfly/react-core/dist/js/components/Card";
+import { FileLabel } from "../../workspace/components/FileLabel";
+import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
+import { Grid, GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
+import { Link } from "react-router-dom";
+import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
+
+export function NewServerlessModelCard(props: {
+  title: string;
+  jsonExtension: SupportedFileExtensions;
+  yamlExtension: SupportedFileExtensions;
+  description: string;
+}) {
+  const routes = useRoutes();
+
+  return (
+    <Card isFullHeight={true} isPlain={true} isLarge={true}>
+      <CardTitle>
+        <FileLabel style={{ fontSize: "0.6em" }} extension={props.jsonExtension} />
+      </CardTitle>
+      <CardBody>
+        <TextContent>
+          <Text component={TextVariants.p}>{props.description}</Text>
+        </TextContent>
+      </CardBody>
+      <CardFooter>
+        <Grid hasGutter>
+          <GridItem span={12}>New {props.title}</GridItem>
+          <GridItem span={6}>
+            <Link to={{ pathname: routes.newModel.path({ extension: props.jsonExtension }) }}>
+              <Button variant={ButtonVariant.secondary} ouiaId={`new-${props.jsonExtension}-button`}>
+                JSON
+              </Button>
+            </Link>
+          </GridItem>
+          <GridItem span={6}>
+            <Link to={{ pathname: routes.newModel.path({ extension: props.yamlExtension }) }}>
+              <Button variant={ButtonVariant.secondary} ouiaId={`new-${props.yamlExtension}-button`}>
+                YAML
+              </Button>
+            </Link>
+          </GridItem>
+        </Grid>
+      </CardFooter>
+    </Card>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx
new file mode 100644
index 0000000000..2cdb5eda27
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { FileTypes } from "../../extension";
+import { Grid, GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
+import { Gallery } from "@patternfly/react-core/dist/js/layouts/Gallery";
+import { PageSection } from "@patternfly/react-core/dist/js/components/Page";
+import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
+import { Divider } from "@patternfly/react-core/dist/js/components/Divider";
+import { NewServerlessModelCard } from "./NewServerlessModelCard";
+import { Card } from "@patternfly/react-core";
+import { ImportFromUrlCard } from "./ImportFromUrlCard";
+import { UploadCard } from "./UploadCard";
+import { useRoutes } from "../../navigation/Hooks";
+import { useHistory } from "react-router";
+import { useQueryParam, useQueryParams } from "../../queryParams/QueryParamsContext";
+import { QueryParams } from "../../navigation/Routes";
+import { useCallback } from "react";
+import { NewModelCard } from "./NewModelCard";
+
+export function Overview() {
+  const routes = useRoutes();
+  const history = useHistory();
+  const expandedWorkspaceId = useQueryParam(QueryParams.EXPAND);
+  const queryParams = useQueryParams();
+
+  const closeExpandedWorkspace = useCallback(() => {
+    history.replace({
+      pathname: routes.home.path({}),
+      search: queryParams.without(QueryParams.EXPAND).toString(),
+    });
+  }, [history, routes, queryParams]);
+
+  const expandWorkspace = useCallback(
+    (workspaceId: string) => {
+      const expand = workspaceId !== expandedWorkspaceId ? workspaceId : undefined;
+      if (!expand) {
+        closeExpandedWorkspace();
+        return;
+      }
+
+      history.replace({
+        pathname: routes.home.path({}),
+        search: routes.home.queryString({ expand }),
+      });
+    },
+    [closeExpandedWorkspace, history, routes, expandedWorkspaceId]
+  );
+  return (
+    <Grid hasGutter>
+      <GridItem sm={12} xl={6}>
+        <PageSection variant={"light"} isFilled={true} style={{ height: "100%" }}>
+          <Card className="Dev-ui__card-size">
+            <TextContent>
+              <Text component={TextVariants.h1}>Create</Text>
+            </TextContent>
+            <br />
+            <Divider inset={{ default: "insetXl" }} />
+            <Gallery
+              hasGutter={true}
+              // 16px is the "Gutter" width.
+              minWidths={{ sm: "calc(33% - 16px)", default: "100%" }}
+              style={{ height: "calc(100% - 32px)" }}
+            >
+              <NewServerlessModelCard
+                title={"Workflow"}
+                jsonExtension={FileTypes.SW_JSON}
+                yamlExtension={FileTypes.SW_YAML}
+                description={"Serverless Workflow files are used to define orchestration logic for services."}
+              />
+              <NewServerlessModelCard
+                title={"Decision"}
+                jsonExtension={FileTypes.YARD_JSON}
+                yamlExtension={FileTypes.YARD_YAML}
+                description={"Serverless Decision files are used to define decision logic for services."}
+              />
+              <NewModelCard
+                title={"Dashboard"}
+                extension={FileTypes.DASH_YAML}
+                description={
+                  "Dashboard files are used to define data visualization from data extracted from applications."
+                }
+              />
+            </Gallery>
+          </Card>
+        </PageSection>
+      </GridItem>
+      <GridItem sm={12} xl={6}>
+        <PageSection variant={"light"} isFilled={true} style={{ height: "100%" }}>
+          <TextContent>
+            <Text component={TextVariants.h1}>Import</Text>
+          </TextContent>
+          <br />
+          <Divider inset={{ default: "insetXl" }} />
+          <Gallery
+            hasGutter={true}
+            // 16px is the "Gutter" width.
+            minWidths={{ sm: "calc(50% - 16px)", default: "100%" }}
+            style={{ height: "calc(100% - 32px)" }}
+          >
+            <ImportFromUrlCard />
+            <UploadCard expandWorkspace={expandWorkspace} />
+          </Gallery>
+        </PageSection>
+      </GridItem>
+    </Grid>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/home/UploadCard.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/UploadCard.tsx
similarity index 98%
rename from packages/serverless-logic-web-tools/src/home/UploadCard.tsx
rename to packages/serverless-logic-web-tools/src/homepage/overView/UploadCard.tsx
index 04a781ba32..aabae9ea32 100644
--- a/packages/serverless-logic-web-tools/src/home/UploadCard.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/overView/UploadCard.tsx
@@ -1,11 +1,11 @@
 /*
- * Copyright 2021 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2022 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *        http://www.apache.org/licenses/LICENSE-2.0
+ *       http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -22,7 +22,7 @@ import { useDropzone } from "react-dropzone";
 import { Bullseye } from "@patternfly/react-core/dist/js/layouts/Bullseye";
 import { Card, CardBody, CardFooter, CardTitle } from "@patternfly/react-core/dist/js/components/Card";
 import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
-import { useRoutes } from "../navigation/Hooks";
+import { useRoutes } from "../../navigation/Hooks";
 import { useHistory } from "react-router";
 import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
 import { Spinner } from "@patternfly/react-core/dist/js/components/Spinner";
@@ -37,6 +37,7 @@ enum UploadType {
   FOLDER,
   DND,
 }
+
 export function UploadCard(props: { expandWorkspace: (workspaceId: string) => void }) {
   const routes = useRoutes();
   const history = useHistory();
diff --git a/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx b/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
new file mode 100644
index 0000000000..6f13f1ae49
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2021 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { useMemo } from "react";
+import {
+  Masthead,
+  MastheadBrand,
+  MastheadMain,
+  MastheadToggle,
+  Button,
+  Brand,
+  MastheadContent,
+  ToolbarContent,
+  Toolbar,
+  ToolbarGroup,
+  ToolbarItem,
+  PageSidebar,
+  SkipToContent,
+} from "@patternfly/react-core";
+import { Page } from "@patternfly/react-core/dist/js/components/Page";
+import { useHistory } from "react-router";
+import { KieSandboxExtendedServicesIcon } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesIcon";
+import { useRoutes } from "../../navigation/Hooks";
+import { OpenshiftDeploymentsDropdown } from "../../openshift/dropdown/OpenshiftDeploymentsDropdown";
+import { SettingsButton } from "../../settings/SettingsButton";
+import { HomePageNav } from "../uiNav/HomePageNav";
+import { useLocation } from "react-router-dom";
+import { useState } from "react";
+import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
+import { ExclamationIcon, BarsIcon } from "@patternfly/react-icons/dist/js/icons";
+
+export function OnlineEditorPage(props: { children?: React.ReactNode }) {
+  const history = useHistory();
+  const routes = useRoutes();
+  const [isNavOpen, setIsNavOpen] = useState(true);
+  const navToggle = () => {
+    setIsNavOpen(!isNavOpen);
+  };
+
+  const isChromiumBased = useMemo(() => {
+    const agent = window.navigator.userAgent.toLowerCase();
+    return agent.indexOf("edg") > -1 || agent.indexOf("chrome") > -1;
+  }, []);
+
+  const headerToolbar = (
+    <Toolbar id="toolbar" isFullHeight isStatic>
+      <ToolbarContent>
+        <ToolbarGroup
+          variant="icon-button-group"
+          alignment={{ default: "alignRight" }}
+          spacer={{ default: "spacerNone", md: "spacerMd" }}
+        >
+          <ToolbarItem>
+            <OpenshiftDeploymentsDropdown />
+          </ToolbarItem>
+          <ToolbarItem>
+            <SettingsButton />
+          </ToolbarItem>
+          <ToolbarItem>
+            <KieSandboxExtendedServicesIcon />
+          </ToolbarItem>
+          {!isChromiumBased && (
+            <ToolbarItem>
+              <Tooltip
+                className="kogito--editor__light-tooltip"
+                key={"not-chromium"}
+                content={"To get the best experience, please prefer using Chromium based browsers."}
+                flipBehavior={["left"]}
+                distance={20}
+              >
+                <ExclamationIcon
+                  data-testid="not-chromium-icon"
+                  className="kogito--editor__kie-sandbox-extended-services-dropdown-icon-outdated static-opacity"
+                  id="kie-sandbox-extended-services-not-chromium-icon"
+                  style={{ cursor: "pointer" }}
+                />
+              </Tooltip>
+            </ToolbarItem>
+          )}
+        </ToolbarGroup>
+      </ToolbarContent>
+    </Toolbar>
+  );
+
+  const masthead = (
+    <Masthead>
+      <MastheadToggle>
+        <Button
+          id="nav-toggle"
+          variant="plain"
+          aria-label="Global NAV"
+          onClick={navToggle}
+          aria-expanded={isNavOpen}
+          aria-controls=""
+        >
+          <BarsIcon />
+        </Button>
+      </MastheadToggle>
+      <MastheadMain>
+        <MastheadBrand
+          onClick={() => history.push({ pathname: routes.home.path({}) })}
+          style={{ textDecoration: "none" }}
+        >
+          <Brand
+            className="kogito-tools-common--brand"
+            src="images/kogito_log_workbranch.svg"
+            alt="kogito_logo_white.png"
+          ></Brand>
+        </MastheadBrand>
+      </MastheadMain>
+      <MastheadContent>{headerToolbar}</MastheadContent>
+    </Masthead>
+  );
+  const location = useLocation();
+
+  const sidebar = (
+    <PageSidebar nav={<HomePageNav pathname={location.pathname}></HomePageNav>} isNavOpen={isNavOpen} theme="dark" />
+  );
+  const mainContainerId = "main-content-page-layout-tertiary-nav";
+
+  const pageSkipToContent = <SkipToContent href={`#${mainContainerId}`}>Skip to content</SkipToContent>;
+
+  return (
+    <Page header={masthead} sidebar={sidebar} skipToContent={pageSkipToContent} mainContainerId={mainContainerId}>
+      {props.children}
+    </Page>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx b/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx
similarity index 56%
copy from packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx
copy to packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx
index 52e97bc03b..8ddd74cdf8 100644
--- a/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx
@@ -5,7 +5,7 @@
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ *       http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,21 +14,22 @@
  * limitations under the License.
  */
 
-import * as React from "react";
-import { useMemo } from "react";
-import { Route, Switch } from "react-router-dom";
-import { EditorPage } from "../editor/EditorPage";
-import { supportedFileExtensionArray } from "../extension";
-import { HomePage } from "../home/HomePage";
-import { NewWorkspaceFromUrlPage } from "../workspace/components/NewWorkspaceFromUrlPage";
-import { NewWorkspaceWithEmptyFilePage } from "../workspace/components/NewWorkspaceWithEmptyFilePage";
-import { useRoutes } from "./Hooks";
-import { NoMatchPage } from "./NoMatchPage";
+import React, { useMemo } from "react";
+import { Switch } from "react-router";
+import { Overview } from "../overView/Overview";
+import { ServerlessModels } from "../serverlessModels/ServerlessModels";
+import { Route } from "react-router-dom";
+import { SampleCatalog } from "../sampleCatalog/SampleCatalog";
+import { useRoutes } from "../../navigation/Hooks";
+import { supportedFileExtensionArray } from "../../extension";
+import { NewWorkspaceWithEmptyFilePage } from "../../workspace/components/NewWorkspaceWithEmptyFilePage";
+import { NewWorkspaceFromUrlPage } from "../../workspace/components/NewWorkspaceFromUrlPage";
+import { EditorPage } from "../../editor/EditorPage";
+import { NoMatchPage } from "../../navigation/NoMatchPage";
 
-export function RoutesSwitch() {
+export function HomePageRoutes() {
   const routes = useRoutes();
   const supportedExtensions = useMemo(() => supportedFileExtensionArray.join("|"), []);
-
   return (
     <Switch>
       <Route path={routes.newModel.path({ extension: `:extension(${supportedExtensions})` })}>
@@ -53,9 +54,22 @@ export function RoutesSwitch() {
           />
         )}
       </Route>
-      <Route exact={true} path={routes.home.path({})}>
-        <HomePage />
+      <Route path="/" exact>
+        <Overview />
+      </Route>
+      <Route path="/ServerlessModels">
+        <ServerlessModels />
       </Route>
+      <Route path="/SampleCatalog">
+        <SampleCatalog />
+      </Route>
+      <Route
+        path="/Documentation"
+        component={() => {
+          window.open("https://kiegroup.github.io/kogito-docs/serverlessworkflow/latest/index.html");
+          return null;
+        }}
+      />
       <Route component={NoMatchPage} />
     </Switch>
   );
diff --git a/packages/serverless-logic-web-tools/src/home/SampleCard.tsx b/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/SampleCard.tsx
similarity index 61%
rename from packages/serverless-logic-web-tools/src/home/SampleCard.tsx
rename to packages/serverless-logic-web-tools/src/homepage/sampleCatalog/SampleCard.tsx
index d69e1e2f52..689412102c 100644
--- a/packages/serverless-logic-web-tools/src/home/SampleCard.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/SampleCard.tsx
@@ -1,60 +1,30 @@
+/*
+ * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 import * as React from "react";
 import { useMemo } from "react";
 import { Card, CardTitle, CardFooter, CardBody } from "@patternfly/react-core/dist/js/components/Card";
 import { Grid, GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
 import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
-import { useRoutes } from "../navigation/Hooks";
+import { useRoutes } from "../../navigation/Hooks";
 import { Link } from "react-router-dom";
 import { Text } from "@patternfly/react-core/dist/js/components/Text";
-import { Label, LabelProps } from "@patternfly/react-core/dist/js/components/Label";
-import { FolderIcon, FileIcon, MonitoringIcon } from "@patternfly/react-icons/dist/js/icons";
-import { labelColors } from "../workspace/components/FileLabel";
-import { FileTypes } from "../extension";
-
-export enum SampleType {
-  SW_YML = "sw.yml",
-  SW_YAML = "sw.yaml",
-  SW_JSON = "sw.json",
-  SW_PROJECT = "sw.project",
-  DASH_YML = "dash.yml",
-}
-
-export type Sample = {
-  name: string;
-  fileName: string;
-  svg: React.FunctionComponent<React.SVGProps<SVGSVGElement>>;
-  description: string;
-  repoUrl?: string;
-  type: SampleType;
-};
-
-const tagMap: Record<SampleType, { label: string; icon: React.ComponentClass; color: LabelProps["color"] }> = {
-  [SampleType.SW_YML]: {
-    label: labelColors[SampleType.SW_YML].label,
-    icon: FileIcon,
-    color: labelColors[SampleType.SW_YML].color,
-  },
-  [SampleType.SW_YAML]: {
-    label: labelColors[SampleType.SW_YAML].label,
-    icon: FileIcon,
-    color: labelColors[SampleType.SW_YAML].color,
-  },
-  [SampleType.SW_JSON]: {
-    label: labelColors[SampleType.SW_JSON].label,
-    icon: FileIcon,
-    color: labelColors[SampleType.SW_JSON].color,
-  },
-  [SampleType.SW_PROJECT]: {
-    label: "Serverless Project",
-    icon: FolderIcon,
-    color: "orange",
-  },
-  [SampleType.DASH_YML]: {
-    label: labelColors[SampleType.DASH_YML].label,
-    icon: MonitoringIcon,
-    color: labelColors[SampleType.DASH_YML].color,
-  },
-};
+import { Label } from "@patternfly/react-core/dist/js/components/Label";
+import { FileTypes } from "../../extension";
+import { Sample, tagMap } from "./Types";
 
 export function SampleCard({ sample }: { sample: Sample }) {
   const routes = useRoutes();
diff --git a/packages/serverless-logic-web-tools/src/home/Showcase.tsx b/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/SampleCatalog.tsx
similarity index 83%
rename from packages/serverless-logic-web-tools/src/home/Showcase.tsx
rename to packages/serverless-logic-web-tools/src/homepage/sampleCatalog/SampleCatalog.tsx
index 4c3a2d1e1c..b26bc2c997 100644
--- a/packages/serverless-logic-web-tools/src/home/Showcase.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/SampleCatalog.tsx
@@ -16,16 +16,17 @@
 
 import * as React from "react";
 import { TextContent, Text } from "@patternfly/react-core/dist/js/components/Text";
-import { Sample, SampleCard, SampleType } from "./SampleCard";
-import { ReactComponent as GreetingsSvg } from "../../static/samples/greetings/greetings.svg";
-import { ReactComponent as GreetingsKafkaSvg } from "../../static/samples/greetings-kafka/greetings-kafka.svg";
-import { ReactComponent as ProductsDashboardSvg } from "../../static/samples/products-dashboard/products-dashboard.svg";
-import { ReactComponent as SwfReportSvg } from "../../static/samples/swf-report/swf-report.svg";
-import { ReactComponent as KitchensinkSvg } from "../../static/samples/kitchensink/kitchensink.svg";
-import { ReactComponent as CompensationSvg } from "../../static/samples/compensation/compensation.svg";
+import { Sample, SampleType } from "./Types";
+import { ReactComponent as GreetingsSvg } from "../../../static/samples/greetings/greetings.svg";
+import { ReactComponent as GreetingsKafkaSvg } from "../../../static/samples/greetings-kafka/greetings-kafka.svg";
+import { ReactComponent as ProductsDashboardSvg } from "../../../static/samples/products-dashboard/products-dashboard.svg";
+import { ReactComponent as SwfReportSvg } from "../../../static/samples/swf-report/swf-report.svg";
+import { ReactComponent as KitchensinkSvg } from "../../../static/samples/kitchensink/kitchensink.svg";
+import { ReactComponent as CompensationSvg } from "../../../static/samples/compensation/compensation.svg";
 import { Gallery } from "@patternfly/react-core/dist/js/layouts/Gallery";
+import { SampleCard } from "./SampleCard";
 
-export const samples: Array<Sample> = [
+const samples: Array<Sample> = [
   {
     name: "Greetings",
     fileName: "greetings",
@@ -72,7 +73,7 @@ export const samples: Array<Sample> = [
   },
 ];
 
-export function Showcase() {
+export function SampleCatalog() {
   return (
     <>
       <TextContent>
diff --git a/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/Types.ts b/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/Types.ts
new file mode 100644
index 0000000000..037ec8e5e3
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/Types.ts
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { LabelProps } from "@patternfly/react-core/dist/js/components/Label";
+import { labelColors } from "../../workspace/components/FileLabel";
+import { FileIcon, FolderIcon, MonitoringIcon } from "@patternfly/react-icons/dist/js/icons";
+
+export enum SampleType {
+  SW_YML = "sw.yml",
+  SW_YAML = "sw.yaml",
+  SW_JSON = "sw.json",
+  SW_PROJECT = "sw.project",
+  DASH_YML = "dash.yml",
+}
+
+export type Sample = {
+  name: string;
+  fileName: string;
+  svg: React.FunctionComponent<React.SVGProps<SVGSVGElement>>;
+  description: string;
+  repoUrl?: string;
+  type: SampleType;
+};
+
+export const tagMap: Record<SampleType, { label: string; icon: React.ComponentClass; color: LabelProps["color"] }> = {
+  [SampleType.SW_YML]: {
+    label: labelColors[SampleType.SW_YML].label,
+    icon: FileIcon,
+    color: labelColors[SampleType.SW_YML].color,
+  },
+  [SampleType.SW_YAML]: {
+    label: labelColors[SampleType.SW_YAML].label,
+    icon: FileIcon,
+    color: labelColors[SampleType.SW_YAML].color,
+  },
+  [SampleType.SW_JSON]: {
+    label: labelColors[SampleType.SW_JSON].label,
+    icon: FileIcon,
+    color: labelColors[SampleType.SW_JSON].color,
+  },
+  [SampleType.SW_PROJECT]: {
+    label: "Serverless Project",
+    icon: FolderIcon,
+    color: "orange",
+  },
+  [SampleType.DASH_YML]: {
+    label: labelColors[SampleType.DASH_YML].label,
+    icon: MonitoringIcon,
+    color: labelColors[SampleType.DASH_YML].color,
+  },
+};
diff --git a/packages/serverless-logic-web-tools/src/home/HomePage.tsx b/packages/serverless-logic-web-tools/src/homepage/serverlessModels/ServerlessModels.tsx
similarity index 64%
rename from packages/serverless-logic-web-tools/src/home/HomePage.tsx
rename to packages/serverless-logic-web-tools/src/homepage/serverlessModels/ServerlessModels.tsx
index 4945dfe46d..a2289c29c9 100644
--- a/packages/serverless-logic-web-tools/src/home/HomePage.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/serverlessModels/ServerlessModels.tsx
@@ -1,11 +1,11 @@
 /*
- * Copyright 2021 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2022 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *        http://www.apache.org/licenses/LICENSE-2.0
+ *       http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -15,40 +15,28 @@
  */
 
 import * as React from "react";
-import { useCallback, useEffect, useMemo, useState } from "react";
-import { PageSection } from "@patternfly/react-core/dist/js/components/Page";
-import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
-import { Title } from "@patternfly/react-core/dist/js/components/Title";
-import { Label } from "@patternfly/react-core/dist/js/components/Label";
-import { useHistory } from "react-router";
-import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
+import { PromiseStateWrapper } from "@kie-tools-core/react-hooks/dist/PromiseState";
+import { useController } from "@kie-tools-core/react-hooks/dist/useController";
+import { useWorkspaces, WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+import { useWorkspacePromise } from "@kie-tools-core/workspaces-git-fs/dist/hooks/WorkspaceHooks";
+import { useWorkspaceDescriptorsPromise } from "@kie-tools-core/workspaces-git-fs/dist/hooks/WorkspacesHooks";
+import { WorkspaceDescriptor } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceDescriptor";
+import { WorkspaceKind } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceOrigin";
 import {
   Card,
   CardActions,
   CardBody,
-  CardFooter,
   CardHeader,
   CardHeaderMain,
   CardTitle,
 } from "@patternfly/react-core/dist/js/components/Card";
-import { ExpandableSection } from "@patternfly/react-core/dist/js/components/ExpandableSection";
-import { Flex, FlexItem } from "@patternfly/react-core/dist/js/layouts/Flex";
-import { Stack, StackItem } from "@patternfly/react-core/dist/js/layouts/Stack";
-import { Grid, GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
-import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
-import { CubesIcon } from "@patternfly/react-icons/dist/js/icons/cubes-icon";
-import { useWorkspaces, WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
-import { OnlineEditorPage } from "../pageTemplate/OnlineEditorPage";
-import { useWorkspaceDescriptorsPromise } from "@kie-tools-core/workspaces-git-fs/dist/hooks/WorkspacesHooks";
-import { useWorkspacePromise } from "@kie-tools-core/workspaces-git-fs/dist/hooks/WorkspaceHooks";
-import { FolderIcon } from "@patternfly/react-icons/dist/js/icons/folder-icon";
-import { TaskIcon } from "@patternfly/react-icons/dist/js/icons/task-icon";
-import { ExclamationTriangleIcon } from "@patternfly/react-icons/dist/js/icons/exclamation-triangle-icon";
-import { FileLabel } from "../workspace/components/FileLabel";
-import { PromiseStateWrapper } from "@kie-tools-core/react-hooks/dist/PromiseState";
-import { Skeleton } from "@patternfly/react-core/dist/js/components/Skeleton";
-import { Gallery } from "@patternfly/react-core/dist/js/layouts/Gallery";
-import { Divider } from "@patternfly/react-core/dist/js/components/Divider";
+import {
+  DataList,
+  DataListCell,
+  DataListItem,
+  DataListItemCells,
+  DataListItemRow,
+} from "@patternfly/react-core/dist/js/components/DataList";
 import {
   Drawer,
   DrawerActions,
@@ -60,37 +48,37 @@ import {
   DrawerPanelContent,
   DrawerSection,
 } from "@patternfly/react-core/dist/js/components/Drawer";
-import { Link } from "react-router-dom";
-import { DeleteDropdownWithConfirmation } from "../editor/DeleteDropdownWithConfirmation";
-import { useQueryParam, useQueryParams } from "../queryParams/QueryParamsContext";
-import { QueryParams } from "../navigation/Routes";
-import { Bullseye } from "@patternfly/react-core/dist/js/layouts/Bullseye";
-import { RelativeDate } from "../dates/RelativeDate";
-import {
-  DataList,
-  DataListCell,
-  DataListItem,
-  DataListItemCells,
-  DataListItemRow,
-} from "@patternfly/react-core/dist/js/components/DataList";
-import { WorkspaceLabel } from "../workspace/components/WorkspaceLabel";
-import { UploadCard } from "./UploadCard";
-import { ImportFromUrlCard } from "./ImportFromUrlCard";
-import { WorkspaceKind } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceOrigin";
 import { Dropdown, DropdownToggle } from "@patternfly/react-core/dist/js/components/Dropdown";
-import { PlusIcon } from "@patternfly/react-icons/dist/js/icons/plus-icon";
-import { NewFileDropdownMenu } from "../editor/NewFileDropdownMenu";
-import { Alerts, AlertsController } from "../alerts/Alerts";
-import { useController } from "@kie-tools-core/react-hooks/dist/useController";
+import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
+import { ExpandableSection } from "@patternfly/react-core/dist/js/components/ExpandableSection";
+import { Skeleton } from "@patternfly/react-core/dist/js/components/Skeleton";
 import { Spinner } from "@patternfly/react-core/dist/js/components/Spinner";
-import { useRoutes } from "../navigation/Hooks";
-import { ErrorBoundary } from "../reactExt/ErrorBoundary";
-import { WorkspaceDescriptor } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceDescriptor";
-import { Showcase } from "./Showcase";
-import { FileTypes, splitFiles, SupportedFileExtensions } from "../extension";
-import { APP_NAME } from "../AppConstants";
+import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
+import { Title } from "@patternfly/react-core/dist/js/components/Title";
+import { Bullseye } from "@patternfly/react-core/dist/js/layouts/Bullseye";
+import { Flex, FlexItem } from "@patternfly/react-core/dist/js/layouts/Flex";
+import { Stack, StackItem } from "@patternfly/react-core/dist/js/layouts/Stack";
+import { CubesIcon } from "@patternfly/react-icons/dist/js/icons/cubes-icon";
+import { ExclamationTriangleIcon } from "@patternfly/react-icons/dist/js/icons/exclamation-triangle-icon";
+import { FolderIcon } from "@patternfly/react-icons/dist/js/icons/folder-icon";
+import { PlusIcon } from "@patternfly/react-icons/dist/js/icons/plus-icon";
+import { TaskIcon } from "@patternfly/react-icons/dist/js/icons/task-icon";
+import { useCallback, useEffect, useMemo, useState } from "react";
+import { useHistory } from "react-router";
+import { Link } from "react-router-dom";
+import { Alerts, AlertsController } from "../../alerts/Alerts";
+import { RelativeDate } from "../../dates/RelativeDate";
+import { DeleteDropdownWithConfirmation } from "../../editor/DeleteDropdownWithConfirmation";
+import { NewFileDropdownMenu } from "../../editor/NewFileDropdownMenu";
+import { isEditable, splitFiles } from "../../extension";
+import { useRoutes } from "../../navigation/Hooks";
+import { QueryParams } from "../../navigation/Routes";
+import { useQueryParam, useQueryParams } from "../../queryParams/QueryParamsContext";
+import { ErrorBoundary } from "../../reactExt/ErrorBoundary";
+import { FileLabel } from "../../workspace/components/FileLabel";
+import { WorkspaceLabel } from "../../workspace/components/WorkspaceLabel";
 
-export function HomePage() {
+export function ServerlessModels() {
   const routes = useRoutes();
   const history = useHistory();
   const workspaceDescriptorsPromise = useWorkspaceDescriptorsPromise();
@@ -99,10 +87,10 @@ export function HomePage() {
 
   const closeExpandedWorkspace = useCallback(() => {
     history.replace({
-      pathname: routes.home.path({}),
+      pathname: "/ServerlessModels",
       search: queryParams.without(QueryParams.EXPAND).toString(),
     });
-  }, [history, routes, queryParams]);
+  }, [history, queryParams]);
 
   const expandWorkspace = useCallback(
     (workspaceId: string) => {
@@ -113,17 +101,13 @@ export function HomePage() {
       }
 
       history.replace({
-        pathname: routes.home.path({}),
+        pathname: "/ServerlessModels",
         search: routes.home.queryString({ expand }),
       });
     },
     [closeExpandedWorkspace, history, routes, expandedWorkspaceId]
   );
 
-  useEffect(() => {
-    document.title = `${APP_NAME} :: Home`;
-  }, []);
-
   useEffect(() => {
     if (
       workspaceDescriptorsPromise.data &&
@@ -133,140 +117,187 @@ export function HomePage() {
     }
   }, [workspaceDescriptorsPromise, closeExpandedWorkspace, expandedWorkspaceId]);
 
-  const buildInfo = useMemo(() => {
-    return process.env["WEBPACK_REPLACE__buildInfo"];
-  }, []);
-
   return (
-    <OnlineEditorPage>
-      <PageSection isFilled={false}>
-        <Grid hasGutter>
-          <GridItem sm={12} xl={6}>
-            <PageSection variant={"light"} isFilled={true} style={{ height: "100%" }}>
-              <TextContent>
-                <Text component={TextVariants.h1}>Create</Text>
-              </TextContent>
-              <br />
-              <Divider inset={{ default: "insetXl" }} />
-              <Gallery
-                hasGutter={true}
-                // 16px is the "Gutter" width.
-                minWidths={{ sm: "calc(33% - 16px)", default: "100%" }}
-                style={{ height: "calc(100% - 32px)" }}
-              >
-                <NewServerlessModelCard
-                  title={"Workflow"}
-                  jsonExtension={FileTypes.SW_JSON}
-                  yamlExtension={FileTypes.SW_YAML}
-                  description={"Serverless Workflow files are used to define orchestration logic for services."}
-                />
-                <NewServerlessModelCard
-                  title={"Decision"}
-                  jsonExtension={FileTypes.YARD_JSON}
-                  yamlExtension={FileTypes.YARD_YAML}
-                  description={"Serverless Decision files are used to define decision logic for services."}
-                />
-                <NewModelCard
-                  title={"Dashboard"}
-                  extension={FileTypes.DASH_YAML}
-                  description={
-                    "Dashboard files are used to define data visualization from data extracted from applications."
-                  }
-                />
-              </Gallery>
-            </PageSection>
-          </GridItem>
-          <GridItem sm={12} xl={6}>
-            <PageSection variant={"light"} isFilled={true} style={{ height: "100%" }}>
+    <PromiseStateWrapper
+      promise={workspaceDescriptorsPromise}
+      rejected={(e) => <>Error fetching workspaces: {e + ""}</>}
+      resolved={(workspaceDescriptors) => {
+        return (
+          <Drawer isExpanded={!!expandedWorkspaceId} isInline={true}>
+            <DrawerSection>
               <TextContent>
-                <Text component={TextVariants.h1}>Import</Text>
+                <Text component={TextVariants.h1}>Recent models</Text>
               </TextContent>
               <br />
-              <Divider inset={{ default: "insetXl" }} />
-              <Gallery
-                hasGutter={true}
-                // 16px is the "Gutter" width.
-                minWidths={{ sm: "calc(50% - 16px)", default: "100%" }}
-                style={{ height: "calc(100% - 32px)" }}
-              >
-                <ImportFromUrlCard />
-                <UploadCard expandWorkspace={expandWorkspace} />
-              </Gallery>
-            </PageSection>
-          </GridItem>
-        </Grid>
-      </PageSection>
-      <PageSection isFilled={false} style={{ paddingRight: 0 }}>
-        <Showcase />
-      </PageSection>
-      <PageSection
-        isFilled={true}
-        variant={"light"}
-        hasOverflowScroll={false}
-        data-ouia-component-id={"recent-models-section"}
-      >
-        <PromiseStateWrapper
-          promise={workspaceDescriptorsPromise}
-          rejected={(e) => <>Error fetching workspaces: {e + ""}</>}
-          resolved={(workspaceDescriptors) => {
-            return (
-              <Drawer isExpanded={!!expandedWorkspaceId} isInline={true}>
-                <DrawerSection>
+            </DrawerSection>
+            <DrawerContent
+              panelContent={
+                <WorkspacesListDrawerPanelContent workspaceId={expandedWorkspaceId} onClose={closeExpandedWorkspace} />
+              }
+            >
+              <DrawerContentBody>
+                {workspaceDescriptors.length > 0 && (
+                  <Stack hasGutter={true} style={{ padding: "10px" }}>
+                    {workspaceDescriptors
+                      .sort((a, b) => (new Date(a.lastUpdatedDateISO) < new Date(b.lastUpdatedDateISO) ? 1 : -1))
+                      .map((workspace) => (
+                        <StackItem key={workspace.workspaceId}>
+                          <ErrorBoundary error={<WorkspaceCardError workspace={workspace} />}>
+                            <WorkspaceCard
+                              workspaceId={workspace.workspaceId}
+                              onSelect={() => expandWorkspace(workspace.workspaceId)}
+                              isSelected={workspace.workspaceId === expandedWorkspaceId}
+                            />
+                          </ErrorBoundary>
+                        </StackItem>
+                      ))}
+                  </Stack>
+                )}
+                {workspaceDescriptors.length === 0 && (
+                  <Bullseye>
+                    <EmptyState>
+                      <EmptyStateIcon icon={CubesIcon} />
+                      <Title headingLevel="h4" size="lg">
+                        {`Nothing here`}
+                      </Title>
+                      <EmptyStateBody>{`Start by adding a new model`}</EmptyStateBody>
+                    </EmptyState>
+                  </Bullseye>
+                )}
+              </DrawerContentBody>
+            </DrawerContent>
+          </Drawer>
+        );
+      }}
+    />
+  );
+}
+
+export function WorkspacesListDrawerPanelContent(props: { workspaceId: string | undefined; onClose: () => void }) {
+  const routes = useRoutes();
+  const workspacePromise = useWorkspacePromise(props.workspaceId);
+
+  const readonlyFiles = useMemo(
+    () =>
+      (workspacePromise.data?.files ?? [])
+        .sort((a, b) => a.relativePath.localeCompare(b.relativePath))
+        .filter((file) => !isEditable(file.relativePath)),
+    [workspacePromise.data?.files]
+  );
+
+  const editableFiles = useMemo(
+    () =>
+      (workspacePromise.data?.files ?? [])
+        .sort((a, b) => a.relativePath.localeCompare(b.relativePath))
+        .filter((file) => isEditable(file.relativePath)),
+    [workspacePromise.data?.files]
+  );
+
+  const [isNewFileDropdownMenuOpen, setNewFileDropdownMenuOpen] = useState(false);
+  const [alerts, alertsRef] = useController<AlertsController>();
+
+  return (
+    <DrawerPanelContent isResizable={true} minSize={"40%"} maxSize={"80%"}>
+      <PromiseStateWrapper
+        promise={workspacePromise}
+        pending={
+          <DrawerPanelBody>
+            <Bullseye>
+              <Spinner />
+            </Bullseye>
+          </DrawerPanelBody>
+        }
+        resolved={(workspace) => (
+          <>
+            <Alerts width={"100%"} ref={alertsRef} />
+            <DrawerHead>
+              <Flex>
+                <FlexItem>
                   <TextContent>
-                    <Text component={TextVariants.h1}>Recent models</Text>
+                    <Text
+                      component={TextVariants.h3}
+                    >{`Editable files in '${workspacePromise.data?.descriptor.name}'`}</Text>
                   </TextContent>
-                  <br />
-                </DrawerSection>
-                <DrawerContent
-                  panelContent={
-                    <WorkspacesListDrawerPanelContent
-                      workspaceId={expandedWorkspaceId}
-                      onClose={closeExpandedWorkspace}
+                </FlexItem>
+                <FlexItem>
+                  <Dropdown
+                    isPlain={true}
+                    position={"left"}
+                    isOpen={isNewFileDropdownMenuOpen}
+                    toggle={
+                      <DropdownToggle
+                        className={"kie-tools--masthead-hoverable"}
+                        toggleIndicator={null}
+                        onToggle={setNewFileDropdownMenuOpen}
+                      >
+                        <PlusIcon />
+                      </DropdownToggle>
+                    }
+                  >
+                    <NewFileDropdownMenu
+                      alerts={alerts}
+                      workspaceId={workspace.descriptor.workspaceId}
+                      destinationDirPath={""}
+                      onAddFile={async () => setNewFileDropdownMenuOpen(false)}
                     />
-                  }
+                  </Dropdown>
+                </FlexItem>
+              </Flex>
+              {(workspace.descriptor.origin.kind === WorkspaceKind.GITHUB_GIST ||
+                workspace.descriptor.origin.kind === WorkspaceKind.GIT) && (
+                <TextContent>
+                  <Text component={TextVariants.small}>
+                    <i>{workspace.descriptor.origin.url.toString()}</i>
+                  </Text>
+                </TextContent>
+              )}
+              <DrawerActions>
+                <DrawerCloseButton onClick={props.onClose} />
+              </DrawerActions>
+            </DrawerHead>
+            <DrawerPanelBody>
+              <DataList aria-label="models-data-list">
+                {editableFiles.map((file) => (
+                  <Link
+                    key={file.relativePath}
+                    to={routes.workspaceWithFilePath.path({
+                      workspaceId: workspace.descriptor.workspaceId ?? "",
+                      fileRelativePath: file.relativePathWithoutExtension,
+                      extension: file.extension,
+                    })}
+                  >
+                    <FileDataListItem file={file} />
+                  </Link>
+                ))}
+              </DataList>
+              <br />
+              {readonlyFiles.length > 0 && (
+                <ExpandableSection
+                  toggleTextCollapsed="View readonly files"
+                  toggleTextExpanded="Hide readonly files"
+                  className={"plain"}
                 >
-                  <DrawerContentBody data-ouia-component-id={"recent-models-section-body"}>
-                    {workspaceDescriptors.length > 0 && (
-                      <Stack hasGutter={true} style={{ padding: "10px" }}>
-                        {workspaceDescriptors
-                          .sort((a, b) => (new Date(a.lastUpdatedDateISO) < new Date(b.lastUpdatedDateISO) ? 1 : -1))
-                          .map((workspace) => (
-                            <StackItem key={workspace.workspaceId}>
-                              <ErrorBoundary error={<WorkspaceCardError workspace={workspace} />}>
-                                <WorkspaceCard
-                                  workspaceId={workspace.workspaceId}
-                                  onSelect={() => expandWorkspace(workspace.workspaceId)}
-                                  isSelected={workspace.workspaceId === expandedWorkspaceId}
-                                />
-                              </ErrorBoundary>
-                            </StackItem>
-                          ))}
-                      </Stack>
-                    )}
-                    {workspaceDescriptors.length === 0 && (
-                      <Bullseye>
-                        <EmptyState>
-                          <EmptyStateIcon icon={CubesIcon} />
-                          <Title headingLevel="h4" size="lg" ouiaId={"empty-recent-models-title"}>
-                            {`Nothing here`}
-                          </Title>
-                          <EmptyStateBody>{`Start by adding a new model`}</EmptyStateBody>
-                        </EmptyState>
-                      </Bullseye>
-                    )}
-                  </DrawerContentBody>
-                </DrawerContent>
-              </Drawer>
-            );
-          }}
-        />
-      </PageSection>
-      {buildInfo && (
-        <div className={"kie-tools--build-info"}>
-          <Label>{buildInfo}</Label>
-        </div>
-      )}
-    </OnlineEditorPage>
+                  <DataList aria-label="readonly-files-data-list">
+                    {readonlyFiles.map((file) => (
+                      <Link
+                        key={file.relativePath}
+                        to={routes.workspaceWithFilePath.path({
+                          workspaceId: workspace.descriptor.workspaceId ?? "",
+                          fileRelativePath: file.relativePathWithoutExtension,
+                          extension: file.extension,
+                        })}
+                      >
+                        <FileDataListItem key={file.relativePath} file={file} />
+                      </Link>
+                    ))}
+                  </DataList>
+                </ExpandableSection>
+              )}
+            </DrawerPanelBody>
+          </>
+        )}
+      />
+    </DrawerPanelContent>
   );
 }
 
@@ -496,190 +527,6 @@ export function WorkspaceCard(props: { workspaceId: string; isSelected: boolean;
   );
 }
 
-export function NewModelCard(props: { title: string; extension: SupportedFileExtensions; description: string }) {
-  const routes = useRoutes();
-
-  return (
-    <Card isFullHeight={true} isPlain={true} isLarge={true} ouiaId={`${props.title}-card`}>
-      <CardTitle>
-        <FileLabel style={{ fontSize: "0.8em" }} extension={props.extension} />
-      </CardTitle>
-      <CardBody>
-        <TextContent>
-          <Text component={TextVariants.p}>{props.description}</Text>
-        </TextContent>
-      </CardBody>
-      <CardFooter>
-        <Grid>
-          <Link to={{ pathname: routes.newModel.path({ extension: props.extension }) }}>
-            <Button variant={ButtonVariant.secondary} ouiaId={`new-${props.extension}-button`}>
-              New {props.title}
-            </Button>
-          </Link>
-        </Grid>
-      </CardFooter>
-    </Card>
-  );
-}
-
-export function NewServerlessModelCard(props: {
-  title: string;
-  jsonExtension: SupportedFileExtensions;
-  yamlExtension: SupportedFileExtensions;
-  description: string;
-}) {
-  const routes = useRoutes();
-
-  return (
-    <Card isFullHeight={true} isPlain={true} isLarge={true} ouiaId={`${props.title}-card`}>
-      <CardTitle>
-        <FileLabel style={{ fontSize: "0.8em" }} extension={props.jsonExtension} />
-      </CardTitle>
-      <CardBody>
-        <TextContent>
-          <Text component={TextVariants.p}>{props.description}</Text>
-        </TextContent>
-      </CardBody>
-      <CardFooter>
-        <Grid hasGutter>
-          <GridItem span={12}>New {props.title}</GridItem>
-          <GridItem span={6}>
-            <Link to={{ pathname: routes.newModel.path({ extension: props.jsonExtension }) }}>
-              <Button variant={ButtonVariant.secondary} ouiaId={`new-${props.jsonExtension}-button`}>
-                JSON
-              </Button>
-            </Link>
-          </GridItem>
-          <GridItem span={6}>
-            <Link to={{ pathname: routes.newModel.path({ extension: props.yamlExtension }) }}>
-              <Button variant={ButtonVariant.secondary} ouiaId={`new-${props.yamlExtension}-button`}>
-                YAML
-              </Button>
-            </Link>
-          </GridItem>
-        </Grid>
-      </CardFooter>
-    </Card>
-  );
-}
-
-export function WorkspacesListDrawerPanelContent(props: { workspaceId: string | undefined; onClose: () => void }) {
-  const routes = useRoutes();
-  const workspacePromise = useWorkspacePromise(props.workspaceId);
-
-  const { editableFiles, readonlyFiles } = useMemo(() => {
-    const allFiles = (workspacePromise.data?.files ?? []).sort((a, b) => a.relativePath.localeCompare(b.relativePath));
-    return splitFiles(allFiles);
-  }, [workspacePromise.data?.files]);
-
-  const [isNewFileDropdownMenuOpen, setNewFileDropdownMenuOpen] = useState(false);
-  const [alerts, alertsRef] = useController<AlertsController>();
-
-  return (
-    <DrawerPanelContent isResizable={true} minSize={"40%"} maxSize={"80%"}>
-      <PromiseStateWrapper
-        promise={workspacePromise}
-        pending={
-          <DrawerPanelBody>
-            <Bullseye>
-              <Spinner />
-            </Bullseye>
-          </DrawerPanelBody>
-        }
-        resolved={(workspace) => (
-          <>
-            <Alerts width={"100%"} ref={alertsRef} />
-            <DrawerHead>
-              <Flex>
-                <FlexItem>
-                  <TextContent>
-                    <Text
-                      component={TextVariants.h3}
-                    >{`Editable files in '${workspacePromise.data?.descriptor.name}'`}</Text>
-                  </TextContent>
-                </FlexItem>
-                <FlexItem>
-                  <Dropdown
-                    isPlain={true}
-                    position={"left"}
-                    isOpen={isNewFileDropdownMenuOpen}
-                    toggle={
-                      <DropdownToggle
-                        className={"kie-tools--masthead-hoverable"}
-                        toggleIndicator={null}
-                        onToggle={setNewFileDropdownMenuOpen}
-                      >
-                        <PlusIcon />
-                      </DropdownToggle>
-                    }
-                  >
-                    <NewFileDropdownMenu
-                      alerts={alerts}
-                      workspaceId={workspace.descriptor.workspaceId}
-                      destinationDirPath={""}
-                      onAddFile={async () => setNewFileDropdownMenuOpen(false)}
-                    />
-                  </Dropdown>
-                </FlexItem>
-              </Flex>
-              {(workspace.descriptor.origin.kind === WorkspaceKind.GITHUB_GIST ||
-                workspace.descriptor.origin.kind === WorkspaceKind.GIT) && (
-                <TextContent>
-                  <Text component={TextVariants.small}>
-                    <i>{workspace.descriptor.origin.url.toString()}</i>
-                  </Text>
-                </TextContent>
-              )}
-              <DrawerActions>
-                <DrawerCloseButton onClick={props.onClose} />
-              </DrawerActions>
-            </DrawerHead>
-            <DrawerPanelBody>
-              <DataList aria-label="models-data-list">
-                {editableFiles.map((file) => (
-                  <Link
-                    key={file.relativePath}
-                    to={routes.workspaceWithFilePath.path({
-                      workspaceId: workspace.descriptor.workspaceId ?? "",
-                      fileRelativePath: file.relativePathWithoutExtension,
-                      extension: file.extension,
-                    })}
-                  >
-                    <FileDataListItem file={file} />
-                  </Link>
-                ))}
-              </DataList>
-              <br />
-              {readonlyFiles.length > 0 && (
-                <ExpandableSection
-                  toggleTextCollapsed="View readonly files"
-                  toggleTextExpanded="Hide readonly files"
-                  className={"plain"}
-                >
-                  <DataList aria-label="readonly-files-data-list">
-                    {readonlyFiles.map((file) => (
-                      <Link
-                        key={file.relativePath}
-                        to={routes.workspaceWithFilePath.path({
-                          workspaceId: workspace.descriptor.workspaceId ?? "",
-                          fileRelativePath: file.relativePathWithoutExtension,
-                          extension: file.extension,
-                        })}
-                      >
-                        <FileDataListItem key={file.relativePath} file={file} />
-                      </Link>
-                    ))}
-                  </DataList>
-                </ExpandableSection>
-              )}
-            </DrawerPanelBody>
-          </>
-        )}
-      />
-    </DrawerPanelContent>
-  );
-}
-
 export function FileDataListItem(props: { file: WorkspaceFile }) {
   return (
     <DataListItem>
diff --git a/packages/serverless-logic-web-tools/src/homepage/styles.css b/packages/serverless-logic-web-tools/src/homepage/styles.css
new file mode 100644
index 0000000000..b4cdbd7511
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/homepage/styles.css
@@ -0,0 +1,11 @@
+.kogito-tools-common--aboutModalBox .pf-c-about-modal-box__hero {
+  background-attachment: unset;
+}
+
+.kogito-tools-common--PageLayout .pf-c-page__header-brand-link .pf-c-brand {
+  --pf-c-page__header-brand-link--c-brand--MaxHeight: 42px;
+}
+
+/*kogito-tools-common--brand {*/
+/*  default: '180px'; md: '180px'; '2xl': '220px'*/
+/*}*/
diff --git a/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx b/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx
new file mode 100644
index 0000000000..b0bcf908fa
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { Nav, NavItem, NavList } from "@patternfly/react-core";
+import { Link } from "react-router-dom";
+
+export function HomePageNav(props: { pathname: string }) {
+  return (
+    <Nav aria-label="Global NAV" theme="dark">
+      <NavList>
+        <NavItem itemId={0} key={"Overview-nav"} isActive={props.pathname === "/"}>
+          <Link to="/">Overview</Link>
+        </NavItem>
+
+        <NavItem itemId={1} key={"Serverless-models-nav"} isActive={props.pathname === "/ServerlessModels"}>
+          <Link to="/ServerlessModels">Serverless Models</Link>
+        </NavItem>
+
+        <NavItem itemId={2} key={"SampleCatalog-nav"} isActive={props.pathname === "/SampleCatalog"}>
+          <Link to="/SampleCatalog">Sample Catalog</Link>
+        </NavItem>
+
+        <NavItem itemId={3} key={"Documentation-nav"} isActive={props.pathname === "/Documentation"}>
+          <Link to="/Documentation">Documentation</Link>
+        </NavItem>
+      </NavList>
+    </Nav>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx b/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx
index 52e97bc03b..686c59fd1b 100644
--- a/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx
+++ b/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx
@@ -17,46 +17,46 @@
 import * as React from "react";
 import { useMemo } from "react";
 import { Route, Switch } from "react-router-dom";
-import { EditorPage } from "../editor/EditorPage";
-import { supportedFileExtensionArray } from "../extension";
-import { HomePage } from "../home/HomePage";
-import { NewWorkspaceFromUrlPage } from "../workspace/components/NewWorkspaceFromUrlPage";
-import { NewWorkspaceWithEmptyFilePage } from "../workspace/components/NewWorkspaceWithEmptyFilePage";
 import { useRoutes } from "./Hooks";
-import { NoMatchPage } from "./NoMatchPage";
+import { OnlineEditorPage } from "../homepage/pageTemplate/OnlineEditorPage";
+import { Label } from "@patternfly/react-core/dist/js/components/Label";
+import { HomePageRoutes } from "../homepage/routes/HomePageRoutes";
 
 export function RoutesSwitch() {
   const routes = useRoutes();
-  const supportedExtensions = useMemo(() => supportedFileExtensionArray.join("|"), []);
+  const buildInfo = useMemo(() => {
+    return process.env["WEBPACK_REPLACE__buildInfo"];
+  }, []);
+
+  const renderPage = (routeProps: {
+    location: {
+      pathname:
+        | string
+        | number
+        | boolean
+        | {}
+        | React.ReactElement<any, string | React.JSXElementConstructor<any>>
+        | React.ReactNodeArray
+        | React.ReactPortal
+        | null
+        | undefined;
+    };
+  }) => {
+    return (
+      <OnlineEditorPage>
+        <HomePageRoutes />
+        {buildInfo && (
+          <div className={"kie-tools--build-info"}>
+            <Label>{buildInfo}</Label>
+          </div>
+        )}
+      </OnlineEditorPage>
+    );
+  };
 
   return (
     <Switch>
-      <Route path={routes.newModel.path({ extension: `:extension(${supportedExtensions})` })}>
-        {({ match }) => <NewWorkspaceWithEmptyFilePage extension={match!.params.extension!} />}
-      </Route>
-      <Route path={routes.importModel.path({})}>
-        <NewWorkspaceFromUrlPage />
-      </Route>
-      <Route
-        path={routes.workspaceWithFilePath.path({
-          workspaceId: ":workspaceId",
-          fileRelativePath: `:fileRelativePath*`,
-          extension: `:extension?`,
-        })}
-      >
-        {({ match }) => (
-          <EditorPage
-            workspaceId={match!.params.workspaceId!}
-            fileRelativePath={`${match!.params.fileRelativePath ?? ""}${
-              match!.params.extension ? `.${match!.params.extension}` : ""
-            }`}
-          />
-        )}
-      </Route>
-      <Route exact={true} path={routes.home.path({})}>
-        <HomePage />
-      </Route>
-      <Route component={NoMatchPage} />
+      <Route path={routes.home.path({})} render={renderPage}></Route>
     </Switch>
   );
 }
diff --git a/packages/serverless-logic-web-tools/src/pageTemplate/OnlineEditorPage.tsx b/packages/serverless-logic-web-tools/src/pageTemplate/OnlineEditorPage.tsx
deleted file mode 100644
index f6c37d12cf..0000000000
--- a/packages/serverless-logic-web-tools/src/pageTemplate/OnlineEditorPage.tsx
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright 2021 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import * as React from "react";
-import { useMemo } from "react";
-import { Masthead, MastheadBrand, MastheadMain } from "@patternfly/react-core/dist/js/components/Masthead";
-import { Page, PageHeaderToolsItem } from "@patternfly/react-core/dist/js/components/Page";
-import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
-import { Flex, FlexItem } from "@patternfly/react-core/dist/js/layouts/Flex";
-import { useHistory } from "react-router";
-import { KieSandboxExtendedServicesIcon } from "../kieSandboxExtendedServices/KieSandboxExtendedServicesIcon";
-import { useRoutes } from "../navigation/Hooks";
-import { OpenshiftDeploymentsDropdown } from "../openshift/dropdown/OpenshiftDeploymentsDropdown";
-import { SettingsButton } from "../settings/SettingsButton";
-import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
-import { ExclamationIcon } from "@patternfly/react-icons/dist/js/icons";
-import { APP_NAME } from "../AppConstants";
-
-export function OnlineEditorPage(props: { children?: React.ReactNode }) {
-  const history = useHistory();
-  const routes = useRoutes();
-
-  const isChromiumBased = useMemo(() => {
-    const agent = window.navigator.userAgent.toLowerCase();
-    return agent.indexOf("edg") > -1 || agent.indexOf("chrome") > -1;
-  }, []);
-
-  return (
-    <Page
-      header={
-        <Masthead aria-label={"Page header"} display={{ default: "stack" }}>
-          <MastheadMain style={{ justifyContent: "space-between" }}>
-            <PageHeaderToolsItem className={"pf-l-flex"}>
-              <MastheadBrand
-                onClick={() => history.push({ pathname: routes.home.path({}) })}
-                style={{ textDecoration: "none" }}
-              >
-                <TextContent>
-                  <Text component={TextVariants.h1} ouiaId={"app-title"}>
-                    {APP_NAME}
-                  </Text>
-                </TextContent>
-              </MastheadBrand>
-            </PageHeaderToolsItem>
-            <Flex justifyContent={{ default: "justifyContentFlexEnd" }}>
-              <FlexItem>
-                <PageHeaderToolsItem>
-                  <OpenshiftDeploymentsDropdown />
-                </PageHeaderToolsItem>
-              </FlexItem>
-              <FlexItem>
-                <PageHeaderToolsItem>
-                  <SettingsButton />
-                </PageHeaderToolsItem>
-              </FlexItem>
-              <FlexItem>
-                <PageHeaderToolsItem>
-                  <KieSandboxExtendedServicesIcon />
-                </PageHeaderToolsItem>
-              </FlexItem>
-              {!isChromiumBased && (
-                <Tooltip
-                  className="kogito--editor__light-tooltip"
-                  key={"not-chromium"}
-                  content={"To get the best experience, please prefer using Chromium based browsers."}
-                  flipBehavior={["left"]}
-                  distance={20}
-                >
-                  <ExclamationIcon
-                    data-testid="not-chromium-icon"
-                    className="kogito--editor__kie-sandbox-extended-services-dropdown-icon-outdated static-opacity"
-                    id="kie-sandbox-extended-services-not-chromium-icon"
-                    style={{ cursor: "pointer" }}
-                  />
-                </Tooltip>
-              )}
-            </Flex>
-          </MastheadMain>
-        </Masthead>
-      }
-    >
-      {props.children}
-    </Page>
-  );
-}
diff --git a/packages/serverless-logic-web-tools/src/workspace/components/NewWorkspaceFromUrlPage.tsx b/packages/serverless-logic-web-tools/src/workspace/components/NewWorkspaceFromUrlPage.tsx
index d5e5ac9cde..284172d44b 100644
--- a/packages/serverless-logic-web-tools/src/workspace/components/NewWorkspaceFromUrlPage.tsx
+++ b/packages/serverless-logic-web-tools/src/workspace/components/NewWorkspaceFromUrlPage.tsx
@@ -24,7 +24,6 @@ import { Spinner } from "@patternfly/react-core/dist/js/components/Spinner";
 import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
 import { QueryParams } from "../../navigation/Routes";
 import { useQueryParam } from "../../queryParams/QueryParamsContext";
-import { OnlineEditorPage } from "../../pageTemplate/OnlineEditorPage";
 import { PageSection } from "@patternfly/react-core/dist/js/components/Page";
 import { basename } from "path";
 import { WorkspaceKind } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceOrigin";
@@ -285,22 +284,20 @@ export function NewWorkspaceFromUrlPage() {
 
   return (
     <>
-      <OnlineEditorPage>
-        {importingError && <EditorPageErrorPage path={importableUrl.url.toString()} errors={[importingError]} />}
-        {!importingError && (
-          <PageSection variant={"light"} isFilled={true} padding={{ default: "noPadding" }}>
-            <Bullseye>
-              <TextContent>
-                <Bullseye>
-                  <Spinner />
-                </Bullseye>
-                <br />
-                <Text component={TextVariants.p}>{`Importing from '${queryParamUrl}'`}</Text>
-              </TextContent>
-            </Bullseye>
-          </PageSection>
-        )}
-      </OnlineEditorPage>
+      {importingError && <EditorPageErrorPage path={importableUrl.url.toString()} errors={[importingError]} />}
+      {!importingError && (
+        <PageSection variant={"light"} isFilled={true} padding={{ default: "noPadding" }}>
+          <Bullseye>
+            <TextContent>
+              <Bullseye>
+                <Spinner />
+              </Bullseye>
+              <br />
+              <Text component={TextVariants.p}>{`Importing from '${queryParamUrl}'`}</Text>
+            </TextContent>
+          </Bullseye>
+        </PageSection>
+      )}
     </>
   );
 }
diff --git a/packages/serverless-logic-web-tools/src/workspace/components/NewWorkspaceWithEmptyFilePage.tsx b/packages/serverless-logic-web-tools/src/workspace/components/NewWorkspaceWithEmptyFilePage.tsx
index 52eac5b847..d142179e57 100644
--- a/packages/serverless-logic-web-tools/src/workspace/components/NewWorkspaceWithEmptyFilePage.tsx
+++ b/packages/serverless-logic-web-tools/src/workspace/components/NewWorkspaceWithEmptyFilePage.tsx
@@ -19,7 +19,6 @@ import * as React from "react";
 import { useEffect } from "react";
 import { useHistory } from "react-router";
 import { useRoutes } from "../../navigation/Hooks";
-import { OnlineEditorPage } from "../../pageTemplate/OnlineEditorPage";
 import { PageSection } from "@patternfly/react-core/dist/js/components/Page";
 import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
 import { Bullseye } from "@patternfly/react-core/dist/js/layouts/Bullseye";
@@ -52,18 +51,16 @@ export function NewWorkspaceWithEmptyFilePage(props: { extension: string }) {
   }, [routes, history, props.extension, workspaces]);
 
   return (
-    <OnlineEditorPage>
-      <PageSection variant={"light"} isFilled={true} padding={{ default: "noPadding" }}>
-        <Bullseye>
-          <TextContent>
-            <Bullseye>
-              <Spinner />
-            </Bullseye>
-            <br />
-            <Text component={TextVariants.p}>{`Loading...`}</Text>
-          </TextContent>
-        </Bullseye>
-      </PageSection>
-    </OnlineEditorPage>
+    <PageSection variant={"light"} isFilled={true} padding={{ default: "noPadding" }}>
+      <Bullseye>
+        <TextContent>
+          <Bullseye>
+            <Spinner />
+          </Bullseye>
+          <br />
+          <Text component={TextVariants.p}>{`Loading...`}</Text>
+        </TextContent>
+      </Bullseye>
+    </PageSection>
   );
 }
diff --git a/packages/serverless-logic-web-tools/static/images/kogito_log_workbranch.svg b/packages/serverless-logic-web-tools/static/images/kogito_log_workbranch.svg
new file mode 100644
index 0000000000..7614f359e6
--- /dev/null
+++ b/packages/serverless-logic-web-tools/static/images/kogito_log_workbranch.svg
@@ -0,0 +1,52 @@
+<svg version="1.1" id="Layer_1" x="0px" y="0px" viewBox="0 0 560.2 60" height="60" width="560.2" style="enable-background:new 0 0 560.2 60;" xmlns="http://www.w3.org/2000/svg">
+	<defs></defs>
+	<style type="text/css">
+		.st0{fill:#FFFFFF;}
+		.st1{fill:#AFD4EB;}
+		.st2{fill:#F48227;}
+		.st3{fill:#014E64;}
+		.st4{fill:none;}
+	</style>
+	<title>Serverless Logic Web Tools</title>
+	<path class="st1" d="M3.4,45.1l20.8,12.3l22.7-12.1L42,30.2l-6.3,5.5c0,0,2.6,4.8,1.3,5.1l-5.5-0.5l-5.8,3.2l-4.5-1.8l-1.5-1.4
+	l-2.1-0.5l-3,1.4L13.4,40l0.9-3.3l-3.1-2.9L6.7,31L3.4,45.1z"></path>
+	<polygon class="st1" points="21,30.6 24.9,33 29,31.2 33,33.4 34.7,35.2 37,38 36.9,40.8 33.2,39.8 26.7,39.4 19.9,39.5 15.6,40.4
+	13.3,40 14.9,35.1 "></polygon>
+	<polygon class="st2" points="10.8,18.2 22.4,17.5 24.9,19.8 27.4,17.8 39.2,18.1 40.8,21.8 41.1,27.9 40.2,32.9 36.7,35.4
+	34.7,35.2 31.8,32.5 29,31.2 26.5,32.6 21.2,31.4 18.7,32.3 14.9,35.1 11.1,33.7 8.4,30.2 8.2,26.6 "></polygon>
+	<polygon class="st2" points="19.9,39.5 24.5,39.7 29.6,39.8 30.9,40.6 27.4,43.3 22.1,43 "></polygon>
+	<polygon class="st0" points="3.4,2.2 13,3.9 16,8.4 22.8,4.3 28,4.3 33.6,8.3 38.4,3.8 47.7,2.6 47.7,5.6 44.6,12.1 45.4,17.5
+	41.2,20.6 39.3,18.2 26.7,17.9 25,19.9 23.3,17.6 10.9,18.3 9.3,20.2 5.2,18.6 4.7,15.2 5.2,11.9 4.3,8.6 2.1,4.6 "></polygon>
+	<path class="st3" d="M11.1,21.5c2.1-8.7,8.8-15.8,14.1-15.9c4.4,0.3,12.1,6.5,14.1,15.9l2.4,0.3c-1.4-9.4-8.4-18-16.5-18
+	s-13.9,8-16.3,17.7L11.1,21.5z"></path>
+	<path class="st3" d="M36.7,49.6c-0.3-1.7-0.3-3.4,0-5.1c0,0,0.6,4.3,1.4,4.5L36.7,49.6z"></path>
+	<path class="st3" d="M31.1,53c-0.3-1.7-0.3-3.4,0-5.1c0,0,0.6,4.3,1.4,4.5L31.1,53z"></path>
+	<path class="st3" d="M13.8,49.7c0.3-1.7,0.3-3.4,0-5.1c0,0-0.6,4.3-1.4,4.5L13.8,49.7z"></path>
+	<path class="st3" d="M19.4,53.2c0.3-1.7,0.3-3.4,0-5.1c0,0-0.6,4.3-1.4,4.5L19.4,53.2z"></path>
+	<polygon class="st3" points="7.5,19.2 1.6,46.3 25.3,60 49.1,46.3 43.1,19.5 39,20.5 44.4,44.4 25.3,55.2 6.1,44.3 11.3,20.2 "></polygon>
+	<path class="st3" d="M39.9,17.5c0,0,3.3,0.7,4-1.6c0,0,0.5-1.9-0.7-2.8c-0.4-0.4-0.8-0.6-1.4-0.7l4.4-8.2l-7.2,1.1l-3,5.2l-3-3
+	l2.5-4.3c0.5-1.1,1.6-1.8,2.7-1.9l7.8-1.2c0,0,5.7-0.7,4.2,5.2l-3.3,6.1c1.9,2.9,1.3,6.7-1.4,8.8c-1.4,1.1-3.2,1.7-4.9,1.5
+	L39.9,17.5z"></path>
+	<path class="st3" d="M10.8,17.5c0,0-3.3,0.7-4-1.6c0,0-0.5-1.9,0.7-2.8c0.4-0.4,0.8-0.6,1.4-0.7L4.3,4.1l7.2,1.1l3,5.2l2.9-3L15,3.1
+	c-0.5-1.1-1.6-1.8-2.7-1.9L4.5,0c0,0-5.7-0.7-4.2,5.2l3.3,6.1c-1.9,2.9-1.3,6.7,1.4,8.8c1.4,1.1,3.2,1.7,4.9,1.5L10.8,17.5z"></path>
+	<path class="st3" d="M29.6,39.8c-1.8,2.4-5.3,2.8-7.6,1c-0.4-0.3-0.7-0.6-1-1h-3.6c2.3,4.4,7.7,6,12.1,3.7c1.6-0.8,2.9-2.1,3.7-3.7
+	H29.6z"></path>
+	<ellipse class="st4" cx="25.4" cy="13.2" rx="12.1" ry="11.5"></ellipse>
+	<path class="st3" d="M19.1,6.2c1.9-1,3.9-1.5,6-1.4c2.1,0,5.3,1.9,6.9,2.7c1.9,0.4,2.5-0.4,4,0.3c-3.3-6-10.9-8.2-16.9-4.9
+	c-2.1,1.2-3.8,2.9-5,5.1C15.8,7.2,17.4,6.6,19.1,6.2z"></path>
+	<path class="st3" d="M36.1,36.7c3.3-0.5,5.7-3.2,5.8-6.5l-2.3-8.2c0,0,2.5,12.8-4.7,12.4L36.1,36.7z"></path>
+	<path class="st3" d="M14.2,36.7c-3.3-0.5-5.7-3.2-5.8-6.5l2.3-8.2c0,0-2.5,12.8,4.7,12.4L14.2,36.7z"></path>
+	<rect x="30.8" y="20.7" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -7.9 29.9319)" class="st3" width="2.7" height="7.6"></rect>
+	<rect x="28.4" y="23.1" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -7.8677 29.947)" class="st3" width="7.6" height="2.7"></rect>
+	<path class="st3" d="M14.5,24.7c0,0,4.2-6.1,8.5,0C23,24.7,19.1,30.3,14.5,24.7z"></path>
+	<path class="st3" d="M25.1,40.5c3.3-0.1,6.6,0.4,9.7,1.5c0,0,3.6,1.2,3.5-2.2c-0.1-3.4-4-7.6-7.4-9.1c-0.2-0.4-0.3-0.8-0.4-1.2
+	c-0.3-0.5-1-0.6-1.4-0.3c-0.1,0.1-0.1,0.1-0.2,0.2c-1,1.2-2.3,1.9-3.8,2.1v2.4c1.1,0.1,2.2-0.3,3.1-1c0.5-0.5,1.4-0.5,1.9,0
+	c2.5,1.4,4.5,3.5,5.7,6c0,0,0.7,1.9-0.9,0.8c-0.6-0.3-1.2-0.5-1.8-0.7c-0.1-0.8-0.4-1.6-1-2.2c0.2,0.7,0.2,1.4,0,2.1
+	c-0.9-0.2-1.8-0.3-2.7-0.4c0-0.9-0.3-1.7-0.9-2.3c0.2,0.7,0.2,1.5,0,2.2c-1.2-0.1-2.3-0.1-3.5,0L25.1,40.5z"></path>
+	<path class="st3" d="M25.5,40.5c-3.3-0.1-6.6,0.4-9.7,1.5c0,0-3.6,1.2-3.5-2.2c0.1-3.4,4-7.6,7.4-9.1c0.2-0.4,0.3-0.8,0.4-1.2
+	c0.3-0.5,1-0.6,1.4-0.3c0.1,0.1,0.1,0.1,0.2,0.2c1,1.1,2.3,1.9,3.8,2.1v2.4c-1.1,0.1-2.2-0.3-3.1-1c-0.5-0.5-1.4-0.5-1.9,0
+	c-2.5,1.4-4.5,3.5-5.7,6c0,0-0.7,1.9,0.9,0.8c0.6-0.3,1.2-0.5,1.8-0.7c0.1-0.8,0.4-1.6,1-2.2c-0.2,0.7-0.2,1.4,0,2.1
+	c0.9-0.2,1.8-0.3,2.7-0.4c0-0.9,0.3-1.7,0.9-2.3c-0.2,0.7-0.2,1.5,0,2.2c1.2-0.1,2.3-0.1,3.5,0L25.5,40.5z"></path>
+	<polygon class="st3" points="10.7,19.4 22.8,18.7 25.1,21.2 27.6,18.8 39.8,19.4 39,17 26.6,16.1 25.1,18 23.8,16.2 11.1,17 "></polygon>
+	<text style="fill: rgb(51, 51, 51); fill-opacity: 0; font-family: Arial, sans-serif; font-size: 9.4px; paint-order: fill; stroke-width: 4.56531px; white-space: pre;" transform="matrix(4.218454, 0, 0, 4.543271, -200.767197, -13.27547)" x="62.38" y="12.27">Serverless Logic Web Tools</text>
+</svg>
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 03/27: KOGITO-8426: Implement a quickstart guide component in the settings section (#1431)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit 0702883c2cf707f431712196861f1a2569c45fdd
Author: Fabrizio Antonangeli <fa...@gmail.com>
AuthorDate: Tue Jan 31 14:43:30 2023 +0100

    KOGITO-8426:  Implement a quickstart guide component in the settings section (#1431)
    
    * KOGITO-8147 Refactor the app bar and menu according to UX redesign
    
    * refactor to function style
    
    * remove new home page
    
    * remove old home page
    
    * Updated OnlineEditorPage.tsx
    
    * Add Settings routes and Settings Nav sidebar
    
    * GitHubSettings page wip
    
    * Rename packages/serverless-logic-sandbox/src/settings/github/GitHubSettingsTab.tsx -> packages/serverless-logic-sandbox/src/settings/github/GitHubSettings.tsx
    
    * GitHubSettings page
    
    * QuickStart implementation
    
    * Removed quickstart link after branching
    
    * add KieSandboxExtendedServicesSettings route
    
    * Fix expand content when sidebar is collapsed
    
    * Moved new settings routes to src/newSettings
    
    * Completing the new settings folder
    
    * WIP OpenShiftSettings
    
    * OpenShiftSettings page
    
    * Fix "setup" modal hidden by "add connection" modal
    
    * Fix: Can't perform a React state update on an unmounted component
    
    * Mv ServiceAccountSettingsTab -> ServiceAccountSettings
    
    * ServiceAccountSettings
    
    * R packages/serverless-logic-sandbox/src/newSettings/serviceRegistry/ServiceRegistrySettingsTab.tsx -> packages/serverless-logic-sandbox/src/newSettings/serviceRegistry/ServiceRegistrySettings.tsx
    
    * Refactor ServiceRegistrySettings
    
    * R packages/serverless-logic-sandbox/src/newSettings/kafka/ApacheKafkaSettingsTab.tsx -> packages/serverless-logic-sandbox/src/newSettings/kafka/ApacheKafkaSettings.tsx
    
    * Refactor ApacheKafkaSettings
    
    * R packages/serverless-logic-sandbox/src/newSettings/featurePreview/FeaturePreviewSettingsTab.tsx -> packages/serverless-logic-sandbox/src/newSettings/featurePreview/FeaturePreviewSettings.tsx
    
    * Refactor FeaturePreviewSettings
    
    * Sidebar title same as OpenShift Console
    
    * deleted:    packages/serverless-logic-sandbox/src/newSettings/SettingsModalBody.tsx
    removed settings modal related code
    
    * Fix Copyright
    
    * Add check not to show the loading in modal if we are in settings route
    
    * Removed unnecessary code for input focus
    
    * Code review
    
    * Fixed issues after merge conflicts
    
    * Fix issue: mocal backdrop goes under quickstart when they are both open
    
    * Add missing peer dependencies as for patternfly-quickstarts README
    
    * Add GitHubTokenQuickStart
    
    * Fix issue after merge
    
    * add OpenShiftIntegrationQuickStart
    
    * disabled use of querystring and created SettingsPageProps type
    
    * Rewrite GitHubTokenQuickStart and OpenShiftIntegrationQuickStart in html
    for better rendering
    
    * Add ApplicationServicesIntegrationQuickStart
    
    * Add all quickstarts and improved integration
    
    * Content review and html code formatting
    
    * Fix merge issue
    
    ---------
    
    Co-authored-by: Xaiofeng Bai <bx...@gmail.com>
---
 packages/serverless-logic-web-tools/package.json   |   2 +
 .../src/homepage/pageTemplate/OnlineEditorPage.tsx |  54 ++-
 packages/serverless-logic-web-tools/src/index.tsx  |   1 +
 .../src/navigation/RoutesSwitch.tsx                |   7 +-
 .../KieSandboxExtendedServicesSettings.tsx         | 282 +++++++-------
 .../src/newSettings/github/GitHubSettings.tsx      | 108 +++---
 .../src/newSettings/kafka/ApacheKafkaSettings.tsx  | 291 +++++++-------
 .../newSettings/openshift/OpenShiftSettings.tsx    |  32 +-
 .../openshift/OpenShiftSettingsSimpleConfig.tsx    |  17 +-
 .../src/newSettings/routes/SettingsPageRoutes.tsx  |  19 +-
 .../serviceAccount/ServiceAccountSettings.tsx      | 267 +++++++------
 .../serviceRegistry/ServiceRegistrySettings.tsx    | 287 +++++++-------
 .../src/newSettings/types.ts                       |  17 +
 .../ApplicationServicesIntegrationQuickStart.ts    | 421 +++++++++++++++++++++
 .../src/quickstarts-data/GitHubTokenQuickStart.ts  | 222 +++++++++++
 .../OpenShiftIntegrationQuickStart.ts              | 194 ++++++++++
 .../src/quickstarts-data/index.ts                  |  27 ++
 .../serverless-logic-web-tools-github-repo.png     | Bin 0 -> 55617 bytes
 .../serverless-logic-web-tools-openshift-info.png  | Bin 0 -> 129890 bytes
 ...erverless-logic-web-tools-openshift-project.png | Bin 0 -> 166585 bytes
 .../static/resources/style.css                     |   8 +
 pnpm-lock.yaml                                     | 319 ++++++++++++++--
 22 files changed, 1941 insertions(+), 634 deletions(-)

diff --git a/packages/serverless-logic-web-tools/package.json b/packages/serverless-logic-web-tools/package.json
index a183ee802b..f023e2d7a8 100644
--- a/packages/serverless-logic-web-tools/package.json
+++ b/packages/serverless-logic-web-tools/package.json
@@ -49,6 +49,7 @@
     "@kie-tools/text-editor": "workspace:*",
     "@octokit/plugin-rest-endpoint-methods": "^5.0.1",
     "@octokit/rest": "^18.5.3",
+    "@patternfly/quickstarts": "^2.3.2",
     "@patternfly/react-core": "^4.157.3",
     "@patternfly/react-icons": "^4.11.17",
     "@patternfly/react-tokens": "^4.33.1",
@@ -67,6 +68,7 @@
     "react-dropzone": "^11.4.2",
     "react-router": "^5.2.1",
     "react-router-dom": "^5.2.1",
+    "showdown": "^2.1.0",
     "vscode-languageserver-types": "^3.16.0",
     "yaml": "^2.0.1"
   },
diff --git a/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx b/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
index 7f55b5605a..a6bf24d405 100644
--- a/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
@@ -15,36 +15,43 @@
  */
 
 import * as React from "react";
-import { useMemo } from "react";
+import { QuickStartContainer, QuickStartContainerProps } from "@patternfly/quickstarts";
 import {
+  Brand,
+  Button,
   Masthead,
   MastheadBrand,
+  MastheadContent,
   MastheadMain,
   MastheadToggle,
-  Button,
-  Brand,
-  MastheadContent,
-  ToolbarContent,
+  PageSidebar,
+  SkipToContent,
   Toolbar,
+  ToolbarContent,
   ToolbarGroup,
   ToolbarItem,
-  PageSidebar,
-  SkipToContent,
 } from "@patternfly/react-core";
 import { Page } from "@patternfly/react-core/dist/js/components/Page";
+import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
+import { BarsIcon, ExclamationIcon } from "@patternfly/react-icons/dist/js/icons";
+import { useMemo, useState } from "react";
 import { useHistory, useRouteMatch } from "react-router";
+import { useLocation } from "react-router-dom";
 import { KieSandboxExtendedServicesIcon } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesIcon";
 import { useRoutes } from "../../navigation/Hooks";
+import { SettingsPageNav } from "../../newSettings/uiNav/SettingsPageNav";
 import { OpenshiftDeploymentsDropdown } from "../../openshift/dropdown/OpenshiftDeploymentsDropdown";
+import {
+  ApplicationServicesIntegrationQuickStart,
+  GitHubTokenQuickStart,
+  OpenShiftIntegrationQuickStart,
+} from "../../quickstarts-data";
 import { SettingsButton } from "../../settings/SettingsButton";
 import { HomePageNav } from "../uiNav/HomePageNav";
-import { useLocation } from "react-router-dom";
-import { useState } from "react";
-import { SettingsPageNav } from "../../newSettings/uiNav/SettingsPageNav";
-import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
-import { ExclamationIcon, BarsIcon } from "@patternfly/react-icons/dist/js/icons";
 
-export function OnlineEditorPage(props: { children?: React.ReactNode }) {
+export type OnlineEditorPageProps = { children?: React.ReactNode; pageContainerRef: React.RefObject<HTMLDivElement> };
+
+export function OnlineEditorPage(props: OnlineEditorPageProps) {
   const history = useHistory();
   const routes = useRoutes();
   const [isNavOpen, setIsNavOpen] = useState(true);
@@ -52,6 +59,17 @@ export function OnlineEditorPage(props: { children?: React.ReactNode }) {
   const navToggle = () => {
     setIsNavOpen(!isNavOpen);
   };
+  const [activeQuickStartID, setActiveQuickStartID] = useState("");
+  const [allQuickStartStates, setAllQuickStartStates] = useState({});
+
+  const drawerProps: QuickStartContainerProps = {
+    quickStarts: [GitHubTokenQuickStart, OpenShiftIntegrationQuickStart, ApplicationServicesIntegrationQuickStart],
+    activeQuickStartID,
+    allQuickStartStates,
+    setActiveQuickStartID,
+    setAllQuickStartStates,
+    useQueryParams: false,
+  };
 
   const isChromiumBased = useMemo(() => {
     const agent = window.navigator.userAgent.toLowerCase();
@@ -145,8 +163,12 @@ export function OnlineEditorPage(props: { children?: React.ReactNode }) {
   const pageSkipToContent = <SkipToContent href={`#${mainContainerId}`}>Skip to content</SkipToContent>;
 
   return (
-    <Page header={masthead} sidebar={sidebar} skipToContent={pageSkipToContent} mainContainerId={mainContainerId}>
-      {props.children}
-    </Page>
+    <QuickStartContainer {...drawerProps}>
+      <div id="page-container" ref={props.pageContainerRef}>
+        <Page header={masthead} sidebar={sidebar} skipToContent={pageSkipToContent} mainContainerId={mainContainerId}>
+          {props.children}
+        </Page>
+      </div>
+    </QuickStartContainer>
   );
 }
diff --git a/packages/serverless-logic-web-tools/src/index.tsx b/packages/serverless-logic-web-tools/src/index.tsx
index 6a601443be..d23a1dc5e6 100644
--- a/packages/serverless-logic-web-tools/src/index.tsx
+++ b/packages/serverless-logic-web-tools/src/index.tsx
@@ -15,6 +15,7 @@
  */
 
 import "@patternfly/react-core/dist/styles/base.css";
+import "@patternfly/quickstarts/dist/quickstarts.min.css";
 import * as React from "react";
 import * as ReactDOM from "react-dom";
 import { App } from "./App";
diff --git a/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx b/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx
index 004b9837b9..ad68babfe9 100644
--- a/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx
+++ b/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx
@@ -15,7 +15,7 @@
  */
 
 import * as React from "react";
-import { useMemo } from "react";
+import { useMemo, useRef } from "react";
 import { Route, Switch, useRouteMatch } from "react-router-dom";
 import { useRoutes } from "./Hooks";
 import { OnlineEditorPage } from "../homepage/pageTemplate/OnlineEditorPage";
@@ -29,6 +29,7 @@ export function RoutesSwitch() {
   const buildInfo = useMemo(() => {
     return process.env["WEBPACK_REPLACE__buildInfo"];
   }, []);
+  const pageContainerRef = useRef<HTMLDivElement>(null);
 
   const renderPage = (routeProps: {
     location: {
@@ -45,8 +46,8 @@ export function RoutesSwitch() {
     };
   }) => {
     return (
-      <OnlineEditorPage>
-        {!isRouteInSettingsSection ? <HomePageRoutes /> : <SettingsPageRoutes />}
+      <OnlineEditorPage pageContainerRef={pageContainerRef}>
+        {!isRouteInSettingsSection ? <HomePageRoutes /> : <SettingsPageRoutes pageContainerRef={pageContainerRef} />}
         {buildInfo && (
           <div className={"kie-tools--build-info"}>
             <Label>{buildInfo}</Label>
diff --git a/packages/serverless-logic-web-tools/src/newSettings/extendedServices/KieSandboxExtendedServicesSettings.tsx b/packages/serverless-logic-web-tools/src/newSettings/extendedServices/KieSandboxExtendedServicesSettings.tsx
index 4e163afd88..37a1a2382d 100644
--- a/packages/serverless-logic-web-tools/src/newSettings/extendedServices/KieSandboxExtendedServicesSettings.tsx
+++ b/packages/serverless-logic-web-tools/src/newSettings/extendedServices/KieSandboxExtendedServicesSettings.tsx
@@ -29,17 +29,21 @@ import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-cir
 import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
 import { TimesIcon } from "@patternfly/react-icons/dist/js/icons/times-icon";
 import * as React from "react";
-import { useCallback, useMemo, useState } from "react";
+import { useCallback, useMemo, useState, useContext } from "react";
 import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
 import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
 import { ExtendedServicesConfig, useSettings, useSettingsDispatch } from "../../settings/SettingsContext";
+import { QuickStartContext, QuickStartContextValues } from "@patternfly/quickstarts";
+import { QuickStartIds } from "../../quickstarts-data";
+import { SettingsPageProps } from "../types";
 
-export function KieSandboxExtendedServicesSettings() {
+export function KieSandboxExtendedServicesSettings(props: SettingsPageProps) {
   const settings = useSettings();
   const settingsDispatch = useSettingsDispatch();
   const kieSandboxExtendedServices = useKieSandboxExtendedServices();
   const [config, setConfig] = useState(settings.kieSandboxExtendedServices.config);
   const [isModalOpen, setIsModalOpen] = useState(false);
+  const qsContext = useContext<QuickStartContextValues>(QuickStartContext);
 
   const isCurrentConfigValid = useMemo(
     () => config.host.trim().length > 0 && config.buildUrl().trim().length > 0,
@@ -138,136 +142,154 @@ export function KieSandboxExtendedServicesSettings() {
         </PageSection>
       </PageSection>
 
-      <Modal
-        title="Add connection"
-        isOpen={
-          isModalOpen &&
-          kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.RUNNING &&
-          !kieSandboxExtendedServices.isModalOpen
-        }
-        onClose={handleModalToggle}
-        variant={ModalVariant.large}
-      >
-        <Form>
-          <FormAlert>
-            <Alert
-              variant="danger"
-              title={
-                <Text>
-                  You are not connected to KIE Sandbox Extended Services.{" "}
-                  <a
-                    onClick={() => {
-                      kieSandboxExtendedServices.setInstallTriggeredBy(undefined);
-                      kieSandboxExtendedServices.setModalOpen(true);
-                    }}
-                  >
-                    Click to setup
-                  </a>
-                </Text>
-              }
-              aria-live="polite"
-              isInline
-            />
-          </FormAlert>
-          <PageSection variant={"light"} isFilled={true} style={{ height: "100%" }}>
-            <FormGroup
-              label={"Host"}
-              labelIcon={
-                <Popover bodyContent={"The host associated with the KIE Sandbox Extended Services URL instance."}>
-                  <button
-                    type="button"
-                    aria-label="More info for host field"
-                    onClick={(e) => e.preventDefault()}
-                    aria-describedby="host-server-field"
-                    className="pf-c-form__group-label-help"
-                  >
-                    <HelpIcon noVerticalAlign />
-                  </button>
-                </Popover>
-              }
-              isRequired
-              fieldId="host-server-field"
-            >
-              <InputGroup className="pf-u-mt-sm">
-                <TextInput
-                  autoComplete={"off"}
-                  isRequired
-                  type="text"
-                  id="host-server-field"
-                  name="host-server-field"
-                  aria-label="Host field"
-                  aria-describedby="host-server-field-helper"
-                  value={config.host}
-                  onChange={onHostChanged}
-                  tabIndex={1}
-                  data-testid="host-text-field"
-                />
-                <InputGroupText>
-                  <Button isSmall variant="plain" aria-label="Clear host button" onClick={onClearHost}>
-                    <TimesIcon />
-                  </Button>
-                </InputGroupText>
-              </InputGroup>
-            </FormGroup>
-            <FormGroup
-              label={"Port"}
-              labelIcon={
-                <Popover
-                  bodyContent={"The port number associated with the KIE Sandbox Extended Services URL instance."}
-                >
-                  <button
-                    type="button"
-                    aria-label="More info for port field"
-                    onClick={(e) => e.preventDefault()}
-                    aria-describedby="port-field"
-                    className="pf-c-form__group-label-help"
+      {props.pageContainerRef.current && (
+        <Modal
+          title="Add connection"
+          isOpen={
+            isModalOpen &&
+            kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.RUNNING &&
+            !kieSandboxExtendedServices.isModalOpen
+          }
+          onClose={handleModalToggle}
+          variant={ModalVariant.large}
+          appendTo={props.pageContainerRef.current || document.body}
+        >
+          <Form>
+            <FormAlert>
+              <Alert
+                variant="danger"
+                title={
+                  <Text>
+                    You are not connected to KIE Sandbox Extended Services.{" "}
+                    <a
+                      onClick={() => {
+                        kieSandboxExtendedServices.setInstallTriggeredBy(undefined);
+                        kieSandboxExtendedServices.setModalOpen(true);
+                      }}
+                    >
+                      Click to setup
+                    </a>
+                  </Text>
+                }
+                aria-live="polite"
+                isInline
+              />
+            </FormAlert>
+            <PageSection variant={"light"} isFilled={true} style={{ height: "100%" }}>
+              <FormGroup
+                label={"Host"}
+                labelIcon={
+                  <Popover bodyContent={"The host associated with the KIE Sandbox Extended Services URL instance."}>
+                    <button
+                      type="button"
+                      aria-label="More info for host field"
+                      onClick={(e) => e.preventDefault()}
+                      aria-describedby="host-server-field"
+                      className="pf-c-form__group-label-help"
+                    >
+                      <HelpIcon noVerticalAlign />
+                    </button>
+                  </Popover>
+                }
+                isRequired
+                fieldId="host-server-field"
+              >
+                <InputGroup className="pf-u-mt-sm">
+                  <TextInput
+                    autoComplete={"off"}
+                    isRequired
+                    type="text"
+                    id="host-server-field"
+                    name="host-server-field"
+                    aria-label="Host field"
+                    aria-describedby="host-server-field-helper"
+                    value={config.host}
+                    onChange={onHostChanged}
+                    tabIndex={1}
+                    data-testid="host-text-field"
+                  />
+                  <InputGroupText>
+                    <Button isSmall variant="plain" aria-label="Clear host button" onClick={onClearHost}>
+                      <TimesIcon />
+                    </Button>
+                  </InputGroupText>
+                </InputGroup>
+              </FormGroup>
+              <FormGroup
+                label={"Port"}
+                labelIcon={
+                  <Popover
+                    bodyContent={"The port number associated with the KIE Sandbox Extended Services URL instance."}
                   >
-                    <HelpIcon noVerticalAlign />
-                  </button>
-                </Popover>
-              }
-              isRequired
-              fieldId="port-field"
-            >
-              <InputGroup className="pf-u-mt-sm">
-                <TextInput
-                  autoComplete={"off"}
-                  isRequired
-                  type="text"
-                  id="port-field"
-                  name="port-field"
-                  aria-label="Port field"
-                  aria-describedby="port-field-helper"
-                  value={config.port}
-                  onChange={onPortChanged}
-                  tabIndex={2}
-                  data-testid="port-text-field"
-                />
-                <InputGroupText>
-                  <Button isSmall variant="plain" aria-label="Clear port button" onClick={onClearPort}>
-                    <TimesIcon />
-                  </Button>
-                </InputGroupText>
-              </InputGroup>
-            </FormGroup>
-            <ActionGroup>
-              <Button
-                isDisabled={!isCurrentConfigValid}
-                id="kie-sandbox-extended-services-config-connect-button"
-                key="connect"
-                variant="primary"
-                onClick={onConnect}
-                data-testid="connect-config-button"
+                    <button
+                      type="button"
+                      aria-label="More info for port field"
+                      onClick={(e) => e.preventDefault()}
+                      aria-describedby="port-field"
+                      className="pf-c-form__group-label-help"
+                    >
+                      <HelpIcon noVerticalAlign />
+                    </button>
+                  </Popover>
+                }
+                isRequired
+                fieldId="port-field"
               >
-                Connect
-              </Button>
-              <Button key="cancel" variant="link" onClick={handleModalToggle} data-testid="connect-cancel-button">
-                Connect
-              </Button>
-            </ActionGroup>
-          </PageSection>
-        </Form>
-      </Modal>
+                <InputGroup className="pf-u-mt-sm">
+                  <TextInput
+                    autoComplete={"off"}
+                    isRequired
+                    type="text"
+                    id="port-field"
+                    name="port-field"
+                    aria-label="Port field"
+                    aria-describedby="port-field-helper"
+                    value={config.port}
+                    onChange={onPortChanged}
+                    tabIndex={2}
+                    data-testid="port-text-field"
+                  />
+                  <InputGroupText>
+                    <Button isSmall variant="plain" aria-label="Clear port button" onClick={onClearPort}>
+                      <TimesIcon />
+                    </Button>
+                  </InputGroupText>
+                </InputGroup>
+                <br />
+                <Button
+                  isInline={true}
+                  key="quickstart"
+                  variant="link"
+                  onClick={() => {
+                    qsContext.setActiveQuickStartID?.(QuickStartIds.OpenShiftIntegrationQuickStart);
+                    setTimeout(
+                      () => qsContext.setQuickStartTaskNumber?.(QuickStartIds.OpenShiftIntegrationQuickStart, 0),
+                      0
+                    );
+                  }}
+                >
+                  Need help getting started? Follow our quickstart guide.
+                </Button>
+              </FormGroup>
+              <ActionGroup>
+                <Button
+                  isDisabled={!isCurrentConfigValid}
+                  id="kie-sandbox-extended-services-config-connect-button"
+                  key="connect"
+                  variant="primary"
+                  onClick={onConnect}
+                  data-testid="connect-config-button"
+                >
+                  Connect
+                </Button>
+                <Button key="cancel" variant="link" onClick={handleModalToggle} data-testid="connect-cancel-button">
+                  Connect
+                </Button>
+              </ActionGroup>
+            </PageSection>
+          </Form>
+        </Modal>
+      )}
     </Page>
   );
 }
diff --git a/packages/serverless-logic-web-tools/src/newSettings/github/GitHubSettings.tsx b/packages/serverless-logic-web-tools/src/newSettings/github/GitHubSettings.tsx
index bd3be0578f..2a13d4dbc7 100644
--- a/packages/serverless-logic-web-tools/src/newSettings/github/GitHubSettings.tsx
+++ b/packages/serverless-logic-web-tools/src/newSettings/github/GitHubSettings.tsx
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+import { QuickStartContext, QuickStartContextValues } from "@patternfly/quickstarts";
 import { Modal, ModalVariant } from "@patternfly/react-core";
 import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
 import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
@@ -23,15 +24,16 @@ import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Pag
 import { Spinner } from "@patternfly/react-core/dist/js/components/Spinner";
 import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
 import { TextInput } from "@patternfly/react-core/dist/js/components/TextInput";
-import { AddCircleOIcon } from "@patternfly/react-icons";
-import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-circle-icon";
+import { AddCircleOIcon, CheckCircleIcon } from "@patternfly/react-icons";
 import { ExclamationTriangleIcon } from "@patternfly/react-icons/dist/js/icons/exclamation-triangle-icon";
 import { ExternalLinkAltIcon } from "@patternfly/react-icons/dist/js/icons/external-link-alt-icon";
 import { GithubIcon } from "@patternfly/react-icons/dist/js/icons/github-icon";
 import * as React from "react";
-import { useCallback, useMemo, useRef, useState } from "react";
+import { useCallback, useContext, useMemo, useRef, useState } from "react";
 import { makeCookieName } from "../../cookies";
+import { QuickStartIds } from "../../quickstarts-data";
 import { AuthStatus, useSettings, useSettingsDispatch } from "../../settings/SettingsContext";
+import { SettingsPageProps } from "../types";
 
 export const GITHUB_OAUTH_TOKEN_SIZE = 40;
 export const GITHUB_TOKENS_URL = "https://github.com/settings/tokens";
@@ -49,9 +51,10 @@ enum GitHubTokenScope {
   REPO = "repo",
 }
 
-export function GitHubSettings() {
+export function GitHubSettings(props: SettingsPageProps) {
   const settings = useSettings();
   const settingsDispatch = useSettingsDispatch();
+  const qsContext = useContext<QuickStartContextValues>(QuickStartContext);
 
   const [potentialGitHubToken, setPotentialGitHubToken] = useState<string | undefined>(undefined);
   const [isGitHubTokenValid, setIsGitHubTokenValid] = useState(true);
@@ -180,46 +183,63 @@ export function GitHubSettings() {
         </PageSection>
       </PageSection>
 
-      <Modal
-        title="Create new token"
-        isOpen={isModalOpen && settings.github.authStatus !== AuthStatus.LOADING}
-        onClose={handleModalToggle}
-        variant={ModalVariant.large}
-      >
-        <Form onSubmit={(e) => e.preventDefault()}>
-          <h3>
-            <a href={GITHUB_TOKENS_URL} target={"_blank"} rel="noopener noreferrer">
-              Create a new token&nbsp;&nbsp;
-              <ExternalLinkAltIcon />
-            </a>
-          </h3>
-          <FormGroup
-            isRequired={true}
-            helperTextInvalid={githubTokenHelperText}
-            validated={githubTokenValidated}
-            label={"Token"}
-            fieldId={"github-pat"}
-            helperText={"Your token must include the 'repo' scope."}
-          >
-            <InputGroup>
-              <TextInput
-                ref={tokenInput}
-                autoComplete={"off"}
-                id="token-input"
-                name="tokenInput"
-                aria-describedby="token-text-input-helper"
-                placeholder={"Paste your GitHub token here"}
-                maxLength={GITHUB_OAUTH_TOKEN_SIZE}
-                validated={githubTokenValidated}
-                value={githubTokenToDisplay}
-                onPaste={onPasteGitHubToken}
-                tabIndex={1}
-              />
-            </InputGroup>
-          </FormGroup>
-          <br />
-        </Form>
-      </Modal>
+      {props.pageContainerRef.current && (
+        <Modal
+          title="Create new token"
+          isOpen={isModalOpen && settings.github.authStatus !== AuthStatus.LOADING}
+          onClose={handleModalToggle}
+          variant={ModalVariant.large}
+          appendTo={props.pageContainerRef.current}
+        >
+          <Form onSubmit={(e) => e.preventDefault()}>
+            <h3>
+              <a href={GITHUB_TOKENS_URL} target={"_blank"} rel="noopener noreferrer">
+                Create a new token&nbsp;&nbsp;
+                <ExternalLinkAltIcon />
+              </a>
+            </h3>
+            <FormGroup
+              isRequired={true}
+              helperTextInvalid={githubTokenHelperText}
+              validated={githubTokenValidated}
+              label={"Token"}
+              fieldId={"github-pat"}
+              helperText={"Your token must include the 'repo' scope."}
+            >
+              <InputGroup>
+                <TextInput
+                  ref={tokenInput}
+                  autoComplete={"off"}
+                  id="token-input"
+                  name="tokenInput"
+                  aria-describedby="token-text-input-helper"
+                  placeholder={"Paste your GitHub token here"}
+                  maxLength={GITHUB_OAUTH_TOKEN_SIZE}
+                  validated={githubTokenValidated}
+                  value={githubTokenToDisplay}
+                  onPaste={onPasteGitHubToken}
+                  tabIndex={1}
+                />
+              </InputGroup>
+            </FormGroup>
+            <TextContent>
+              <Text>
+                <Button
+                  isInline={true}
+                  key="quickstart"
+                  variant="link"
+                  onClick={() => {
+                    qsContext.setActiveQuickStartID?.(QuickStartIds.GitHubTokenQuickStart);
+                    setTimeout(() => qsContext.setQuickStartTaskNumber?.(QuickStartIds.GitHubTokenQuickStart, 0), 0);
+                  }}
+                >
+                  Need help getting started? Follow our quickstart guide.
+                </Button>
+              </Text>
+            </TextContent>
+          </Form>
+        </Modal>
+      )}
     </Page>
   );
 }
diff --git a/packages/serverless-logic-web-tools/src/newSettings/kafka/ApacheKafkaSettings.tsx b/packages/serverless-logic-web-tools/src/newSettings/kafka/ApacheKafkaSettings.tsx
index 7df8cb63dd..241cdbc1a6 100644
--- a/packages/serverless-logic-web-tools/src/newSettings/kafka/ApacheKafkaSettings.tsx
+++ b/packages/serverless-logic-web-tools/src/newSettings/kafka/ApacheKafkaSettings.tsx
@@ -29,20 +29,24 @@ import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-cir
 import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
 import { TimesIcon } from "@patternfly/react-icons/dist/js/icons/times-icon";
 import * as React from "react";
-import { useCallback, useMemo, useState } from "react";
+import { useCallback, useMemo, useState, useContext } from "react";
 import { Link } from "react-router-dom";
 import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
 import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
 import { routes } from "../../navigation/Routes";
 import { useSettings, useSettingsDispatch } from "../SettingsContext";
 import { EMPTY_CONFIG, isKafkaConfigValid, resetConfigCookie, saveConfigCookie } from "./KafkaSettingsConfig";
+import { QuickStartContext, QuickStartContextValues } from "@patternfly/quickstarts";
+import { QuickStartIds } from "../../quickstarts-data";
+import { SettingsPageProps } from "../types";
 
-export function ApacheKafkaSettings() {
+export function ApacheKafkaSettings(props: SettingsPageProps) {
   const settings = useSettings();
   const settingsDispatch = useSettingsDispatch();
   const [config, setConfig] = useState(settings.apacheKafka.config);
   const kieSandboxExtendedServices = useKieSandboxExtendedServices();
   const [isModalOpen, setIsModalOpen] = useState(false);
+  const qsContext = useContext<QuickStartContextValues>(QuickStartContext);
 
   const handleModalToggle = useCallback(() => {
     setIsModalOpen((prevIsModalOpen) => !prevIsModalOpen);
@@ -159,139 +163,158 @@ export function ApacheKafkaSettings() {
         </PageSection>
       </PageSection>
 
-      <Modal
-        title="Add Streams for Apache Kafka"
-        isOpen={
-          isModalOpen &&
-          kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.STOPPED &&
-          !isStoredConfigValid
-        }
-        onClose={handleModalToggle}
-        variant={ModalVariant.large}
-      >
-        <Form>
-          {!isExtendedServicesRunning && (
-            <FormAlert>
-              <Alert
-                variant="danger"
-                title={
-                  <Text>
-                    Connect to{" "}
-                    <Link to={routes.settings.kie_sandbox_extended_services.path({})}>
-                      KIE Sandbox Extended Services
-                    </Link>{" "}
-                    before configuring your Streams for Apache Kafka instance
-                  </Text>
-                }
-                aria-live="polite"
-                isInline
-              />
-            </FormAlert>
-          )}
-          <FormGroup
-            label={"Bootstrap Server"}
-            labelIcon={
-              <Popover bodyContent={"The bootstrap server associated with your Streams for Apache Kafka instance."}>
-                <button
-                  type="button"
-                  aria-label="More info for bootstrap server field"
-                  onClick={(e) => e.preventDefault()}
-                  aria-describedby="bootstrap-server-field"
-                  className="pf-c-form__group-label-help"
-                >
-                  <HelpIcon noVerticalAlign />
-                </button>
-              </Popover>
-            }
-            isRequired
-            fieldId="bootstrap-server-field"
-          >
-            <InputGroup className="pf-u-mt-sm">
-              <TextInput
-                autoComplete={"off"}
-                isRequired
-                type="text"
-                id="bootstrap-server-field"
-                name="bootstrap-server-field"
-                aria-label="Bootstrap server field"
-                aria-describedby="bootstrap-server-field-helper"
-                value={config.bootstrapServer}
-                onChange={onBootstrapServerChanged}
-                tabIndex={1}
-                data-testid="bootstrap-server-text-field"
-              />
-              <InputGroupText>
-                <Button
-                  isSmall
-                  variant="plain"
-                  aria-label="Clear bootstrap server button"
-                  onClick={onClearBootstraServer}
-                >
-                  <TimesIcon />
-                </Button>
-              </InputGroupText>
-            </InputGroup>
-          </FormGroup>
-          <FormGroup
-            label={"Topic"}
-            labelIcon={
-              <Popover bodyContent={"The topic that messages will flow in."}>
-                <button
-                  type="button"
-                  aria-label="More info for topic field"
-                  onClick={(e) => e.preventDefault()}
-                  aria-describedby="topic-field"
-                  className="pf-c-form__group-label-help"
-                >
-                  <HelpIcon noVerticalAlign />
-                </button>
-              </Popover>
-            }
-            isRequired
-            fieldId="topic-field"
-          >
-            <InputGroup className="pf-u-mt-sm">
-              <TextInput
-                autoComplete={"off"}
-                isRequired
-                type="text"
-                id="topic-field"
-                name="topic-field"
-                aria-label="Topic field"
-                aria-describedby="topic-field-helper"
-                value={config.topic}
-                onChange={onTopicChanged}
-                tabIndex={2}
-                data-testid="topic-text-field"
-              />
-              <InputGroupText>
-                <Button isSmall variant="plain" aria-label="Clear topic button" onClick={onClearTopic}>
-                  <TimesIcon />
-                </Button>
-              </InputGroupText>
-            </InputGroup>
-          </FormGroup>
-          <TextContent>
-            <Text component={TextVariants.p}>
-              <b>Note</b>: You must also provide{" "}
-              <Link to={routes.settings.service_account.path({})}>Service Account</Link> so the connection with your
-              Streams for Apache Kafka instance can be properly established.
-            </Text>
-          </TextContent>
-          <ActionGroup>
-            <Button
-              isDisabled={!isCurrentConfigValid}
-              id="apache-kafka-config-apply-button"
-              key="save"
-              variant="primary"
-              onClick={onApply}
-              data-testid="apply-config-button"
+      {props.pageContainerRef.current && (
+        <Modal
+          title="Add Streams for Apache Kafka"
+          isOpen={
+            isModalOpen &&
+            kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.STOPPED &&
+            !isStoredConfigValid
+          }
+          onClose={handleModalToggle}
+          variant={ModalVariant.large}
+          appendTo={props.pageContainerRef.current || document.body}
+        >
+          <Form>
+            {!isExtendedServicesRunning && (
+              <FormAlert>
+                <Alert
+                  variant="danger"
+                  title={
+                    <Text>
+                      Connect to{" "}
+                      <Link to={routes.settings.kie_sandbox_extended_services.path({})}>
+                        KIE Sandbox Extended Services
+                      </Link>{" "}
+                      before configuring your Streams for Apache Kafka instance
+                    </Text>
+                  }
+                  aria-live="polite"
+                  isInline
+                />
+              </FormAlert>
+            )}
+            <FormGroup
+              label={"Bootstrap Server"}
+              labelIcon={
+                <Popover bodyContent={"The bootstrap server associated with your Streams for Apache Kafka instance."}>
+                  <button
+                    type="button"
+                    aria-label="More info for bootstrap server field"
+                    onClick={(e) => e.preventDefault()}
+                    aria-describedby="bootstrap-server-field"
+                    className="pf-c-form__group-label-help"
+                  >
+                    <HelpIcon noVerticalAlign />
+                  </button>
+                </Popover>
+              }
+              isRequired
+              fieldId="bootstrap-server-field"
+            >
+              <InputGroup className="pf-u-mt-sm">
+                <TextInput
+                  autoComplete={"off"}
+                  isRequired
+                  type="text"
+                  id="bootstrap-server-field"
+                  name="bootstrap-server-field"
+                  aria-label="Bootstrap server field"
+                  aria-describedby="bootstrap-server-field-helper"
+                  value={config.bootstrapServer}
+                  onChange={onBootstrapServerChanged}
+                  tabIndex={1}
+                  data-testid="bootstrap-server-text-field"
+                />
+                <InputGroupText>
+                  <Button
+                    isSmall
+                    variant="plain"
+                    aria-label="Clear bootstrap server button"
+                    onClick={onClearBootstraServer}
+                  >
+                    <TimesIcon />
+                  </Button>
+                </InputGroupText>
+              </InputGroup>
+            </FormGroup>
+            <FormGroup
+              label={"Topic"}
+              labelIcon={
+                <Popover bodyContent={"The topic that messages will flow in."}>
+                  <button
+                    type="button"
+                    aria-label="More info for topic field"
+                    onClick={(e) => e.preventDefault()}
+                    aria-describedby="topic-field"
+                    className="pf-c-form__group-label-help"
+                  >
+                    <HelpIcon noVerticalAlign />
+                  </button>
+                </Popover>
+              }
+              isRequired
+              fieldId="topic-field"
             >
-              Apply
-            </Button>
-          </ActionGroup>
-        </Form>
-      </Modal>
+              <InputGroup className="pf-u-mt-sm">
+                <TextInput
+                  autoComplete={"off"}
+                  isRequired
+                  type="text"
+                  id="topic-field"
+                  name="topic-field"
+                  aria-label="Topic field"
+                  aria-describedby="topic-field-helper"
+                  value={config.topic}
+                  onChange={onTopicChanged}
+                  tabIndex={2}
+                  data-testid="topic-text-field"
+                />
+                <InputGroupText>
+                  <Button isSmall variant="plain" aria-label="Clear topic button" onClick={onClearTopic}>
+                    <TimesIcon />
+                  </Button>
+                </InputGroupText>
+              </InputGroup>
+            </FormGroup>
+            <TextContent>
+              <Text component={TextVariants.p}>
+                <b>Note</b>: You must also provide{" "}
+                <Link to={routes.settings.service_account.path({})}>Service Account</Link> so the connection with your
+                Streams for Apache Kafka instance can be properly established.
+              </Text>
+              <br />
+              <Button
+                isInline={true}
+                key="quickstart"
+                variant="link"
+                onClick={() => {
+                  qsContext.setActiveQuickStartID?.(QuickStartIds.ApplicationServicesIntegrationQuickStart);
+                  setTimeout(
+                    () =>
+                      qsContext.setQuickStartTaskNumber?.(QuickStartIds.ApplicationServicesIntegrationQuickStart, 2),
+                    0
+                  );
+                }}
+              >
+                Need help getting started? Follow our quickstart guide.
+              </Button>
+            </TextContent>
+            <ActionGroup>
+              <Button
+                isDisabled={!isCurrentConfigValid}
+                id="apache-kafka-config-apply-button"
+                key="save"
+                variant="primary"
+                onClick={onApply}
+                data-testid="apply-config-button"
+              >
+                Apply
+              </Button>
+            </ActionGroup>
+          </Form>
+        </Modal>
+      )}
     </Page>
   );
 }
diff --git a/packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettings.tsx b/packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettings.tsx
index 8454b667cd..3accf80c6a 100644
--- a/packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettings.tsx
+++ b/packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettings.tsx
@@ -32,10 +32,11 @@ import { routes } from "../../navigation/Routes";
 import { OpenShiftInstanceStatus } from "../../openshift/OpenShiftInstanceStatus";
 import { obfuscate } from "../github/GitHubSettings";
 import { useSettings, useSettingsDispatch } from "../SettingsContext";
+import { SettingsPageProps } from "../types";
 import { saveConfigCookie } from "./OpenShiftSettingsConfig";
 import { OpenShiftSettingsSimpleConfig } from "./OpenShiftSettingsSimpleConfig";
 
-export function OpenShiftSettings() {
+export function OpenShiftSettings(props: SettingsPageProps) {
   const settings = useSettings();
   const settingsDispatch = useSettingsDispatch();
   const [isModalOpen, setIsModalOpen] = useState(false);
@@ -133,19 +134,22 @@ export function OpenShiftSettings() {
         </PageSection>
       </PageSection>
 
-      <Modal
-        title="Add connection"
-        isOpen={
-          isModalOpen &&
-          kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.STOPPED &&
-          (settings.openshift.status === OpenShiftInstanceStatus.DISCONNECTED ||
-            settings.openshift.status === OpenShiftInstanceStatus.EXPIRED)
-        }
-        onClose={handleModalToggle}
-        variant={ModalVariant.large}
-      >
-        <OpenShiftSettingsSimpleConfig />
-      </Modal>
+      {props.pageContainerRef.current && (
+        <Modal
+          title="Add connection"
+          isOpen={
+            isModalOpen &&
+            kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.STOPPED &&
+            (settings.openshift.status === OpenShiftInstanceStatus.DISCONNECTED ||
+              settings.openshift.status === OpenShiftInstanceStatus.EXPIRED)
+          }
+          onClose={handleModalToggle}
+          variant={ModalVariant.large}
+          appendTo={props.pageContainerRef.current || document.body}
+        >
+          <OpenShiftSettingsSimpleConfig />
+        </Modal>
+      )}
     </Page>
   );
 }
diff --git a/packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettingsSimpleConfig.tsx b/packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettingsSimpleConfig.tsx
index 4069b01132..b652885b4f 100644
--- a/packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettingsSimpleConfig.tsx
+++ b/packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettingsSimpleConfig.tsx
@@ -18,6 +18,7 @@ import {
   isOpenShiftConnectionValid,
   OpenShiftConnection,
 } from "@kie-tools-core/openshift/dist/service/OpenShiftConnection";
+import { QuickStartContext, QuickStartContextValues } from "@patternfly/quickstarts";
 import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
 import { Button } from "@patternfly/react-core/dist/js/components/Button";
 import { ActionGroup, Form, FormAlert, FormGroup } from "@patternfly/react-core/dist/js/components/Form";
@@ -28,13 +29,14 @@ import { TextInput } from "@patternfly/react-core/dist/js/components/TextInput";
 import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
 import { TimesIcon } from "@patternfly/react-icons/dist/js/icons/times-icon";
 import * as React from "react";
-import { useCallback, useEffect, useState } from "react";
+import { useCallback, useEffect, useState, useContext } from "react";
 import { Link } from "react-router-dom";
 import { useAppI18n } from "../../i18n";
 import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
 import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
 import { routes } from "../../navigation/Routes";
 import { OpenShiftInstanceStatus } from "../../openshift/OpenShiftInstanceStatus";
+import { QuickStartIds } from "../../quickstarts-data";
 import { useSettings, useSettingsDispatch } from "../SettingsContext";
 import { EMPTY_CONFIG, saveConfigCookie } from "./OpenShiftSettingsConfig";
 
@@ -53,6 +55,7 @@ export function OpenShiftSettingsSimpleConfig() {
   const [isConfigValidated, setConfigValidated] = useState(FormValiationOptions.INITIAL);
   const [isConnecting, setConnecting] = useState(false);
   const kieSandboxExtendedServices = useKieSandboxExtendedServices();
+  const qsContext = useContext<QuickStartContextValues>(QuickStartContext);
 
   useEffect(() => {
     setConfig(settings.openshift.config);
@@ -298,6 +301,18 @@ export function OpenShiftSettingsSimpleConfig() {
               </Button>
             </InputGroupText>
           </InputGroup>
+          <br />
+          <Button
+            isInline={true}
+            key="quickstart"
+            variant="link"
+            onClick={() => {
+              qsContext.setActiveQuickStartID?.(QuickStartIds.OpenShiftIntegrationQuickStart);
+              setTimeout(() => qsContext.setQuickStartTaskNumber?.(QuickStartIds.OpenShiftIntegrationQuickStart, 1), 0);
+            }}
+          >
+            Need help getting started? Follow our quickstart guide.
+          </Button>
         </FormGroup>
         <ActionGroup>
           <Button
diff --git a/packages/serverless-logic-web-tools/src/newSettings/routes/SettingsPageRoutes.tsx b/packages/serverless-logic-web-tools/src/newSettings/routes/SettingsPageRoutes.tsx
index 56f678e3b0..f7b7c9f7a4 100644
--- a/packages/serverless-logic-web-tools/src/newSettings/routes/SettingsPageRoutes.tsx
+++ b/packages/serverless-logic-web-tools/src/newSettings/routes/SettingsPageRoutes.tsx
@@ -25,28 +25,33 @@ import { ApacheKafkaSettings } from "../kafka/ApacheKafkaSettings";
 import { OpenShiftSettings } from "../openshift/OpenShiftSettings";
 import { ServiceAccountSettings } from "../serviceAccount/ServiceAccountSettings";
 import { ServiceRegistrySettings } from "../serviceRegistry/ServiceRegistrySettings";
+import { SettingsPageProps } from "../types";
 
-export function SettingsPageRoutes() {
+export function SettingsPageRoutes(props: {} & SettingsPageProps) {
   const routes = useRoutes();
+  const settingsPageProps: SettingsPageProps = {
+    pageContainerRef: props.pageContainerRef,
+  };
+
   return (
     <Switch>
       <Route path={routes.settings.github.path({})}>
-        <GitHubSettings />
+        <GitHubSettings {...settingsPageProps} />
       </Route>
       <Route path={routes.settings.kie_sandbox_extended_services.path({})}>
-        <KieSandboxExtendedServicesSettings />
+        <KieSandboxExtendedServicesSettings {...settingsPageProps} />
       </Route>
       <Route path={routes.settings.openshift.path({})}>
-        <OpenShiftSettings />
+        <OpenShiftSettings {...settingsPageProps} />
       </Route>
       <Route path={routes.settings.service_account.path({})}>
-        <ServiceAccountSettings />
+        <ServiceAccountSettings {...settingsPageProps} />
       </Route>
       <Route path={routes.settings.service_registry.path({})}>
-        <ServiceRegistrySettings />
+        <ServiceRegistrySettings {...settingsPageProps} />
       </Route>
       <Route path={routes.settings.kafka.path({})}>
-        <ApacheKafkaSettings />
+        <ApacheKafkaSettings {...settingsPageProps} />
       </Route>
       <Route path={routes.settings.feature_preview.path({})}>
         <FeaturePreviewSettings />
diff --git a/packages/serverless-logic-web-tools/src/newSettings/serviceAccount/ServiceAccountSettings.tsx b/packages/serverless-logic-web-tools/src/newSettings/serviceAccount/ServiceAccountSettings.tsx
index 5b7ebde91e..eab5c20a0e 100644
--- a/packages/serverless-logic-web-tools/src/newSettings/serviceAccount/ServiceAccountSettings.tsx
+++ b/packages/serverless-logic-web-tools/src/newSettings/serviceAccount/ServiceAccountSettings.tsx
@@ -29,20 +29,24 @@ import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-cir
 import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
 import { TimesIcon } from "@patternfly/react-icons/dist/js/icons/times-icon";
 import * as React from "react";
-import { useCallback, useMemo, useState } from "react";
+import { useCallback, useMemo, useState, useContext } from "react";
 import { Link } from "react-router-dom";
 import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
 import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
 import { routes } from "../../navigation/Routes";
 import { useSettings, useSettingsDispatch } from "../SettingsContext";
+import { SettingsPageProps } from "../types";
 import { EMPTY_CONFIG, isServiceAccountConfigValid, resetConfigCookie, saveConfigCookie } from "./ServiceAccountConfig";
+import { QuickStartContext, QuickStartContextValues } from "@patternfly/quickstarts";
+import { QuickStartIds } from "../../quickstarts-data";
 
-export function ServiceAccountSettings() {
+export function ServiceAccountSettings(props: SettingsPageProps) {
   const settings = useSettings();
   const settingsDispatch = useSettingsDispatch();
   const [config, setConfig] = useState(settings.serviceAccount.config);
   const kieSandboxExtendedServices = useKieSandboxExtendedServices();
   const [isModalOpen, setIsModalOpen] = useState(false);
+  const qsContext = useContext<QuickStartContextValues>(QuickStartContext);
 
   const handleModalToggle = useCallback(() => {
     setIsModalOpen((prevIsModalOpen) => !prevIsModalOpen);
@@ -167,127 +171,146 @@ export function ServiceAccountSettings() {
         </PageSection>
       </PageSection>
 
-      <Modal
-        title="Add Service Account"
-        isOpen={
-          isModalOpen &&
-          kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.STOPPED &&
-          !isStoredConfigValid
-        }
-        onClose={handleModalToggle}
-        variant={ModalVariant.large}
-      >
-        <Form>
-          {!isExtendedServicesRunning && (
-            <FormAlert>
-              <Alert
-                variant="danger"
-                title={
-                  <Text>
-                    Connect to{" "}
-                    <Link to={routes.settings.kie_sandbox_extended_services.path({})}>
-                      KIE Sandbox Extended Services
-                    </Link>{" "}
-                    before configuring your Service Account
-                  </Text>
-                }
-                aria-live="polite"
-                isInline
-              />
-            </FormAlert>
-          )}
-          <FormGroup
-            label={"Client ID"}
-            labelIcon={
-              <Popover bodyContent={"Client ID"}>
-                <button
-                  type="button"
-                  aria-label="More info for client id field"
-                  onClick={(e) => e.preventDefault()}
-                  aria-describedby="client-id-field"
-                  className="pf-c-form__group-label-help"
-                >
-                  <HelpIcon noVerticalAlign />
-                </button>
-              </Popover>
-            }
-            isRequired
-            fieldId="client-id-field"
-          >
-            <InputGroup className="pf-u-mt-sm">
-              <TextInput
-                autoComplete={"off"}
-                isRequired
-                type="text"
-                id="client-id-field"
-                name="client-id-field"
-                aria-label="Client ID field"
-                aria-describedby="client-id-field-helper"
-                value={config.clientId}
-                onChange={onClientIdChanged}
-                tabIndex={1}
-                data-testid="client-id-text-field"
-              />
-              <InputGroupText>
-                <Button isSmall variant="plain" aria-label="Clear client id button" onClick={onClearClientId}>
-                  <TimesIcon />
-                </Button>
-              </InputGroupText>
-            </InputGroup>
-          </FormGroup>
-          <FormGroup
-            label={"Client Secret"}
-            labelIcon={
-              <Popover bodyContent={"Client Secret"}>
-                <button
-                  type="button"
-                  aria-label="More info for client secret field"
-                  onClick={(e) => e.preventDefault()}
-                  aria-describedby="client-secret-field"
-                  className="pf-c-form__group-label-help"
-                >
-                  <HelpIcon noVerticalAlign />
-                </button>
-              </Popover>
-            }
-            isRequired
-            fieldId="client-secret-field"
-          >
-            <InputGroup className="pf-u-mt-sm">
-              <TextInput
-                autoComplete={"off"}
-                isRequired
-                type="text"
-                id="client-secret-field"
-                name="client-secret-field"
-                aria-label="Client secret field"
-                aria-describedby="client-secret-field-helper"
-                value={config.clientSecret}
-                onChange={onClientSecretChanged}
-                tabIndex={2}
-                data-testid="client-secret-text-field"
-              />
-              <InputGroupText>
-                <Button isSmall variant="plain" aria-label="Clear client secret button" onClick={onClearClientSecret}>
-                  <TimesIcon />
-                </Button>
-              </InputGroupText>
-            </InputGroup>
-          </FormGroup>
-          <ActionGroup>
-            <Button
-              isDisabled={!isCurrentConfigValid}
-              id="service-account-config-apply-button"
-              key="save"
-              variant="primary"
-              onClick={onApply}
-              data-testid="apply-config-button"
+      {props.pageContainerRef.current && (
+        <Modal
+          title="Add Service Account"
+          isOpen={
+            isModalOpen &&
+            kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.STOPPED &&
+            !isStoredConfigValid
+          }
+          onClose={handleModalToggle}
+          variant={ModalVariant.large}
+          appendTo={props.pageContainerRef.current || document.body}
+        >
+          <Form>
+            {!isExtendedServicesRunning && (
+              <FormAlert>
+                <Alert
+                  variant="danger"
+                  title={
+                    <Text>
+                      Connect to{" "}
+                      <Link to={routes.settings.kie_sandbox_extended_services.path({})}>
+                        KIE Sandbox Extended Services
+                      </Link>{" "}
+                      before configuring your Service Account
+                    </Text>
+                  }
+                  aria-live="polite"
+                  isInline
+                />
+              </FormAlert>
+            )}
+            <FormGroup
+              label={"Client ID"}
+              labelIcon={
+                <Popover bodyContent={"Client ID"}>
+                  <button
+                    type="button"
+                    aria-label="More info for client id field"
+                    onClick={(e) => e.preventDefault()}
+                    aria-describedby="client-id-field"
+                    className="pf-c-form__group-label-help"
+                  >
+                    <HelpIcon noVerticalAlign />
+                  </button>
+                </Popover>
+              }
+              isRequired
+              fieldId="client-id-field"
+            >
+              <InputGroup className="pf-u-mt-sm">
+                <TextInput
+                  autoComplete={"off"}
+                  isRequired
+                  type="text"
+                  id="client-id-field"
+                  name="client-id-field"
+                  aria-label="Client ID field"
+                  aria-describedby="client-id-field-helper"
+                  value={config.clientId}
+                  onChange={onClientIdChanged}
+                  tabIndex={1}
+                  data-testid="client-id-text-field"
+                />
+                <InputGroupText>
+                  <Button isSmall variant="plain" aria-label="Clear client id button" onClick={onClearClientId}>
+                    <TimesIcon />
+                  </Button>
+                </InputGroupText>
+              </InputGroup>
+            </FormGroup>
+            <FormGroup
+              label={"Client Secret"}
+              labelIcon={
+                <Popover bodyContent={"Client Secret"}>
+                  <button
+                    type="button"
+                    aria-label="More info for client secret field"
+                    onClick={(e) => e.preventDefault()}
+                    aria-describedby="client-secret-field"
+                    className="pf-c-form__group-label-help"
+                  >
+                    <HelpIcon noVerticalAlign />
+                  </button>
+                </Popover>
+              }
+              isRequired
+              fieldId="client-secret-field"
             >
-              Apply
-            </Button>
-          </ActionGroup>
-        </Form>
-      </Modal>
+              <InputGroup className="pf-u-mt-sm">
+                <TextInput
+                  autoComplete={"off"}
+                  isRequired
+                  type="text"
+                  id="client-secret-field"
+                  name="client-secret-field"
+                  aria-label="Client secret field"
+                  aria-describedby="client-secret-field-helper"
+                  value={config.clientSecret}
+                  onChange={onClientSecretChanged}
+                  tabIndex={2}
+                  data-testid="client-secret-text-field"
+                />
+                <InputGroupText>
+                  <Button isSmall variant="plain" aria-label="Clear client secret button" onClick={onClearClientSecret}>
+                    <TimesIcon />
+                  </Button>
+                </InputGroupText>
+              </InputGroup>
+              <br />
+              <Button
+                isInline={true}
+                key="quickstart"
+                variant="link"
+                onClick={() => {
+                  qsContext.setActiveQuickStartID?.(QuickStartIds.ApplicationServicesIntegrationQuickStart);
+                  setTimeout(
+                    () =>
+                      qsContext.setQuickStartTaskNumber?.(QuickStartIds.ApplicationServicesIntegrationQuickStart, 0),
+                    0
+                  );
+                }}
+              >
+                Need help getting started? Follow our quickstart guide.
+              </Button>
+            </FormGroup>
+            <ActionGroup>
+              <Button
+                isDisabled={!isCurrentConfigValid}
+                id="service-account-config-apply-button"
+                key="save"
+                variant="primary"
+                onClick={onApply}
+                data-testid="apply-config-button"
+              >
+                Apply
+              </Button>
+            </ActionGroup>
+          </Form>
+        </Modal>
+      )}
     </Page>
   );
 }
diff --git a/packages/serverless-logic-web-tools/src/newSettings/serviceRegistry/ServiceRegistrySettings.tsx b/packages/serverless-logic-web-tools/src/newSettings/serviceRegistry/ServiceRegistrySettings.tsx
index 2a4f4e5bfc..0954800caa 100644
--- a/packages/serverless-logic-web-tools/src/newSettings/serviceRegistry/ServiceRegistrySettings.tsx
+++ b/packages/serverless-logic-web-tools/src/newSettings/serviceRegistry/ServiceRegistrySettings.tsx
@@ -29,7 +29,7 @@ import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-cir
 import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
 import { TimesIcon } from "@patternfly/react-icons/dist/js/icons/times-icon";
 import * as React from "react";
-import { useCallback, useMemo, useState } from "react";
+import { useCallback, useMemo, useState, useContext } from "react";
 import { Link } from "react-router-dom";
 import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
 import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
@@ -41,13 +41,17 @@ import {
   resetConfigCookie,
   saveConfigCookie,
 } from "./ServiceRegistryConfig";
+import { QuickStartContext, QuickStartContextValues } from "@patternfly/quickstarts";
+import { QuickStartIds } from "../../quickstarts-data";
+import { SettingsPageProps } from "../types";
 
-export function ServiceRegistrySettings() {
+export function ServiceRegistrySettings(props: SettingsPageProps) {
   const settings = useSettings();
   const settingsDispatch = useSettingsDispatch();
   const [config, setConfig] = useState(settings.serviceRegistry.config);
   const kieSandboxExtendedServices = useKieSandboxExtendedServices();
   const [isModalOpen, setIsModalOpen] = useState(false);
+  const qsContext = useContext<QuickStartContextValues>(QuickStartContext);
 
   const handleModalToggle = useCallback(() => {
     setIsModalOpen((prevIsModalOpen) => !prevIsModalOpen);
@@ -165,141 +169,158 @@ export function ServiceRegistrySettings() {
         </PageSection>
       </PageSection>
 
-      <Modal
-        title="Add Service Registry"
-        isOpen={
-          isModalOpen &&
-          kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.STOPPED &&
-          !isStoredConfigValid
-        }
-        onClose={handleModalToggle}
-        variant={ModalVariant.large}
-      >
-        <Form>
-          {!isExtendedServicesRunning && (
-            <FormAlert>
-              <Alert
-                variant="danger"
-                title={
-                  <Text>
-                    Connect to{" "}
-                    <Link to={routes.settings.kie_sandbox_extended_services.path({})}>
-                      KIE Sandbox Extended Services
-                    </Link>{" "}
-                    before configuring your Service Registry instance
-                  </Text>
-                }
-                aria-live="polite"
-                isInline
-              />
-            </FormAlert>
-          )}
-          <FormGroup
-            label={"Name"}
-            labelIcon={
-              <Popover
-                bodyContent={"Name to identify your Service Registry instance across the Serverless Logic Web Tools."}
-              >
-                <button
-                  type="button"
-                  aria-label="More info for name field"
-                  onClick={(e) => e.preventDefault()}
-                  aria-describedby="name-field"
-                  className="pf-c-form__group-label-help"
-                >
-                  <HelpIcon noVerticalAlign />
-                </button>
-              </Popover>
-            }
-            isRequired
-            fieldId="name-field"
-          >
-            <InputGroup className="pf-u-mt-sm">
-              <TextInput
-                autoComplete={"off"}
-                isRequired
-                type="text"
-                id="name-field"
-                name="name-field"
-                aria-label="Name field"
-                aria-describedby="name-field-helper"
-                value={config.name}
-                onChange={onNameChanged}
-                tabIndex={1}
-                data-testid="name-text-field"
-              />
-              <InputGroupText>
-                <Button isSmall variant="plain" aria-label="Clear name button" onClick={onClearName}>
-                  <TimesIcon />
-                </Button>
-              </InputGroupText>
-            </InputGroup>
-          </FormGroup>
-          <FormGroup
-            label={"Core Registry API"}
-            labelIcon={
-              <Popover bodyContent={"Core Registry API URL associated with your Service Registry instance."}>
-                <button
-                  type="button"
-                  aria-label="More info for core registry api field"
-                  onClick={(e) => e.preventDefault()}
-                  aria-describedby="core-registry-api-field"
-                  className="pf-c-form__group-label-help"
-                >
-                  <HelpIcon noVerticalAlign />
-                </button>
-              </Popover>
-            }
-            isRequired
-            fieldId="core-registry-api-field"
-          >
-            <InputGroup className="pf-u-mt-sm">
-              <TextInput
-                autoComplete={"off"}
-                isRequired
-                type="text"
-                id="core-registry-api-field"
-                name="core-registry-api-field"
-                aria-label="Core Registry API field"
-                aria-describedby="core-registry-api-field-helper"
-                value={config.coreRegistryApi}
-                onChange={onCoreRegistryApiChanged}
-                tabIndex={2}
-                data-testid="core-registry-api-text-field"
-              />
-              <InputGroupText>
-                <Button
-                  isSmall
-                  variant="plain"
-                  aria-label="Clear core registry api button"
-                  onClick={onClearCoreRegistryApi}
+      {props.pageContainerRef.current && (
+        <Modal
+          title="Add Service Registry"
+          isOpen={
+            isModalOpen &&
+            kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.STOPPED &&
+            !isStoredConfigValid
+          }
+          onClose={handleModalToggle}
+          variant={ModalVariant.large}
+          appendTo={props.pageContainerRef.current || document.body}
+        >
+          <Form>
+            {!isExtendedServicesRunning && (
+              <FormAlert>
+                <Alert
+                  variant="danger"
+                  title={
+                    <Text>
+                      Connect to{" "}
+                      <Link to={routes.settings.kie_sandbox_extended_services.path({})}>
+                        KIE Sandbox Extended Services
+                      </Link>{" "}
+                      before configuring your Service Registry instance
+                    </Text>
+                  }
+                  aria-live="polite"
+                  isInline
+                />
+              </FormAlert>
+            )}
+            <FormGroup
+              label={"Name"}
+              labelIcon={
+                <Popover
+                  bodyContent={"Name to identify your Service Registry instance across the Serverless Logic Web Tools."}
                 >
-                  <TimesIcon />
-                </Button>
-              </InputGroupText>
-            </InputGroup>
-          </FormGroup>
-          <TextContent>
-            <Text component={TextVariants.p}>
-              <b>Note</b>: You must also provide{" "}
-              <Link to={routes.settings.service_account.path({})}>Service Account</Link> so the connection with your
-              Service Registry instance can be properly established.
-            </Text>
-          </TextContent>
-          <ActionGroup>
+                  <button
+                    type="button"
+                    aria-label="More info for name field"
+                    onClick={(e) => e.preventDefault()}
+                    aria-describedby="name-field"
+                    className="pf-c-form__group-label-help"
+                  >
+                    <HelpIcon noVerticalAlign />
+                  </button>
+                </Popover>
+              }
+              isRequired
+              fieldId="name-field"
+            >
+              <InputGroup className="pf-u-mt-sm">
+                <TextInput
+                  autoComplete={"off"}
+                  isRequired
+                  type="text"
+                  id="name-field"
+                  name="name-field"
+                  aria-label="Name field"
+                  aria-describedby="name-field-helper"
+                  value={config.name}
+                  onChange={onNameChanged}
+                  tabIndex={1}
+                  data-testid="name-text-field"
+                />
+                <InputGroupText>
+                  <Button isSmall variant="plain" aria-label="Clear name button" onClick={onClearName}>
+                    <TimesIcon />
+                  </Button>
+                </InputGroupText>
+              </InputGroup>
+            </FormGroup>
+            <FormGroup
+              label={"Core Registry API"}
+              labelIcon={
+                <Popover bodyContent={"Core Registry API URL associated with your Service Registry instance."}>
+                  <button
+                    type="button"
+                    aria-label="More info for core registry api field"
+                    onClick={(e) => e.preventDefault()}
+                    aria-describedby="core-registry-api-field"
+                    className="pf-c-form__group-label-help"
+                  >
+                    <HelpIcon noVerticalAlign />
+                  </button>
+                </Popover>
+              }
+              isRequired
+              fieldId="core-registry-api-field"
+            >
+              <InputGroup className="pf-u-mt-sm">
+                <TextInput
+                  autoComplete={"off"}
+                  isRequired
+                  type="text"
+                  id="core-registry-api-field"
+                  name="core-registry-api-field"
+                  aria-label="Core Registry API field"
+                  aria-describedby="core-registry-api-field-helper"
+                  value={config.coreRegistryApi}
+                  onChange={onCoreRegistryApiChanged}
+                  tabIndex={2}
+                  data-testid="core-registry-api-text-field"
+                />
+                <InputGroupText>
+                  <Button
+                    isSmall
+                    variant="plain"
+                    aria-label="Clear core registry api button"
+                    onClick={onClearCoreRegistryApi}
+                  >
+                    <TimesIcon />
+                  </Button>
+                </InputGroupText>
+              </InputGroup>
+            </FormGroup>
+            <TextContent>
+              <Text component={TextVariants.p}>
+                <b>Note</b>: You must also provide{" "}
+                <Link to={routes.settings.service_account.path({})}>Service Account</Link> so the connection with your
+                Service Registry instance can be properly established.
+              </Text>
+            </TextContent>
             <Button
-              isDisabled={!isCurrentConfigValid}
-              id="service-registry-config-apply-button"
-              key="save"
-              variant="primary"
-              onClick={onApply}
-              data-testid="apply-config-button"
+              isInline={true}
+              key="quickstart"
+              variant="link"
+              onClick={() => {
+                qsContext.setActiveQuickStartID?.(QuickStartIds.ApplicationServicesIntegrationQuickStart);
+                setTimeout(
+                  () => qsContext.setQuickStartTaskNumber?.(QuickStartIds.ApplicationServicesIntegrationQuickStart, 1),
+                  0
+                );
+              }}
             >
-              Apply
+              Need help getting started? Follow our quickstart guide.
             </Button>
-          </ActionGroup>
-        </Form>
-      </Modal>
+            <ActionGroup>
+              <Button
+                isDisabled={!isCurrentConfigValid}
+                id="service-registry-config-apply-button"
+                key="save"
+                variant="primary"
+                onClick={onApply}
+                data-testid="apply-config-button"
+              >
+                Apply
+              </Button>
+            </ActionGroup>
+          </Form>
+        </Modal>
+      )}
     </Page>
   );
 }
diff --git a/packages/serverless-logic-web-tools/src/newSettings/types.ts b/packages/serverless-logic-web-tools/src/newSettings/types.ts
new file mode 100644
index 0000000000..a0c1c94881
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/newSettings/types.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export type SettingsPageProps = { pageContainerRef: React.RefObject<HTMLDivElement> };
diff --git a/packages/serverless-logic-web-tools/src/quickstarts-data/ApplicationServicesIntegrationQuickStart.ts b/packages/serverless-logic-web-tools/src/quickstarts-data/ApplicationServicesIntegrationQuickStart.ts
new file mode 100644
index 0000000000..38e0974f29
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/quickstarts-data/ApplicationServicesIntegrationQuickStart.ts
@@ -0,0 +1,421 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { QuickStart } from "@patternfly/quickstarts";
+
+export const ApplicationServicesIntegrationQuickStart: QuickStart = {
+  metadata: {
+    name: "serverless-logic-web-tools-redhat-application-services-integration",
+    instructional: true,
+  },
+  spec: {
+    icon: null,
+    displayName: "Integrating with Red Hat OpenShift Application and Data Services",
+    durationMinutes: 30,
+    prerequisites: ["You have access to the Red Hat OpenShift Application and Data Services console."],
+    description: "",
+    introduction: ` Some of the features in Serverless Logic Web Tools require integration with Red Hat OpenShift Application and Data Services. Consider uploading OpenAPI specifications to a service registry and deploying Serverless Workflow that requires Apache Kafka as examples of integration with Red Hat OpenShift Application and Data Services.
+
+This document describes how you can configure the required settings to complete the integration with Red Hat OpenShift Application and Data Services.  `,
+
+    conclusion: `**Found an issue?**
+
+If you find an issue or any misleading information, please feel free to report it [here](https://github.com/kiegroup/kogito-docs/issues/new). We really appreciate it!`,
+
+    tasks: [
+      {
+        title: "Creating a service account in Red Hat OpenShift application and Data Services",
+        description: `<div class="sectionbody">
+          <div class="paragraph">
+            <p>You can create or use a service account from your Red Hat OpenShift Application and Data Services console and add the service account to the Serverless Logic Web Tools.</p>
+          </div>
+          <div class="ulist">
+            <div class="title">
+              <strong>
+                <em>Prerequisites</em>
+              </strong>
+            </div>
+            <ul>
+              <li>
+                <p>You have access to the Red Hat OpenShift Application and Data Services console.</p>
+              </li>
+            </ul>
+          </div>
+          <div class="olist arabic">
+            <div class="title">
+              <strong>
+                <em>Procedure</em>
+              </strong>
+            </div>
+            <ol class="arabic">
+              <li>
+                <p>To create a service account in Red Hat Openshift Application and Data Services, perform the following steps:</p>
+                <div class="openblock">
+                  <div class="content">
+                    <div class="admonitionblock note">
+                      <table>
+                        <tbody>
+                          <tr>
+                            <td class="icon">
+                              <i class="fa icon-note" title="Note"></i>
+                            </td>
+                            <td class="content">
+                              <div class="paragraph">
+                                <p>
+                                  <b>NOTE</b>
+                                  <br />You can skip this step if you already have a service account.
+                                </p>
+                              </div>
+                            </td>
+                          </tr>
+                        </tbody>
+                      </table>
+                    </div>
+                    <div class="olist loweralpha">
+                      <ol class="loweralpha" type="a">
+                        <li>
+                          <p>Go to <a href="https://console.redhat.com/application-services/service-accounts">Service Accounts | Red Hat OpenShift Application and Data Services</a>. </p>
+                        </li>
+                        <li>
+                          <p>Click <strong>Create service account</strong>. </p>
+                        </li>
+                        <li>
+                          <p>In the <strong>Create a service account</strong> window, enter a service account name in the <strong>Short description</strong> field. </p>
+                        </li>
+                        <li>
+                          <p>Click <strong>Create</strong>. </p>
+                          <div class="paragraph">
+                            <p>A modal displaying your <strong>Client ID</strong> and <strong>Client Secret</strong> appears. </p>
+                          </div>
+                        </li>
+                        <li>
+                          <p>Copy and save the Client ID and Client Secret.</p>
+                        </li>
+                        <li>
+                          <p>Check the <strong>I have copied the client ID and secret</strong> checkbox and click <strong>Close</strong>. </p>
+                        </li>
+                      </ol>
+                    </div>
+                  </div>
+                </div>
+              </li>
+              <li>
+                <p>If you already have a service account, find your <strong>Client ID</strong> and <strong>Client Secret</strong>. </p>
+              </li>
+              <li>
+                <p>In the Serverless Logic Web Tools, click on the <strong>Cog wheel</strong> (⚙️) on the top-right corner and go to the <strong>Service Account</strong> tab. </p>
+              </li>
+              <li>
+                <p>Enter your <strong>Client ID</strong> and <strong>Client Secret</strong> in the respective fields. </p>
+              </li>
+              <li>
+                <p>Click <strong>Apply</strong>. </p>
+                <div class="paragraph">
+                  <p>The content in the <strong>Service Account</strong> tab updates and displays <strong>Your Service Account information is set</strong> message. </p>
+                </div>
+              </li>
+            </ol>
+          </div>
+        </div>`,
+      },
+      {
+        title: "Creating a Service Registry in Red Hat OpenShift application and Data Services",
+        description: `<div class="sectionbody">
+          <div class="paragraph">
+            <p>You can create or use a Service Registry instance from your Red Hat OpenShift Application and Data Services console and add the Service Registry to Serverless Logic Web Tools.</p>
+          </div>
+          <div class="ulist">
+            <div class="title">
+              <em>
+                <strong>Prerequisites</strong>
+              </em>
+            </div>
+            <ul>
+              <li>
+                <p>You have access to the Red Hat OpenShift Application and Data Services console.</p>
+              </li>
+              <li>
+                <p>You have created a service account.</p>
+                <div class="paragraph">
+                  <p>For information about creating a service account, see <a href="https://kiegroup.github.io/kogito-docs/serverlessworkflow/latest/tooling/serverless-logic-web-tools/serverless-logic-web-tools-redhat-application-services-integration.html#proc-create-service-account-serverless-logic-web-tools">Creating a service account in Red Hat OpenShift application and Data Services</a>. </p>
+                </div>
+              </li>
+            </ul>
+          </div>
+          <div class="olist arabic">
+            <div class="title">
+              <em>
+                <strong>Procedure</strong>
+              </em>
+            </div>
+            <ol class="arabic">
+              <li>
+                <p>To create a Service Registry instance in Red Hat Openshift Application and Data Services console, perform the following steps:</p>
+                <div class="openblock">
+                  <div class="content">
+                    <div class="admonitionblock note">
+                      <table>
+                        <tbody>
+                          <tr>
+                            <td class="icon">&nbsp;</td>
+                            <td class="content">
+                              <div class="paragraph">
+                                <p>
+                                  <strong>NOTE</strong>
+                                  <br>You can skip this step if you already have a Service Registry instance.
+                                </p>
+                              </div>
+                            </td>
+                          </tr>
+                        </tbody>
+                      </table>
+                    </div>
+                    <div class="olist loweralpha">
+                      <ol class="loweralpha" type="a">
+                        <li>
+                          <p>Go to <a href="https://console.redhat.com/application-services/service-registry">Service Registry | Red Hat OpenShift Application and Data Services</a>. </p>
+                        </li>
+                        <li>
+                          <p>Click <strong>Create Service Registry instance</strong> button. </p>
+                        </li>
+                        <li>
+                          <p>In the <strong>Create a Service Registry instance</strong> window, enter a Service Registry instance name and click <strong>Create</strong>. </p>
+                          <div class="paragraph">
+                            <p>The list of Service Registry instances updates with your instance.</p>
+                          </div>
+                        </li>
+                        <li>
+                          <p>Find the Service Registry instance you created in the list and click on the instance.</p>
+                        </li>
+                        <li>
+                          <p>Go to the <strong>Settings</strong> tab and click on <strong>Grant access</strong>. </p>
+                        </li>
+                        <li>
+                          <p>In the drop-down, select the service account you created in the previous procedure.</p>
+                        </li>
+                        <li>
+                          <p>Select a role for your service account.</p>
+                          <div class="admonitionblock important">
+                            <table>
+                              <tbody>
+                                <tr>
+                                  <td class="icon">&nbsp;</td>
+                                  <td class="content">
+                                    <div class="paragraph">
+                                      <p>
+                                        <strong>IMPORTANT <br>
+                                        </strong>You must select the role as Manager or Administrator to have the read and write access.
+                                      </p>
+                                    </div>
+                                  </td>
+                                </tr>
+                              </tbody>
+                            </table>
+                          </div>
+                        </li>
+                        <li>
+                          <p>Click <strong>Save</strong>. </p>
+                        </li>
+                        <li>
+                          <p>Click on the menu on the top-right corner of the screen.</p>
+                        </li>
+                        <li>
+                          <p>Click <strong>Connection</strong>. </p>
+                          <div class="paragraph">
+                            <p>A drawer opens containing the required connection and authentication information.</p>
+                          </div>
+                        </li>
+                        <li>
+                          <p>Copy the value of <strong>Core Registry API</strong>. </p>
+                        </li>
+                      </ol>
+                    </div>
+                  </div>
+                </div>
+              </li>
+              <li>
+                <p>If you already have a Service Registry, find the value of <strong>Core Registry API</strong> of your Service Registry. </p>
+              </li>
+              <li>
+                <p>In the Serverless Logic Web Tools web application, click on the <strong>Cog wheel</strong> (⚙️) on the top-right corner and go to the <strong>Service Registry</strong> tab. </p>
+              </li>
+              <li>
+                <p>Enter a name for your registry.</p>
+                <div class="paragraph">
+                  <p>You can enter the same name that you used while creating the Service Registry instance.</p>
+                </div>
+              </li>
+              <li>
+                <p>Enter the value of <strong>Core Registry API</strong> and click <strong>Apply</strong>. </p>
+                <div class="paragraph">
+                  <p>The content in the <strong>Service Registry</strong> tab updates and displays <strong>Your Service Registry information is set</strong> message. </p>
+                </div>
+              </li>
+            </ol>
+          </div>
+        </div>`,
+      },
+      {
+        title: "Creating Streams for Apache Kafka in Red Hat OpenShift application and Data Services",
+        description: `<div class="sectionbody">
+          <div class="paragraph">
+            <p>You can create or use a Kafka instance from Red Hat OpenShift Application and Data Services console and add the instance to the Serverless Logic Web Tools.</p>
+          </div>
+          <div class="ulist">
+            <div class="title">
+              <em>
+                <strong>Prerequisites</strong>
+              </em>
+            </div>
+            <ul>
+              <li>
+                <p>You have access to the Red Hat OpenShift Application and Data Services console.</p>
+              </li>
+              <li>
+                <p>You have created a service account.</p>
+                <div class="paragraph">
+                  <p>For information about creating a service account, see <a href="https://kiegroup.github.io/kogito-docs/serverlessworkflow/latest/tooling/serverless-logic-web-tools/serverless-logic-web-tools-redhat-application-services-integration.html#proc-create-service-account-serverless-logic-web-tools">Creating a service account in Red Hat OpenShift application and Data Services</a>. </p>
+                </div>
+              </li>
+            </ul>
+          </div>
+          <div class="olist arabic">
+            <div class="title">
+              <em>
+                <strong>Procedure</strong>
+              </em>
+            </div>
+            <ol class="arabic">
+              <li>
+                <p>To create an Apache Kafka instance in Red Hat Openshift Application and Data Services console, perform the following steps:</p>
+                <div class="openblock">
+                  <div class="content">
+                    <div class="admonitionblock note">
+                      <table>
+                        <tbody>
+                          <tr>
+                            <td class="icon">&nbsp;</td>
+                            <td class="content">
+                              <div class="paragraph">
+                                <p>
+                                  <strong>NOTE <br>
+                                  </strong>You can skip this step if you already have an Apache Kafka instance.
+                                </p>
+                              </div>
+                            </td>
+                          </tr>
+                        </tbody>
+                      </table>
+                    </div>
+                    <div class="olist loweralpha">
+                      <ol class="loweralpha" type="a">
+                        <li>
+                          <p>Go to <a href="https://console.redhat.com/application-services/streams/kafkas">Streams for Apache Kafka | Red Hat OpenShift Application and Data Services</a>. </p>
+                        </li>
+                        <li>
+                          <p>Click <strong>Create Kafka instance</strong>. </p>
+                        </li>
+                        <li>
+                          <p>In the <strong>Create a Kafka instance</strong> window, enter the name for a Kafka instance. </p>
+                          <div class="paragraph">
+                            <p>You can also fill the other fields or leave those fields with default values.</p>
+                          </div>
+                        </li>
+                        <li>
+                          <p>Click <strong>Create instance</strong>. </p>
+                        </li>
+                        <li>
+                          <p>Reload the <strong>Kafka instances</strong> page for the list of instances to reflect the instance you created. </p>
+                        </li>
+                        <li>
+                          <p>Once the status of the Kafka instance you created is updated as <strong>Ready</strong>, click on the instance. </p>
+                        </li>
+                        <li>
+                          <p>Go to the <strong>Topics</strong> tab and create a new topic. </p>
+                        </li>
+                        <li>
+                          <p>Go to the <strong>Access</strong> tab, click <strong>Manage Access</strong>, and select <strong>All Accounts</strong> or the service account you created. </p>
+                        </li>
+                        <li>
+                          <p>Add the following permissions:</p>
+                          <div class="ulist">
+                            <ul>
+                              <li>
+                                <p>
+                                  <em>Consumer group is " * " | Allow All | All Accounts</em>;
+                                </p>
+                              </li>
+                              <li>
+                                <p>
+                                  <em>Topic is " * " | Allow All | All Accounts</em>;
+                                </p>
+                              </li>
+                            </ul>
+                          </div>
+                        </li>
+                        <li>
+                          <p>Click on the menu on the top-right corner of the screen.</p>
+                        </li>
+                        <li>
+                          <p>Click <strong>Connection</strong>. </p>
+                        </li>
+                        <li>
+                          <p>Copy the value of <strong>Bootstrap server</strong>. </p>
+                        </li>
+                      </ol>
+                    </div>
+                  </div>
+                </div>
+              </li>
+              <li>
+                <p>If you already have a Kafka instance, find the value of <strong>Bootstrap server</strong> of your Kafka instance. </p>
+              </li>
+              <li>
+                <p>In the Serverless Logic Web Tools web application, click on the <strong>Cog wheel</strong> (⚙️) on the top-right corner and go to the <strong>Streams for Apache Kafka</strong> tab. </p>
+              </li>
+              <li>
+                <p>Enter the value of <strong>Bootstrap server</strong>. </p>
+              </li>
+              <li>
+                <p>Enter the name of topic you created in the <strong>Topic</strong> field and click <strong>Apply</strong>. </p>
+                <div class="paragraph">
+                  <p>The content in the <strong>Streams for Apache Kafka</strong> tab updates and displays <strong>Your Streams for Apache Kafka information is set</strong> message. </p>
+                </div>
+              </li>
+            </ol>
+          </div>
+          <div class="admonitionblock note">
+            <table>
+              <tbody>
+                <tr>
+                  <td class="icon">&nbsp;</td>
+                  <td class="content">
+                    <div class="paragraph">
+                      <p>
+                        <strong>NOTE <br>
+                        </strong>The procedures in this document make the integration easy for you. However, you can also create specific service accounts, topics, and consumer groups.
+                      </p>
+                    </div>
+                  </td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+        </div>`,
+      },
+    ],
+  },
+};
diff --git a/packages/serverless-logic-web-tools/src/quickstarts-data/GitHubTokenQuickStart.ts b/packages/serverless-logic-web-tools/src/quickstarts-data/GitHubTokenQuickStart.ts
new file mode 100644
index 0000000000..de085f745f
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/quickstarts-data/GitHubTokenQuickStart.ts
@@ -0,0 +1,222 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { QuickStart } from "@patternfly/quickstarts";
+
+export const GitHubTokenQuickStart: QuickStart = {
+  metadata: {
+    name: "serverless-logic-web-tools-github-integration",
+    instructional: true,
+  },
+  spec: {
+    icon: null,
+    displayName: "Integrating your Serverless Workflow project in GitHub using Serverless Logic Web Tools",
+    durationMinutes: 10,
+    prerequisites: ["You have an account in GitHub."],
+    description: "",
+    introduction: `The Serverless Logic Web Tools implements a web version of a Git client, enabling you to clone, create, commit, push, and pull repositories. This process synchronizes your workspaces remotely.
+
+This document describes how you can configure the integration and sychronize your projects.`,
+
+    conclusion: `**Found an issue?**
+    
+If you find an issue or any misleading information, please feel free to report it [here](https://github.com/kiegroup/kogito-docs/issues/new). We really appreciate it!`,
+
+    tasks: [
+      {
+        title: "Setting your GitHub token in Serverless Logic Web Tools",
+        description: `<div class="sectionbody">
+          <div class="paragraph">
+            <p>You can generate a token from your GitHub account and add the token to the Serverless Logic Web Tools.</p>
+          </div>
+          <div class="ulist">
+            <div class="title">
+              <em>
+                <strong>Prerequisites</strong>
+              </em>
+            </div>
+            <ul>
+              <li>
+                <p>You have an account in GitHub.</p>
+              </li>
+            </ul>
+          </div>
+          <div class="olist arabic">
+            <div class="title">
+              <em>
+                <strong>Procedure</strong>
+              </em>
+            </div>
+            <ol class="arabic">
+              <li>
+                <p>Go to <a href="https://start.kubesmarts.org/">Serverless Logic Web Tools</a> web application, and click on the <strong>Cog wheel</strong> (⚙️) on the top-right corner of the screen. </p>
+              </li>
+              <li>
+                <p>Go to the <strong>GitHub</strong> tab. </p>
+              </li>
+              <li>
+                <p>In the <strong>GitHub</strong> tab, click <strong>Create a new token</strong> option. </p>
+                <div class="openblock">
+                  <div class="content">
+                    <div class="paragraph">
+                      <p>Ensure that you select the <strong>repo</strong> option. </p>
+                    </div>
+                  </div>
+                </div>
+              </li>
+              <li>
+                <p>Optionally, select <strong>gist</strong>, which enables you to import and update gists. </p>
+              </li>
+              <li>
+                <p>Copy the generated token and paste it into the <strong>Token</strong> field in Serverless Logic Web Tools GitHub <strong>Settings</strong>. </p>
+                <div class="paragraph">
+                  <p>The contents of the tab are updated and displays that you are signed into the GitHub and contains all the required permissions.</p>
+                </div>
+              </li>
+            </ol>
+          </div>
+        </div>`,
+      },
+      {
+        title: "Synchronizing your workspaces with GitHub",
+        description: `<div class="sectionbody">
+          <div class="paragraph">
+            <p>After your GitHub token is set, you can synchronize your workspaces with remote repositories.</p>
+          </div>
+          <div class="ulist">
+            <div class="title">
+              <em>
+                <strong>Prerequisites</strong>
+              </em>
+            </div>
+            <ul>
+              <li>
+                <p>Your GitHub token is configured in the Serverless Logic Web Tools.</p>
+                <div class="paragraph">
+                  <p>For more information, see <a href="https://kiegroup.github.io/kogito-docs/serverlessworkflow/latest/tooling/serverless-logic-web-tools/serverless-logic-web-tools-github-integration.html#proc-setting-github-token-serverless-logic-web-tools">Setting your GitHub token in Serverless Logic Web Tools</a>. </p>
+                </div>
+              </li>
+            </ul>
+          </div>
+          <div class="olist arabic">
+            <div class="title">
+              <strong>
+                <em>Procedure</em>
+              </strong>
+            </div>
+            <ol class="arabic">
+              <li>
+                <p>In the Serverless Logic Web Tools web application, create or open a workspace.</p>
+              </li>
+              <li>
+                <p>Add or edit the existing files in the workspace.</p>
+              </li>
+              <li>
+                <p>Click <strong>Share &rarr; Github: Create Repository</strong>. </p>
+              </li>
+              <li>
+                <p>Name your repository and set the repository as <strong>Public</strong> or <strong>Private</strong>. </p>
+              </li>
+              <li>
+                <p>(Optional) Select the <strong>Use Quarkus Accelerator</strong> to create a repository with a base Quarkus project and move the workspace files to <code>src/main/resources</code> folder. </p>
+                <div class="openblock">
+                  <div class="content">
+                    <div class="imageblock">
+                      <div class="content">
+                        <img src="images/quickstarts/serverless-logic-web-tools-github-repo.png" alt="serverless logic web tools github repo">
+                      </div>
+                      <div class="title">Figure 1. Create a repository for your workspace</div>
+                    </div>
+                  </div>
+                </div>
+              </li>
+              <li>
+                <p>Click <strong>Sync &rarr; Push</strong> to update the remote repository with your local changes. </p>
+              </li>
+              <li>
+                <p>To get new updates from the remote repository, click <strong>Sync &rarr; Pull</strong>. </p>
+                <div class="admonitionblock note">
+                  <table>
+                    <tbody>
+                      <tr>
+                        <td class="icon">&nbsp;</td>
+                        <td class="content">
+                          <div class="paragraph">
+                            <p>
+                              <strong>NOTE</strong>
+                              <br>Currently, Serverless Logic Web Tools cannot resolve the merge conflicts. Therefore, ensure that you always pull changes before working on your files.
+                            </p>
+                          </div>
+                        </td>
+                      </tr>
+                    </tbody>
+                  </table>
+                </div>
+              </li>
+            </ol>
+          </div>
+        </div>`,
+      },
+      {
+        title: "Importing a workspace from GitHub",
+        description: `<div class="sectionbody">
+          <div class="paragraph">
+            <p>You can import a workspace from GitHub in Serverless Logic Web Tools when you need to work from another computer or need to use someone else’s workspace.</p>
+          </div>
+          <div class="ulist">
+            <div class="title">
+              <strong>
+                <em>Prerequisites</em>
+              </strong>
+            </div>
+            <ul>
+              <li>
+                <p>Your GitHub token is configured in the Serverless Logic Web Tools.</p>
+                <div class="paragraph">
+                  <p>For more information, see <a href="https://kiegroup.github.io/kogito-docs/serverlessworkflow/latest/tooling/serverless-logic-web-tools/serverless-logic-web-tools-github-integration.html#proc-setting-github-token-serverless-logic-web-tools">Setting your GitHub token in Serverless Logic Web Tools</a>. </p>
+                </div>
+              </li>
+              <li>
+                <p>You have a repository containing workflow files.</p>
+              </li>
+            </ul>
+          </div>
+          <div class="olist arabic">
+            <div class="title">
+              <strong>
+                <em>Procedure</em>
+              </strong>
+            </div>
+            <ol class="arabic">
+              <li>
+                <p>Go to GitHub, find the repository with your project, and copy the repository URL.</p>
+              </li>
+              <li>
+                <p>In Serverless Logic Web Tools web application, paste the repository URL in the <strong>Import → From URL</strong> field and click <strong>Clone</strong>. </p>
+                <div class="paragraph">
+                  <p>The page loads your imported project, defaulting to a workflow file, if present.</p>
+                </div>
+              </li>
+              <li>
+                <p>If applicable, you can push to the imported repository by clicking on the <strong>Sync → Push</strong>. </p>
+              </li>
+            </ol>
+          </div>
+        </div>`,
+      },
+    ],
+  },
+};
diff --git a/packages/serverless-logic-web-tools/src/quickstarts-data/OpenShiftIntegrationQuickStart.ts b/packages/serverless-logic-web-tools/src/quickstarts-data/OpenShiftIntegrationQuickStart.ts
new file mode 100644
index 0000000000..441c9c93e1
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/quickstarts-data/OpenShiftIntegrationQuickStart.ts
@@ -0,0 +1,194 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { QuickStart } from "@patternfly/quickstarts";
+
+export const OpenShiftIntegrationQuickStart: QuickStart = {
+  metadata: {
+    name: "serverless-logic-web-tools-openshift-integration",
+    instructional: true,
+  },
+  spec: {
+    icon: null,
+    displayName: "Integrating your Serverless Workflow project with OpenShift using Serverless Logic Web Tools",
+    durationMinutes: 15,
+    prerequisites: [],
+    description: "",
+    introduction: `You can integrate your Serverless Workflow project with Red Hat OpenShift. OpenShift is an enterprise-ready Kubernetes container platform, enabling your Serverless Workflow projects to be deployed and tested online.`,
+
+    conclusion: `**Found an issue?**
+    
+If you find an issue or any misleading information, please feel free to report it [here](https://github.com/kiegroup/kogito-docs/issues/new). We really appreciate it!`,
+
+    tasks: [
+      {
+        title: "Setting KIE Sandbox Extended Services",
+        description: `<div class="sectionbody">
+          <div class="paragraph">
+            <p>The KIE Sandbox Extended Services tool is required to proxy requests to an OpenShift instance. Therefore, setting the KIE Sandbox Extended Services enables you to deploy and monitor your Serverless Workflow projects.</p>
+          </div>
+          <div class="olist arabic">
+            <div class="title">
+              <em>
+                <strong>Procedure</strong>
+              </em>
+            </div>
+            <ol class="arabic">
+              <li>
+                <p>In the Serverless Logic Web Tools web application, click on the <strong>Cog wheel</strong> (⚙️) on the top-right corner and go to the <strong>KIE Sandbox Extended Services</strong> tab. </p>
+              </li>
+              <li>
+                <p>In case you are not connected to KIE Sandbox Extended Services, you see <strong>You are not connected to KIE Sandbox Extended Services. Click to setup</strong> mesaage along with <strong>Host</strong> and <strong>Port</strong> fields, containing the values as <code>
+                    <a class="bare" href="http://localhost" aria-invalid="true">http://localhost</a>
+                  </code> and <code>21345</code> respectively. </p>
+              </li>
+              <li>
+                <p>Click on the link in the message.</p>
+                <div class="paragraph">
+                  <p>A window appears containing your current operating system as selected and a link to download to the latest version of KIE Sandbox Extended Services.</p>
+                </div>
+              </li>
+              <li>
+                <p>Download the KIE Sandbox Extended Services and execute it.</p>
+                <div class="openblock">
+                  <div class="content">
+                    <div class="paragraph">
+                      <p>You might need to grant permissions to run the file depending on your operating system and settings.</p>
+                    </div>
+                    <div class="paragraph">
+                      <p>After executing the KIE Sandbox Extended Services the content in the <strong>KIE Sandbox Extended Services</strong> is updated and displays that you are connected to the KIE Sandbox Extended Services. </p>
+                    </div>
+                  </div>
+                </div>
+              </li>
+            </ol>
+          </div>
+        </div>`,
+      },
+      {
+        title: "Connecting to OpenShift instance using Serverless Logic Web Tools",
+        description: `<div class="sect1">
+          <h2 id="proc-connecting-openshift-instance-serverless-logic-web-tools">Connecting to OpenShift instance using Serverless Logic Web Tools</h2>
+          <div class="sectionbody">
+            <div class="paragraph">
+              <p>After setting the KIE Sandbox Extended Services, you can connect to your OpenShift instance to deploy your Serverless Workflow projects with Serverless Logic Web Tools.</p>
+            </div>
+            <div class="ulist">
+              <div class="title">
+                <em>
+                  <strong>Prerequisites</strong>
+                </em>
+              </div>
+              <ul>
+                <li>
+                  <p>KIE Sandbox Extended Services tool installed and running.</p>
+                </li>
+                <li>
+                  <p>OpenShift instance is active.</p>
+                  <div class="paragraph">
+                    <p>You can create a free developer sandbox. For more information, see <a href="https://developers.redhat.com/developer-sandbox">OpenShift Developer Sandbox</a>. </p>
+                  </div>
+                </li>
+              </ul>
+            </div>
+            <div class="olist arabic">
+              <div class="title">
+                <em>
+                  <strong>Procedure</strong>
+                </em>
+              </div>
+              <ol class="arabic">
+                <li>
+                  <p>Log in to your OpenShift instance console interface.</p>
+                </li>
+                <li>
+                  <p>In the OpenShift instance console interface, you need your OpenShift project name (also known as namespace), API server, and an access token.</p>
+                  <div class="openblock">
+                    <div class="content">
+                      <div class="ulist">
+                        <ul>
+                          <li>
+                            <p>For the OpenShift project name, go to the <strong>Topology</strong> tab and in the top-left corner you see your project name. </p>
+                            <div class="imageblock">
+                              <div class="content">
+                                <img src="images/quickstarts/serverless-logic-web-tools-openshift-project.png" alt="serverless logic web tools openshift project">
+                              </div>
+                              <div class="title">Figure 1. OpenShift project name in OpenShift instance console</div>
+                            </div>
+                          </li>
+                          <li>
+                            <p>To obtain the API server and access token, click on your username and <strong>Copy login command</strong>. </p>
+                            <div class="paragraph">
+                              <p>A new page opens containing your new API token along with <code>oc cli</code> login command. From the <code>oc cli</code> command, copy the value of <code>--server=</code>. </p>
+                            </div>
+                            <div class="imageblock">
+                              <div class="content">
+                                <img src="images/quickstarts/serverless-logic-web-tools-openshift-info.png" alt="serverless logic web tools openshift info">
+                              </div>
+                              <div class="title">Figure 2. OpenShift access token and API server</div>
+                            </div>
+                          </li>
+                        </ul>
+                      </div>
+                    </div>
+                  </div>
+                </li>
+                <li>
+                  <p>Go to the Serverless Logic Web Tools web application, click on the <strong>Cog wheel</strong> (⚙️) on the top-right corner and go to the <strong>OpenShift</strong> tab. </p>
+                </li>
+                <li>
+                  <p>Enter your OpenShift project name in the <strong>Namespace (project)</strong> field. </p>
+                </li>
+                <li>
+                  <p>Enter the value copied value of <code>--server</code> flag in the <strong>Host</strong> field. </p>
+                </li>
+                <li>
+                  <p>Enter the value of API token in the <strong>Token</strong> field. </p>
+                </li>
+                <li>
+                  <p>Click <strong>Connect</strong>. </p>
+                  <div class="paragraph">
+                    <p>If the entered values are correct, then the tab updates and displays <strong>You&rsquo;re connected to OpenShift</strong> message. </p>
+                  </div>
+                </li>
+              </ol>
+            </div>
+            <div class="paragraph">
+              <p>After connecting to OpenShift, you are ready to deploy your Serverless Workflow projects using Serverless Logic Web Tools. For more information about deploying your projects, see <a class="xref page" href="serverless-logic-web-tools-deploy-projects.html" aria-invalid="true">Deploying your Serverless Workflow projects using Serverless Logic Web Tools</a>. </p>
+            </div>
+            <div class="admonitionblock note">
+              <table>
+                <tbody>
+                  <tr>
+                    <td class="icon">&nbsp;</td>
+                    <td class="content">
+                      <div class="paragraph">
+                        <p>
+                          <b>NOTE</b>
+                          <br />If your OpenShift instance uses self-signed certificates, then you might need to enable <code>InsecureSkipVerify</code> on KIE Sandbox Extended Services.
+                        </p>
+                      </div>
+                    </td>
+                  </tr>
+                </tbody>
+              </table>
+            </div>
+          </div>
+        </div>`,
+      },
+    ],
+  },
+};
diff --git a/packages/serverless-logic-web-tools/src/quickstarts-data/index.ts b/packages/serverless-logic-web-tools/src/quickstarts-data/index.ts
new file mode 100644
index 0000000000..c04f6b1e35
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/quickstarts-data/index.ts
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { ApplicationServicesIntegrationQuickStart } from "./ApplicationServicesIntegrationQuickStart";
+import { GitHubTokenQuickStart } from "./GitHubTokenQuickStart";
+import { OpenShiftIntegrationQuickStart } from "./OpenShiftIntegrationQuickStart";
+
+export const QuickStartIds: { [key: string]: string } = {
+  GitHubTokenQuickStart: GitHubTokenQuickStart.metadata.name,
+  OpenShiftIntegrationQuickStart: OpenShiftIntegrationQuickStart.metadata.name,
+  ApplicationServicesIntegrationQuickStart: ApplicationServicesIntegrationQuickStart.metadata.name,
+};
+
+export { GitHubTokenQuickStart, OpenShiftIntegrationQuickStart, ApplicationServicesIntegrationQuickStart };
diff --git a/packages/serverless-logic-web-tools/static/images/quickstarts/serverless-logic-web-tools-github-repo.png b/packages/serverless-logic-web-tools/static/images/quickstarts/serverless-logic-web-tools-github-repo.png
new file mode 100644
index 0000000000..7f76f5dd65
Binary files /dev/null and b/packages/serverless-logic-web-tools/static/images/quickstarts/serverless-logic-web-tools-github-repo.png differ
diff --git a/packages/serverless-logic-web-tools/static/images/quickstarts/serverless-logic-web-tools-openshift-info.png b/packages/serverless-logic-web-tools/static/images/quickstarts/serverless-logic-web-tools-openshift-info.png
new file mode 100644
index 0000000000..89dc0beabd
Binary files /dev/null and b/packages/serverless-logic-web-tools/static/images/quickstarts/serverless-logic-web-tools-openshift-info.png differ
diff --git a/packages/serverless-logic-web-tools/static/images/quickstarts/serverless-logic-web-tools-openshift-project.png b/packages/serverless-logic-web-tools/static/images/quickstarts/serverless-logic-web-tools-openshift-project.png
new file mode 100644
index 0000000000..d1e9686bff
Binary files /dev/null and b/packages/serverless-logic-web-tools/static/images/quickstarts/serverless-logic-web-tools-openshift-project.png differ
diff --git a/packages/serverless-logic-web-tools/static/resources/style.css b/packages/serverless-logic-web-tools/static/resources/style.css
index b54a7c8b6e..a75c5b5755 100644
--- a/packages/serverless-logic-web-tools/static/resources/style.css
+++ b/packages/serverless-logic-web-tools/static/resources/style.css
@@ -664,3 +664,11 @@ section.kie-tools--settings-tab {
   text-align: left;
   font-size: 17px;
 }
+
+#page-container {
+  height: 100%;
+}
+
+#page-container .pf-c-backdrop {
+  position: absolute !important;
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index cb9db5a476..72a47a3011 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -3625,6 +3625,7 @@ importers:
       "@kie-tools/tsconfig": workspace:*
       "@octokit/plugin-rest-endpoint-methods": ^5.0.1
       "@octokit/rest": ^18.5.3
+      "@patternfly/quickstarts": ^2.3.2
       "@patternfly/react-core": ^4.157.3
       "@patternfly/react-icons": ^4.11.17
       "@patternfly/react-tokens": ^4.33.1
@@ -3666,6 +3667,7 @@ importers:
       react-router: ^5.2.1
       react-router-dom: ^5.2.1
       rimraf: ^3.0.2
+      showdown: ^2.1.0
       start-server-and-test: ^1.12.1
       ts-jest: ^26.5.6
       typescript: ^4.4.2
@@ -3699,6 +3701,7 @@ importers:
       "@kie-tools/text-editor": link:../text-editor
       "@octokit/plugin-rest-endpoint-methods": 5.0.1
       "@octokit/rest": 18.5.3
+      "@patternfly/quickstarts": 2.3.2_t7grzltpjbpsxy6z3ftyagoq7i
       "@patternfly/react-core": 4.168.8_sfoxds7t5ydpegc3knd667wn6m
       "@patternfly/react-icons": 4.19.8_sfoxds7t5ydpegc3knd667wn6m
       "@patternfly/react-tokens": 4.33.1
@@ -3717,7 +3720,8 @@ importers:
       react-dropzone: 11.4.2_react@17.0.2
       react-router: 5.2.1_react@17.0.2
       react-router-dom: 5.3.0_react@17.0.2
-      vscode-languageserver-types: 3.17.2
+      showdown: 2.1.0
+      vscode-languageserver-types: 3.16.0
       yaml: 2.0.1
     devDependencies:
       "@babel/core": 7.16.12
@@ -8601,6 +8605,43 @@ packages:
     engines: { node: ">=8.0" }
     dev: true
 
+  /@patternfly/patternfly/4.122.2:
+    resolution:
+      { integrity: sha512-kSoW8mt9eEJcAZX2lX4r/SYvFd44GGb8PUSDjMrpKDZqgn9/9VFh1rSChG4v5kCK6cpS99/gdTapZc3ylf8Rpw== }
+    dev: false
+
+  /@patternfly/quickstarts/2.3.2_t7grzltpjbpsxy6z3ftyagoq7i:
+    resolution:
+      { integrity: sha512-mnmg2DFGf50R6+2V9UVo5yKUYoewjK36VVe3+FTkYizlqLlOBGR+RQ8XL9apy07FOgYsAzHmiKOPM9NyzU9YUg== }
+    peerDependencies:
+      "@patternfly/react-core": ">=4.115.2"
+      react: ">=16.8.0"
+      react-dom: ">=16.8.0"
+    dependencies:
+      "@patternfly/react-catalog-view-extension": 4.12.15_sfoxds7t5ydpegc3knd667wn6m
+      "@patternfly/react-core": 4.168.8_sfoxds7t5ydpegc3knd667wn6m
+      dompurify: 2.4.0
+      history: 5.3.0
+      react: 17.0.2
+      react-dom: 17.0.2_react@17.0.2
+      showdown: 1.8.6
+    dev: false
+
+  /@patternfly/react-catalog-view-extension/4.12.15_sfoxds7t5ydpegc3knd667wn6m:
+    resolution:
+      { integrity: sha512-1mp+Ogi7fJfgh5wV9q+PolmplbMj3Tcias8xs0eeD5GCirdzOQxG+wihEM5k6CAGhBAr7jHg5fRSgO8QLTt3UQ== }
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0
+      react-dom: ^16.8.0 || ^17.0.0
+    dependencies:
+      "@patternfly/patternfly": 4.122.2
+      "@patternfly/react-core": 4.168.8_sfoxds7t5ydpegc3knd667wn6m
+      "@patternfly/react-styles": 4.18.8
+      classnames: 2.3.1
+      react: 17.0.2
+      react-dom: 17.0.2_react@17.0.2
+    dev: false
+
   /@patternfly/react-charts/6.15.23_sfoxds7t5ydpegc3knd667wn6m:
     resolution:
       { integrity: sha512-X8ou27onHXrkpcvv9AZhyinlw8vXzd9MFesDIKuXRwaQESdaPEznKIVg55ciVBj3tdAYBk5mQmxegh4UJFWSig== }
@@ -11706,13 +11747,11 @@ packages:
     resolution:
       { integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== }
     engines: { node: ">=0.10.0" }
-    dev: true
 
   /ansi-regex/3.0.1:
     resolution:
       { integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== }
     engines: { node: ">=4" }
-    dev: true
 
   /ansi-regex/5.0.1:
     resolution:
@@ -12091,7 +12130,7 @@ packages:
     resolution:
       { integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== }
     dependencies:
-      follow-redirects: 1.14.9_debug@4.3.1
+      follow-redirects: 1.14.9
     transitivePeerDependencies:
       - debug
     dev: true
@@ -12100,7 +12139,7 @@ packages:
     resolution:
       { integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== }
     dependencies:
-      follow-redirects: 1.14.9_debug@4.3.1
+      follow-redirects: 1.14.9
       form-data: 4.0.0
     transitivePeerDependencies:
       - debug
@@ -12783,6 +12822,12 @@ packages:
       tslib: 2.3.1
     dev: true
 
+  /camelcase/4.1.0:
+    resolution:
+      { integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw== }
+    engines: { node: ">=4" }
+    dev: false
+
   /camelcase/5.3.1:
     resolution:
       { integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== }
@@ -13123,6 +13168,15 @@ packages:
       is-wsl: 2.2.0
     dev: true
 
+  /cliui/4.1.0:
+    resolution:
+      { integrity: sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== }
+    dependencies:
+      string-width: 2.1.1
+      strip-ansi: 4.0.0
+      wrap-ansi: 2.1.0
+    dev: false
+
   /cliui/6.0.0:
     resolution:
       { integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== }
@@ -13203,7 +13257,6 @@ packages:
     resolution:
       { integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== }
     engines: { node: ">=0.10.0" }
-    dev: true
 
   /collect-v8-coverage/1.0.1:
     resolution:
@@ -13314,7 +13367,6 @@ packages:
     resolution:
       { integrity: sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw== }
     engines: { node: ^12.20.0 || >=14 }
-    dev: true
 
   /common-tags/1.8.0:
     resolution:
@@ -13509,7 +13561,7 @@ packages:
       normalize-path: 3.0.0
       schema-utils: 4.0.0
       serialize-javascript: 6.0.0
-      webpack: 5.70.0
+      webpack: 5.70.0_webpack-cli@4.10.0
     dev: true
 
   /copyfiles/2.4.1:
@@ -13657,6 +13709,14 @@ packages:
       - encoding
     dev: true
 
+  /cross-spawn/5.1.0:
+    resolution:
+      { integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== }
+    dependencies:
+      lru-cache: 4.1.5
+      shebang-command: 1.2.0
+      which: 1.3.1
+
   /cross-spawn/6.0.5:
     resolution:
       { integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== }
@@ -14712,7 +14772,6 @@ packages:
     resolution:
       { integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== }
     engines: { node: ">=0.10.0" }
-    dev: true
 
   /decamelize/4.0.0:
     resolution:
@@ -16197,6 +16256,20 @@ packages:
       { integrity: sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== }
     dev: true
 
+  /execa/0.7.0:
+    resolution:
+      { integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw== }
+    engines: { node: ">=4" }
+    dependencies:
+      cross-spawn: 5.1.0
+      get-stream: 3.0.0
+      is-stream: 1.1.0
+      npm-run-path: 2.0.2
+      p-finally: 1.0.0
+      signal-exit: 3.0.3
+      strip-eof: 1.0.0
+    dev: false
+
   /execa/1.0.0:
     resolution:
       { integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== }
@@ -16723,6 +16796,13 @@ packages:
       p-filter: 2.1.0
     dev: true
 
+  /find-up/2.1.0:
+    resolution:
+      { integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== }
+    engines: { node: ">=4" }
+    dependencies:
+      locate-path: 2.0.0
+
   /find-up/3.0.0:
     resolution:
       { integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== }
@@ -16796,7 +16876,7 @@ packages:
       tabbable: 5.1.5
     dev: false
 
-  /follow-redirects/1.14.9_debug@4.3.1:
+  /follow-redirects/1.14.9:
     resolution:
       { integrity: sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== }
     engines: { node: ">=4.0" }
@@ -16805,8 +16885,6 @@ packages:
     peerDependenciesMeta:
       debug:
         optional: true
-    dependencies:
-      debug: 4.3.1
 
   /for-in/1.0.2:
     resolution:
@@ -17017,6 +17095,11 @@ packages:
     engines: { node: ">=6.9.0" }
     dev: true
 
+  /get-caller-file/1.0.3:
+    resolution:
+      { integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== }
+    dev: false
+
   /get-caller-file/2.0.5:
     resolution:
       { integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== }
@@ -17073,6 +17156,12 @@ packages:
       pinkie-promise: 2.0.1
     dev: true
 
+  /get-stream/3.0.0:
+    resolution:
+      { integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== }
+    engines: { node: ">=4" }
+    dev: false
+
   /get-stream/4.1.0:
     resolution:
       { integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== }
@@ -17505,6 +17594,13 @@ packages:
       tiny-warning: 1.0.3
       value-equal: 1.0.1
 
+  /history/5.3.0:
+    resolution:
+      { integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ== }
+    dependencies:
+      "@babel/runtime": 7.16.7
+    dev: false
+
   /hoist-non-react-statics/3.3.2:
     resolution:
       { integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== }
@@ -17731,7 +17827,7 @@ packages:
     engines: { node: ">=8.0.0" }
     dependencies:
       eventemitter3: 4.0.7
-      follow-redirects: 1.14.9_debug@4.3.1
+      follow-redirects: 1.14.9
       requires-port: 1.0.0
     transitivePeerDependencies:
       - debug
@@ -18048,6 +18144,12 @@ packages:
       loose-envify: 1.4.0
     dev: false
 
+  /invert-kv/1.0.0:
+    resolution:
+      { integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== }
+    engines: { node: ">=0.10.0" }
+    dev: false
+
   /ip/1.1.5:
     resolution:
       { integrity: sha512-rBtCAQAJm8A110nbwn6YdveUnuZH3WrC36IwkRXxDnq53JvXA2NVQvB7IHyKomxK1MJ4VDNw3UtFDdXQ+AvLYA== }
@@ -18239,7 +18341,12 @@ packages:
     engines: { node: ">=0.10.0" }
     dependencies:
       number-is-nan: 1.0.1
-    dev: true
+
+  /is-fullwidth-code-point/2.0.0:
+    resolution:
+      { integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== }
+    engines: { node: ">=4" }
+    dev: false
 
   /is-fullwidth-code-point/3.0.0:
     resolution:
@@ -18392,7 +18499,6 @@ packages:
     resolution:
       { integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== }
     engines: { node: ">=0.10.0" }
-    dev: true
 
   /is-stream/2.0.0:
     resolution:
@@ -18481,7 +18587,6 @@ packages:
   /isexe/2.0.0:
     resolution:
       { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== }
-    dev: true
 
   /isobject/2.1.0:
     resolution:
@@ -19921,6 +20026,14 @@ packages:
       readable-stream: 2.3.7
     dev: true
 
+  /lcid/1.0.0:
+    resolution:
+      { integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw== }
+    engines: { node: ">=0.10.0" }
+    dependencies:
+      invert-kv: 1.0.0
+    dev: false
+
   /less-loader/10.2.0_less@4.1.2+webpack@5.70.0:
     resolution:
       { integrity: sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg== }
@@ -20079,6 +20192,14 @@ packages:
     engines: { node: ">= 12.13.0" }
     dev: true
 
+  /locate-path/2.0.0:
+    resolution:
+      { integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== }
+    engines: { node: ">=4" }
+    dependencies:
+      p-locate: 2.0.0
+      path-exists: 3.0.0
+
   /locate-path/3.0.0:
     resolution:
       { integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== }
@@ -20237,7 +20358,13 @@ packages:
     resolution:
       { integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== }
     engines: { node: ">=8" }
-    dev: true
+
+  /lru-cache/4.1.5:
+    resolution:
+      { integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== }
+    dependencies:
+      pseudomap: 1.0.2
+      yallist: 2.1.2
 
   /lru-cache/6.0.0:
     resolution:
@@ -20398,6 +20525,14 @@ packages:
     engines: { node: ">= 0.6" }
     dev: true
 
+  /mem/1.1.0:
+    resolution:
+      { integrity: sha512-nOBDrc/wgpkd3X/JOhMqYR+/eLqlfLP4oQfoBA6QExIxEl+GU01oyEkwWyueyO8110pUKijtiHGhEmYoOn88oQ== }
+    engines: { node: ">=4" }
+    dependencies:
+      mimic-fn: 1.2.0
+    dev: false
+
   /mem/6.1.1:
     resolution:
       { integrity: sha512-Ci6bIfq/UgcxPTYa8dQQ5FY3BzKkT894bwXWXxC/zqs0XgMO2cT20CGkOqda7gZNkmK5VP4x89IGZ6K7hfbn3Q== }
@@ -20555,6 +20690,12 @@ packages:
     hasBin: true
     dev: true
 
+  /mimic-fn/1.2.0:
+    resolution:
+      { integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== }
+    engines: { node: ">=4" }
+    dev: false
+
   /mimic-fn/2.1.0:
     resolution:
       { integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== }
@@ -21376,7 +21517,6 @@ packages:
     engines: { node: ">=4" }
     dependencies:
       path-key: 2.0.1
-    dev: true
 
   /npm-run-path/4.0.1:
     resolution:
@@ -21418,7 +21558,6 @@ packages:
     resolution:
       { integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== }
     engines: { node: ">=0.10.0" }
-    dev: true
 
   /numeral/2.0.6:
     resolution:
@@ -21646,6 +21785,22 @@ packages:
       { integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== }
     dev: true
 
+  /os-homedir/1.0.2:
+    resolution:
+      { integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== }
+    engines: { node: ">=0.10.0" }
+    dev: true
+
+  /os-locale/2.1.0:
+    resolution:
+      { integrity: sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== }
+    engines: { node: ">=4" }
+    dependencies:
+      execa: 0.7.0
+      lcid: 1.0.0
+      mem: 1.1.0
+    dev: false
+
   /os-tmpdir/1.0.2:
     resolution:
       { integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== }
@@ -21700,7 +21855,6 @@ packages:
     resolution:
       { integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== }
     engines: { node: ">=4" }
-    dev: true
 
   /p-finally/2.0.1:
     resolution:
@@ -21714,6 +21868,19 @@ packages:
     engines: { node: ">=8" }
     dev: true
 
+  /p-iteration/1.1.8:
+    resolution:
+      { integrity: sha512-IMFBSDIYcPNnW7uWYGrBqmvTiq7W0uB0fJn6shQZs7dlF3OvrHOre+JT9ikSZ7gZS3vWqclVgoQSvToJrns7uQ== }
+    engines: { node: ">=8.0.0" }
+    dev: true
+
+  /p-limit/1.3.0:
+    resolution:
+      { integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== }
+    engines: { node: ">=4" }
+    dependencies:
+      p-try: 1.0.0
+
   /p-limit/2.3.0:
     resolution:
       { integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== }
@@ -21730,6 +21897,13 @@ packages:
       yocto-queue: 0.1.0
     dev: true
 
+  /p-locate/2.0.0:
+    resolution:
+      { integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== }
+    engines: { node: ">=4" }
+    dependencies:
+      p-limit: 1.3.0
+
   /p-locate/3.0.0:
     resolution:
       { integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== }
@@ -21818,6 +21992,11 @@ packages:
       p-finally: 1.0.0
     dev: true
 
+  /p-try/1.0.0:
+    resolution:
+      { integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== }
+    engines: { node: ">=4" }
+
   /p-try/2.2.0:
     resolution:
       { integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== }
@@ -22014,7 +22193,6 @@ packages:
     resolution:
       { integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== }
     engines: { node: ">=4" }
-    dev: true
 
   /path-exists/4.0.0:
     resolution:
@@ -22032,7 +22210,6 @@ packages:
     resolution:
       { integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== }
     engines: { node: ">=4" }
-    dev: true
 
   /path-key/3.1.1:
     resolution:
@@ -22987,6 +23164,10 @@ packages:
       event-stream: 3.3.4
     dev: true
 
+  /pseudomap/1.0.2:
+    resolution:
+      { integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== }
+
   /psl/1.8.0:
     resolution:
       { integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== }
@@ -23823,6 +24004,11 @@ packages:
       { integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== }
     engines: { node: ">=0.10.0" }
 
+  /require-main-filename/1.0.1:
+    resolution:
+      { integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== }
+    dev: false
+
   /require-main-filename/2.0.0:
     resolution:
       { integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== }
@@ -24350,7 +24536,6 @@ packages:
   /set-blocking/2.0.0:
     resolution:
       { integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== }
-    dev: true
 
   /set-immediate-shim/1.0.1:
     resolution:
@@ -24417,7 +24602,6 @@ packages:
     engines: { node: ">=0.10.0" }
     dependencies:
       shebang-regex: 1.0.0
-    dev: true
 
   /shebang-command/2.0.0:
     resolution:
@@ -24431,7 +24615,6 @@ packages:
     resolution:
       { integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== }
     engines: { node: ">=0.10.0" }
-    dev: true
 
   /shebang-regex/3.0.0:
     resolution:
@@ -24445,6 +24628,22 @@ packages:
     dev: true
     optional: true
 
+  /showdown/1.8.6:
+    resolution:
+      { integrity: sha512-cOmS+LUIiyMxFo7OU3cgV+zTv43GItwlTwUPrpUd5dqdlZh8CJMVb8KxAMhr42J6exQwKTCHMxUiG74vamV1kA== }
+    hasBin: true
+    dependencies:
+      yargs: 10.1.2
+    dev: false
+
+  /showdown/2.1.0:
+    resolution:
+      { integrity: sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ== }
+    hasBin: true
+    dependencies:
+      commander: 9.4.1
+    dev: false
+
   /side-channel/1.0.4:
     resolution:
       { integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== }
@@ -25005,7 +25204,15 @@ packages:
       code-point-at: 1.1.0
       is-fullwidth-code-point: 1.0.0
       strip-ansi: 3.0.1
-    dev: true
+
+  /string-width/2.1.1:
+    resolution:
+      { integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== }
+    engines: { node: ">=4" }
+    dependencies:
+      is-fullwidth-code-point: 2.0.0
+      strip-ansi: 4.0.0
+    dev: false
 
   /string-width/4.2.3:
     resolution:
@@ -25068,7 +25275,14 @@ packages:
     engines: { node: ">=0.10.0" }
     dependencies:
       ansi-regex: 2.1.1
-    dev: true
+
+  /strip-ansi/4.0.0:
+    resolution:
+      { integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== }
+    engines: { node: ">=4" }
+    dependencies:
+      ansi-regex: 3.0.1
+    dev: false
 
   /strip-ansi/6.0.1:
     resolution:
@@ -25102,7 +25316,6 @@ packages:
     resolution:
       { integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== }
     engines: { node: ">=0.10.0" }
-    dev: true
 
   /strip-final-newline/2.0.0:
     resolution:
@@ -27325,7 +27538,6 @@ packages:
   /which-module/2.0.0:
     resolution:
       { integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== }
-    dev: true
 
   /which/1.3.1:
     resolution:
@@ -27333,7 +27545,6 @@ packages:
     hasBin: true
     dependencies:
       isexe: 2.0.0
-    dev: true
 
   /which/2.0.2:
     resolution:
@@ -27375,6 +27586,15 @@ packages:
       { integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== }
     dev: true
 
+  /wrap-ansi/2.1.0:
+    resolution:
+      { integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== }
+    engines: { node: ">=0.10.0" }
+    dependencies:
+      string-width: 1.0.2
+      strip-ansi: 3.0.1
+    dev: false
+
   /wrap-ansi/6.2.0:
     resolution:
       { integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== }
@@ -27547,6 +27767,11 @@ packages:
     engines: { node: ">=0.4" }
     dev: true
 
+  /y18n/3.2.2:
+    resolution:
+      { integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== }
+    dev: false
+
   /y18n/4.0.3:
     resolution:
       { integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== }
@@ -27557,6 +27782,15 @@ packages:
       { integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== }
     engines: { node: ">=10" }
 
+  /yallist/2.1.2:
+    resolution:
+      { integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== }
+
+  /yallist/3.1.1:
+    resolution:
+      { integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== }
+    dev: true
+
   /yallist/4.0.0:
     resolution:
       { integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== }
@@ -27626,6 +27860,13 @@ packages:
       { integrity: sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA== }
     engines: { node: ">=12" }
 
+  /yargs-parser/8.1.0:
+    resolution:
+      { integrity: sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ== }
+    dependencies:
+      camelcase: 4.1.0
+    dev: false
+
   /yargs-unparser/2.0.0:
     resolution:
       { integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== }
@@ -27637,6 +27878,24 @@ packages:
       is-plain-obj: 2.1.0
     dev: true
 
+  /yargs/10.1.2:
+    resolution:
+      { integrity: sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig== }
+    dependencies:
+      cliui: 4.1.0
+      decamelize: 1.2.0
+      find-up: 2.1.0
+      get-caller-file: 1.0.3
+      os-locale: 2.1.0
+      require-directory: 2.1.1
+      require-main-filename: 1.0.1
+      set-blocking: 2.0.0
+      string-width: 2.1.1
+      which-module: 2.0.0
+      y18n: 3.2.2
+      yargs-parser: 8.1.0
+    dev: false
+
   /yargs/15.4.1:
     resolution:
       { integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 06/27: Update lock file after sync

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit c42d829ca7c5a2d8974fdd9b2bc566921545f6f4
Author: Guilherme Caponetto <63...@users.noreply.github.com>
AuthorDate: Thu Feb 9 11:36:02 2023 -0300

    Update lock file after sync
---
 pnpm-lock.yaml | 160 ++++++++++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 130 insertions(+), 30 deletions(-)

diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index b6ab909f03..c5cf573b2d 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -5333,6 +5333,9 @@ importers:
       "@octokit/rest":
         specifier: ^18.5.3
         version: 18.5.3
+      "@patternfly/quickstarts":
+        specifier: ^2.3.2
+        version: 2.3.3(@patternfly/react-core@4.168.8)(react-dom@17.0.2)(react@17.0.2)(showdown@2.1.0)
       "@patternfly/react-core":
         specifier: ^4.157.3
         version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
@@ -5387,6 +5390,9 @@ importers:
       react-router-dom:
         specifier: ^5.2.1
         version: 5.3.0(react@17.0.2)
+      showdown:
+        specifier: ^2.1.0
+        version: 2.1.0
       vscode-languageserver-types:
         specifier: ^3.16.0
         version: 3.17.2
@@ -11325,6 +11331,43 @@ packages:
     engines: { node: ">=8.0" }
     dev: true
 
+  /@patternfly/patternfly@4.222.4:
+    resolution:
+      { integrity: sha512-+0fk4dzxEbWn+hgaOnR0BjfeUdEeVVrqfH7+GFeFc+RKjEMjIR/BZbWWN8YQDezmDv6A32gHmEKaY3Uwbt06Lw== }
+    dev: false
+
+  /@patternfly/quickstarts@2.3.3(@patternfly/react-core@4.168.8)(react-dom@17.0.2)(react@17.0.2)(showdown@2.1.0):
+    resolution:
+      { integrity: sha512-VmPbeel7Z9k8qXXNN0qekwfGyQxR21q5LW51oXFjQz/1XoFBhOf2pDTYD5NcsC1SOAYkroRGln+oQcvbf/0zRA== }
+    peerDependencies:
+      "@patternfly/react-core": ">=4.115.2"
+      react: ">=16.8.0"
+      react-dom: ">=16.8.0"
+      showdown: ">=1.8.6"
+    dependencies:
+      "@patternfly/react-catalog-view-extension": 4.95.1(react-dom@17.0.2)(react@17.0.2)
+      "@patternfly/react-core": 4.168.8(react-dom@17.0.2)(react@17.0.2)
+      dompurify: 2.4.0
+      history: 5.3.0
+      react: 17.0.2
+      react-dom: 17.0.2(react@17.0.2)
+      showdown: 2.1.0
+    dev: false
+
+  /@patternfly/react-catalog-view-extension@4.95.1(react-dom@17.0.2)(react@17.0.2):
+    resolution:
+      { integrity: sha512-GqWyih2GHagI+Yt9+VDmGRC8pv/989nExrisDLWbMNYaRKeZXEmr/LaWXTGJzD+fmZFYjc4wqd5tuJ0VkAp/jg== }
+    peerDependencies:
+      react: ^16.8 || ^17 || ^18
+      react-dom: ^16.8 || ^17 || ^18
+    dependencies:
+      "@patternfly/patternfly": 4.222.4
+      "@patternfly/react-core": 4.276.6(react-dom@17.0.2)(react@17.0.2)
+      "@patternfly/react-styles": 4.92.6
+      react: 17.0.2
+      react-dom: 17.0.2(react@17.0.2)
+    dev: false
+
   /@patternfly/react-charts@6.15.23(react-dom@17.0.2)(react@17.0.2):
     resolution:
       { integrity: sha512-X8ou27onHXrkpcvv9AZhyinlw8vXzd9MFesDIKuXRwaQESdaPEznKIVg55ciVBj3tdAYBk5mQmxegh4UJFWSig== }
@@ -11374,6 +11417,24 @@ packages:
       tslib: 2.3.1
     dev: false
 
+  /@patternfly/react-core@4.276.6(react-dom@17.0.2)(react@17.0.2):
+    resolution:
+      { integrity: sha512-G0K+378jf9jw9g+hCAoKnsAe/UGTRspqPeuAYypF2FgNr+dC7dUpc7/VkNhZBVqSJzUWVEK8NyXcqkfi0IemIg== }
+    peerDependencies:
+      react: ^16.8 || ^17 || ^18
+      react-dom: ^16.8 || ^17 || ^18
+    dependencies:
+      "@patternfly/react-icons": 4.93.6(react-dom@17.0.2)(react@17.0.2)
+      "@patternfly/react-styles": 4.92.6
+      "@patternfly/react-tokens": 4.94.6
+      focus-trap: 6.9.2
+      react: 17.0.2
+      react-dom: 17.0.2(react@17.0.2)
+      react-dropzone: 11.4.2(react@17.0.2)
+      tippy.js: 5.1.2
+      tslib: 2.3.1
+    dev: false
+
   /@patternfly/react-icons@4.19.8(react-dom@17.0.2)(react@17.0.2):
     resolution:
       { integrity: sha512-JBBcVntRLspe857JnGo8lFaZfy+WOR/IYe2E9W3Rknqm1T8WO6oXpeEnrr5r9bpYDFUa4ttcb/acuQXc1xypxg== }
@@ -11385,11 +11446,27 @@ packages:
       react-dom: 17.0.2(react@17.0.2)
     dev: false
 
+  /@patternfly/react-icons@4.93.6(react-dom@17.0.2)(react@17.0.2):
+    resolution:
+      { integrity: sha512-ZrXegc/81oiuTIeWvoHb3nG/eZODbB4rYmekBEsrbiysyO7m/sUFoi/RLvgFINrRoh6YCJqL5fj06Jg6d7jX1g== }
+    peerDependencies:
+      react: ^16.8 || ^17 || ^18
+      react-dom: ^16.8 || ^17 || ^18
+    dependencies:
+      react: 17.0.2
+      react-dom: 17.0.2(react@17.0.2)
+    dev: false
+
   /@patternfly/react-styles@4.18.8:
     resolution:
       { integrity: sha512-136N/Whs0qXDtPpsh5JeNJld5BeFPsbmmcgI5LlMQ+P9dioddh24rTqaaOIea67tHiXUB7orxaqKpBBILXqcPQ== }
     dev: false
 
+  /@patternfly/react-styles@4.92.6:
+    resolution:
+      { integrity: sha512-b8uQdEReMyeoMzjpMri845QxqtupY/tIFFYfVeKoB2neno8gkcW1RvDdDe62LF88q45OktCwAe/8A99ker10Iw== }
+    dev: false
+
   /@patternfly/react-table@4.37.8(react-dom@17.0.2)(react@17.0.2):
     resolution:
       { integrity: sha512-DEaRooSGgfauX5RV3rwNcc9ZgMzR7gcCxsn9V7oNz6UsBgAV5cL7leGdAETdcV/B2+JMmGb+6QPjc54lsvwiuQ== }
@@ -11412,6 +11489,11 @@ packages:
       { integrity: sha512-n06+BYDviOEuoo+qE9f0Jm1DkMDpwtXWyaJFHsvi8w8uddQEsBGGoP7lpkwZj15u6jc+F9IDgk/j+EkTScrvUA== }
     dev: false
 
+  /@patternfly/react-tokens@4.94.6:
+    resolution:
+      { integrity: sha512-tm7C6nat+uKMr1hrapis7hS3rN9cr41tpcCKhx6cod6FLU8KwF2Yt5KUxakhIOCEcE/M/EhXhAw/qejp8w0r7Q== }
+    dev: false
+
   /@pnpm/build-modules@9.3.5(@pnpm/logger@4.0.0):
     resolution:
       { integrity: sha512-R2Lvw7EcXFXdyMuohWK4JIew255hge484OLl7mButULJ6/PPvgjs1ph6nT+pROcdaxic/yVVVuVvd6WPlyE1oA== }
@@ -14470,11 +14552,13 @@ packages:
     resolution:
       { integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== }
     engines: { node: ">=0.10.0" }
+    dev: true
 
   /ansi-regex@3.0.1:
     resolution:
       { integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== }
     engines: { node: ">=4" }
+    dev: true
 
   /ansi-regex@5.0.1:
     resolution:
@@ -15981,6 +16065,7 @@ packages:
     resolution:
       { integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== }
     engines: { node: ">=0.10.0" }
+    dev: true
 
   /collect-v8-coverage@1.0.1:
     resolution:
@@ -17524,6 +17609,7 @@ packages:
     resolution:
       { integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== }
     engines: { node: ">=0.10.0" }
+    dev: true
 
   /decamelize@4.0.0:
     resolution:
@@ -19591,6 +19677,13 @@ packages:
       tabbable: 5.1.5
     dev: false
 
+  /focus-trap@6.9.2:
+    resolution:
+      { integrity: sha512-gBEuXOPNOKPrLdZpMFUSTyIo1eT2NSZRrwZ9r/0Jqw5tmT3Yvxfmu8KBHw8xW2XQkw6E/JoG+OlEq7UDtSUNgw== }
+    dependencies:
+      tabbable: 5.3.3
+    dev: false
+
   /follow-redirects@1.14.9:
     resolution:
       { integrity: sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== }
@@ -20304,6 +20397,13 @@ packages:
       tiny-warning: 1.0.3
       value-equal: 1.0.1
 
+  /history@5.3.0:
+    resolution:
+      { integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ== }
+    dependencies:
+      "@babel/runtime": 7.16.7
+    dev: false
+
   /hoist-non-react-statics@3.3.2:
     resolution:
       { integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== }
@@ -21040,12 +21140,7 @@ packages:
     engines: { node: ">=0.10.0" }
     dependencies:
       number-is-nan: 1.0.1
-
-  /is-fullwidth-code-point/2.0.0:
-    resolution:
-      { integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== }
-    engines: { node: ">=4" }
-    dev: false
+    dev: true
 
   /is-fullwidth-code-point@3.0.0:
     resolution:
@@ -21199,6 +21294,7 @@ packages:
     resolution:
       { integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== }
     engines: { node: ">=0.10.0" }
+    dev: true
 
   /is-stream@2.0.0:
     resolution:
@@ -21281,6 +21377,7 @@ packages:
   /isexe@2.0.0:
     resolution:
       { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== }
+    dev: true
 
   /isobject@2.1.0:
     resolution:
@@ -23050,13 +23147,7 @@ packages:
     resolution:
       { integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== }
     engines: { node: ">=8" }
-
-  /lru-cache/4.1.5:
-    resolution:
-      { integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== }
-    dependencies:
-      pseudomap: 1.0.2
-      yallist: 2.1.2
+    dev: true
 
   /lru-cache@6.0.0:
     resolution:
@@ -24200,6 +24291,7 @@ packages:
     engines: { node: ">=4" }
     dependencies:
       path-key: 2.0.1
+    dev: true
 
   /npm-run-path@4.0.1:
     resolution:
@@ -24241,6 +24333,7 @@ packages:
     resolution:
       { integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== }
     engines: { node: ">=0.10.0" }
+    dev: true
 
   /numeral@2.0.6:
     resolution:
@@ -24517,6 +24610,7 @@ packages:
     resolution:
       { integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== }
     engines: { node: ">=4" }
+    dev: true
 
   /p-finally@2.0.1:
     resolution:
@@ -24831,6 +24925,7 @@ packages:
     resolution:
       { integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== }
     engines: { node: ">=4" }
+    dev: true
 
   /path-exists@4.0.0:
     resolution:
@@ -24848,6 +24943,7 @@ packages:
     resolution:
       { integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== }
     engines: { node: ">=4" }
+    dev: true
 
   /path-key@3.1.1:
     resolution:
@@ -27195,6 +27291,7 @@ packages:
   /set-blocking@2.0.0:
     resolution:
       { integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== }
+    dev: true
 
   /set-immediate-shim@1.0.1:
     resolution:
@@ -27260,6 +27357,7 @@ packages:
     engines: { node: ">=0.10.0" }
     dependencies:
       shebang-regex: 1.0.0
+    dev: true
 
   /shebang-command@2.0.0:
     resolution:
@@ -27273,6 +27371,7 @@ packages:
     resolution:
       { integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== }
     engines: { node: ">=0.10.0" }
+    dev: true
 
   /shebang-regex@3.0.0:
     resolution:
@@ -27286,6 +27385,14 @@ packages:
     dev: true
     optional: true
 
+  /showdown@2.1.0:
+    resolution:
+      { integrity: sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ== }
+    hasBin: true
+    dependencies:
+      commander: 9.4.1
+    dev: false
+
   /side-channel@1.0.4:
     resolution:
       { integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== }
@@ -27848,15 +27955,7 @@ packages:
       code-point-at: 1.1.0
       is-fullwidth-code-point: 1.0.0
       strip-ansi: 3.0.1
-
-  /string-width/2.1.1:
-    resolution:
-      { integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== }
-    engines: { node: ">=4" }
-    dependencies:
-      is-fullwidth-code-point: 2.0.0
-      strip-ansi: 4.0.0
-    dev: false
+    dev: true
 
   /string-width@4.2.3:
     resolution:
@@ -27919,14 +28018,7 @@ packages:
     engines: { node: ">=0.10.0" }
     dependencies:
       ansi-regex: 2.1.1
-
-  /strip-ansi/4.0.0:
-    resolution:
-      { integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== }
-    engines: { node: ">=4" }
-    dependencies:
-      ansi-regex: 3.0.1
-    dev: false
+    dev: true
 
   /strip-ansi@6.0.1:
     resolution:
@@ -27960,6 +28052,7 @@ packages:
     resolution:
       { integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== }
     engines: { node: ">=0.10.0" }
+    dev: true
 
   /strip-final-newline@2.0.0:
     resolution:
@@ -28136,6 +28229,11 @@ packages:
       { integrity: sha512-oVAPrWgLLqrbvQE8XqcU7CVBq6SQbaIbHkhOca3u7/jzuQvyZycrUKPCGr04qpEIUslmUlULbSeN+m3QrKEykA== }
     dev: false
 
+  /tabbable@5.3.3:
+    resolution:
+      { integrity: sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA== }
+    dev: false
+
   /table@6.7.1:
     resolution:
       { integrity: sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== }
@@ -30157,6 +30255,7 @@ packages:
   /which-module@2.0.0:
     resolution:
       { integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== }
+    dev: true
 
   /which@1.3.1:
     resolution:
@@ -30164,6 +30263,7 @@ packages:
     hasBin: true
     dependencies:
       isexe: 2.0.0
+    dev: true
 
   /which@2.0.2:
     resolution:


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 10/27: NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1490)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit 2a295dbd834c3aaed458b8f36cc11389ad4ac37a
Author: Fabrizio Antonangeli <fa...@gmail.com>
AuthorDate: Tue Feb 28 17:37:09 2023 +0100

    NO-ISSUE: merge main into KOGITO-8015-feature-preview  (#1490)
    
    Co-authored-by: Handreyrc <47...@users.noreply.github.com>
    Co-authored-by: Roger Martinez <ro...@gmail.com>
    Co-authored-by: Tiago Bento <15...@users.noreply.github.com>
    Co-authored-by: Kumar Aditya Raj <se...@gmail.com>
    Co-authored-by: Kirill Gaevskii <kg...@redhat.com>
    Co-authored-by: William Antônio Siqueira <wi...@gmail.com>
    Co-authored-by: Jaime Enriquez <ja...@inodesoft.com>
    Co-authored-by: Luiz João Motta <lu...@gmail.com>
    Co-authored-by: Zbyněk Drápela <61...@users.noreply.github.com>
    Co-authored-by: Manaswini Das <da...@gmail.com>
    Co-authored-by: Pere Fernández <pe...@users.noreply.github.com>
    Co-authored-by: Paulo Martins <pa...@gmail.com>
    Co-authored-by: Guilherme Caponetto <63...@users.noreply.github.com>
---
 .github/workflows/ci_build.yml                     |   21 +-
 examples/base64png-editor/package.json             |    4 +-
 examples/uniforms-patternfly/package.json          |    4 +-
 examples/webapp/package.json                       |    4 +-
 package.json                                       |    1 +
 packages/backend/package.json                      |    2 +-
 .../backend/src/node/TestScenarioRunnerService.ts  |    9 +-
 .../data_cell_focus.snap.png                       |  Bin 40520 -> 43437 bytes
 .../header_cell_focus.snap.png                     |  Bin 40537 -> 43443 bytes
 .../input_header_cell_focus.snap.png               |  Bin 39663 -> 42798 bytes
 .../function_parameter_focus.snap.png              |  Bin 29863 -> 31810 bytes
 .../list_expression.cy.ts/data_cell_focus.snap.png |  Bin 16300 -> 16670 bytes
 .../data_cell_focus.snap.png                       |  Bin 22158 -> 23398 bytes
 .../literal_expression.cy.ts/no_focus.snap.png     |  Bin 22127 -> 23367 bytes
 .../data_cell_focus.snap.png                       |  Bin 35526 -> 38625 bytes
 .../it-tests/e2e/context_expression.cy.ts          |    6 +-
 packages/boxed-expression-component/package.json   |    8 +-
 .../src/components/Table/TableBody.tsx             |    2 +-
 packages/dashbuilder-component-table/package.json  |    4 +-
 .../src/FilteredTable.tsx                          |    2 +-
 .../dashbuilder-component-uniforms/package.json    |    4 +-
 .../dev-webapp/manifest.dev.json                   |    4 +
 .../package.json                                   |    6 +-
 .../src/VictoryChartComponent.tsx                  |    4 +
 .../static/index.css                               |   11 +
 .../static/index.html                              |    1 +
 packages/dashbuilder-editor/package.json           |    4 +-
 .../package.json                                   |    4 +-
 packages/dashbuilder-viewer/package.json           |    4 +-
 .../dashbuilder/client/RuntimeClientLoader.java    |   15 +-
 .../parser/JSONRuntimeModelClientParser.java       |    8 +-
 .../client/parser/PropertyReplacementService.java  |   21 +-
 .../parser/YAMLRuntimeModelClientParser.java       |    6 +-
 .../client/perspective/SamplesPerspective.java     |   47 +
 .../client/resources/i18n/AppConstants.java        |   10 +-
 .../dashbuilder/client/screens/EmptyScreen.java    |   20 +-
 .../dashbuilder/client/screens/RouterScreen.java   |   25 +-
 .../dashbuilder/client/screens/SamplesScreen.java  |  109 ++
 .../client/screens/view/EmptyScreenView.html       |    4 +
 .../client/screens/view/EmptyScreenView.java       |   24 +-
 .../client/screens/view/SamplesScreenView.css      |   51 +
 .../client/screens/view/SamplesScreenView.html     |   35 +
 .../client/screens/view/SamplesScreenView.java     |  146 +++
 .../client/services/SamplesService.java            |  176 ++++
 .../client/setup/RuntimeClientSetup.java           |    8 +-
 .../org/dashbuilder/client/widgets/SampleCard.java |  101 ++
 .../dashbuilder/client/widgets/SamplesCardRow.java |   67 ++
 .../client/widgets/view/SampleCardView.css         |   74 ++
 .../client/widgets/view/SampleCardView.html        |   30 +
 .../client/widgets/view/SampleCardView.java        |  102 ++
 .../client/widgets/view/SamplesCardRowView.css     |   29 +
 .../view/SamplesCardRowView.html}                  |   13 +-
 .../client/widgets/view/SamplesCardRowView.java    |   69 ++
 .../client/resources/i18n/AppConstants.properties  |   10 +-
 .../src/main/webapp/images/samples_brand.png       |  Bin 0 -> 12378 bytes
 .../src/main/webapp/setup.js                       |   31 +-
 .../client/RuntimeClientLoaderTest.java            |    4 +
 .../client/services/SamplesServiceTest.java        |   89 ++
 .../marshalling/GlobalSettingsJSONMarshaller.java  |   14 +-
 .../marshalling/RuntimeModelJSONMarshaller.java    |    4 +
 .../dashbuilder/shared/model/GlobalSettings.java   |    9 +
 .../GlobalSettingsJSONMarshallerTest.java          |    7 +-
 .../dmn-dev-deployment-form-webapp/package.json    |    4 +-
 packages/editor/package.json                       |    4 +-
 .../KeyBindingsHelpOverlay.test.tsx.snap           |    7 +-
 .../__snapshots__/LoadingScreen.test.tsx.snap      |    3 +
 .../__snapshots__/EditorEnvelopeView.test.tsx.snap |    1 +
 packages/form-dmn/package.json                     |    4 +-
 packages/form-dmn/src/DmnFormResult.tsx            |   16 +-
 packages/form-dmn/tests/DmnForm.test.tsx           |   93 +-
 .../tests/__snapshots__/DmnForm.test.tsx.snap      |   14 +-
 packages/form/package.json                         |    4 +-
 packages/form/src/FormBase.tsx                     |    6 +-
 packages/form/src/FormComponent.tsx                |    9 +-
 packages/form/src/FormHook.tsx                     |   75 +-
 packages/guided-tour/package.json                  |    4 +-
 .../import-java-classes-component/package.json     |    6 +-
 .../__snapshots__/ImportJavaClasses.test.tsx.snap  |  234 +++--
 .../ImportJavaClassesWizardFirstStep.tsx           |    2 +-
 packages/kie-bc-editors/package.json               |    2 +-
 packages/kn-plugin-workflow/package.json           |    2 +-
 packages/online-editor/package.json                |    6 +-
 .../online-editor/src/aboutModal/AboutButton.tsx   |    1 +
 .../DmnRunnerInputsDispatchContext.tsx             |    6 +-
 .../DmnRunnerInputsDispatchContextProvider.tsx     |   25 +-
 .../src/dmnRunnerInputs/DmnRunnerInputsHook.tsx    |   34 +-
 .../src/dmnRunnerInputs/DmnRunnerInputsService.tsx |    6 +-
 .../src/editor/DmnRunner/DmnRunnerDockToggle.tsx   |    6 +-
 .../DmnRunner/DmnRunnerDrawerPanelContent.tsx      |   90 +-
 packages/online-editor/src/editor/EditorPage.tsx   |    2 +-
 .../src/editor/EditorPageDockDrawer.tsx            |   46 +-
 .../KieSandboxExtendedServicesButtons.tsx          |    5 +-
 packages/online-editor/src/home/HomePage.tsx       |   10 +-
 .../src/pageTemplate/OnlineEditorPage.tsx          |   55 +-
 .../src/marshaller/Marshaller.ts                   |    4 +-
 .../marshaller/jsonata/json2ui/BaselineModel.ts    |    2 +-
 .../marshaller/jsonata/json2ui/NaiveBayesModel.ts  |    2 +-
 .../src/marshaller/model/pmml4_4.ts                |  127 ++-
 .../tests/marshaller/DataDictionary.test.ts        |    6 +-
 .../tests/marshaller/Scorecard.test.ts             |   53 +-
 packages/pmml-editor/package.json                  |    6 +-
 .../DataDictionaryHandler.tsx                      |    4 +-
 .../DataDictionary/dataDictionaryUtils.ts          |    4 +-
 .../EditorCore/molecules/EditorHeader.tsx          |    4 +-
 .../organisms/PredicateConverter.ts                |   19 +-
 .../templates/ScorecardEditorPage.tsx              |    3 +-
 .../molecules/LinearRegressionViewAdaptor.tsx      |    3 +-
 .../MiningSchemaContainer.tsx                      |    4 +-
 .../MiningSchemaFields/MiningSchemaFields.tsx      |    4 +-
 .../MiningSchemaHandler/MiningSchemaHandler.tsx    |    4 +-
 .../components/Outputs/atoms/OutputLabels.tsx      |    4 +-
 .../Outputs/atoms/OutputLabelsEditMode.tsx         |    6 +-
 .../Outputs/molecules/OutputFieldEditRow.tsx       |   14 +-
 .../Outputs/molecules/OutputFieldRow.tsx           |    6 +-
 .../organisms/OutputFieldExtendedProperties.tsx    |   10 +-
 .../Outputs/organisms/OutputFieldsTable.tsx        |    6 +-
 .../Outputs/organisms/OutputsContainer.tsx         |    6 +-
 .../Outputs/organisms/OutputsHandler.tsx           |    4 +-
 .../editor/reducers/DataDictionaryFieldReducer.ts  |    4 +-
 .../src/editor/reducers/DataDictionaryReducer.ts   |    6 +-
 .../editor/reducers/MiningSchemaFieldReducer.ts    |    5 +-
 .../src/editor/reducers/MiningSchemaReducer.ts     |    6 +-
 .../src/editor/reducers/OutputReducer.ts           |    4 +-
 .../src/editor/reducers/ScorecardReducer.ts        |    5 +-
 .../src/editor/validation/Attributes.ts            |    3 +-
 .../__snapshots__/AttributesTable.test.tsx.snap    |    4 +-
 .../__snapshots__/ModelCard.test.tsx.snap          |    2 +-
 .../__snapshots__/LandingPage.test.tsx.snap        |    2 +-
 .../MiningSchemaContainer.test.tsx                 |   11 +-
 .../OutputFieldsTable/OutputFieldsTable.test.tsx   |    6 +-
 .../reducers/DataDictionaryFieldReducer.test.ts    |   16 +-
 .../editor/reducers/DataDictionaryReducer.test.ts  |    4 +-
 .../editor/reducers/DelegatingModelReducer.test.ts |   14 +-
 .../reducers/MiningSchemaFieldReducer.test.ts      |   14 +-
 .../tests/editor/reducers/ScorecardReducer.test.ts |   25 +-
 .../tests/editor/validation/Attributes.test.ts     |   56 +-
 .../package.json                                   |    4 +-
 packages/serverless-logic-web-tools/package.json   |    6 +-
 .../src/editor/EditorPage.tsx                      |    2 +-
 .../serverless-logic-web-tools/webpack.config.js   |    2 +-
 .../package.json                                   |    4 +-
 .../view/wires/ext/WiresConnectorViewExt.java      |    4 +
 .../view/wires/ext/WiresConnectorViewExtTest.java  |    3 +-
 .../OrthogonalPolylinePointsChangedEvent.java      |   59 ++
 .../OrthogonalPolylinePointsChangedHandler.java}   |   11 +-
 .../ait/lienzo/client/core/shape/IDrawable.java    |    3 +
 .../com/ait/lienzo/client/core/shape/Node.java     |    7 +
 .../client/core/shape/OrthogonalPolyLine.java      |   21 +-
 .../core/shape/wires/types/JsWiresConnector.java   |   23 +
 .../core/shape/wires/util/WiresConnectorLabel.java |   35 +-
 .../ait/lienzo/client/core/types/Point2DArray.java |   10 +
 .../client/core/shape/OrthogonalPolyLineTest.java  |   10 +
 .../core/shape/wires/WiresConnectionTest.java      |    2 +
 .../common/stunner/sw/autolayout/AutoLayout.java   |  246 ++++-
 .../common/stunner/sw/marshall/BuilderContext.java |    2 +-
 .../common/stunner/sw/marshall/Marshaller.java     |    5 +-
 .../stunner/sw/marshall/StateMarshalling.java      |    9 +-
 .../stunner/sw/marshall/TransitionMarshalling.java |   26 +-
 .../stunner/sw/marshall/WorkflowMarshalling.java   |   12 -
 .../stunner/sw/autolayout/AutoLayoutTest.java      |  390 +++++++
 .../stunner/sw/marshall/BaseMarshallingTest.java   |   23 +
 .../stunner/sw/marshall/EmptyWorkflowNameTest.java |    2 +-
 .../sw/marshall/FilledKeyNullIdWorkflowTest.java   |    2 +-
 .../sw/marshall/NullKeyNullIdWorkflowTest.java     |    2 +-
 .../sw/marshall/OperationStateMarshallingTest.java |    3 +-
 .../stunner/sw/marshall/StateMarshallingTest.java  |    8 +-
 .../sw/marshall/StatesFlowMarshallingTest.java     |    2 +-
 .../sw/client/shapes/CallbackStateShape.java       |    6 +
 .../stunner/sw/client/shapes/EventStateShape.java  |    2 +
 .../sw/client/shapes/ForEachStateShape.java        |    6 +
 .../common/stunner/sw/client/shapes/HasAction.java |   79 ++
 .../sw/client/shapes/OperationStateShape.java      |    6 +
 .../sw/client/shapes/ParallelStateShape.java       |    2 +
 .../stunner/sw/client/shapes/SleepStateShape.java  |    5 +-
 .../stunner/sw/client/shapes/SwitchStateShape.java |    2 +
 .../stunner/sw/client/shapes/TransitionView.java   |   32 +-
 .../stunner/sw/client/shapes/icons/CornerIcon.java |   12 +-
 .../stunner/sw/client/shapes/icons/IconPath.java   |    1 +
 .../icons/{IconPath.java => IconPosition.java}     |    7 +-
 .../stunner/sw/client/shapes/HasActionTest.java    |  166 +++
 .../stunner/sw/client/selenium/JsCanvasHelper.java |    9 +
 .../sw/client/selenium/SWEditorSeleniumIT.java     |  160 +++
 .../package.json                                   |    4 +-
 .../package.json                                   |    4 +-
 .../serverless-workflow-text-editor/package.json   |    4 +-
 .../components/mediators/ZoomLevelSelector.java    |   13 +-
 .../actions/AbstractActionsToolboxView.java        |   34 +-
 .../client/lienzo/util/ToolboxRefreshEvent.java}   |    6 +-
 .../mediators/ZoomLevelSelectorPresenterTest.java  |    8 +-
 .../mediators/ZoomLevelSelectorTest.java           |   12 +-
 .../actions/AbstractActionsToolboxViewTest.java    |    9 +
 packages/text-editor/package.json                  |    2 +-
 packages/uniforms-patternfly/package.json          |    4 +-
 packages/uniforms-patternfly/src/DateField.tsx     |   12 +-
 packages/uniforms-patternfly/src/LongTextField.tsx |    2 +-
 packages/uniforms-patternfly/src/TextField.tsx     |    4 +-
 .../src/__tests__/DateField.test.tsx               |   20 +-
 packages/unitables-dmn/package.json                |    4 +-
 packages/unitables/package.json                    |    4 +-
 .../src/browser/extension.ts                       |   12 +
 .../builtInVsCodeEditorDashbuilderContributions.ts |    4 +-
 .../builtInVsCodeEditorSwfContributions.ts         |    4 +-
 packages/yard-editor/package.json                  |    4 +-
 pnpm-lock.yaml                                     | 1080 +++++++++++++-------
 repo/graph.dot                                     |    2 +
 repo/graph.json                                    |    3 +
 scripts/check-junit-report-results/jest.config.js  |   27 +
 scripts/check-junit-report-results/package.json    |   18 +
 scripts/check-junit-report-results/src/index.js    |   44 +
 .../check-junit-report-results/src/parseFile.js    |   66 ++
 .../check-junit-report-results/tests/index.test.js |   34 +
 .../tests/reports/junit-report__from-cypress.xml   |   21 +
 .../tests/reports/junit-report__from-jest.xml      |   73 ++
 .../tests/reports/junit-report__from-surefire.xml  |   68 ++
 214 files changed, 4568 insertions(+), 1212 deletions(-)

diff --git a/.github/workflows/ci_build.yml b/.github/workflows/ci_build.yml
index ccfdbc06e1..8a4be50b74 100644
--- a/.github/workflows/ci_build.yml
+++ b/.github/workflows/ci_build.yml
@@ -132,14 +132,21 @@ jobs:
 
       - name: "Check tests result (`main` only)"
         if: always() && !cancelled() && steps.setup_build_mode.outputs.mode != 'none' && !github.event.pull_request
-        uses: mikepenz/action-junit-report@ab07dd7abefd456d92ecbeb22f81392fafe3d528
-        with:
-          check_name: "-"
-          annotate_only: true
-          fail_on_failure: true
-          report_paths: |
+        uses: actions/github-script@v6
+        env:
+          KIE_TOOLS_CI__JUNIT_REPORT_RESULTS_PATTERNS: |-
             ${{ steps.ci_patterns.outputs.tests_reports_patterns }}
             ${{ steps.ci_patterns.outputs.integration_tests_reports_patterns }}
+        with:
+          result-encoding: string
+          script: |
+            const patterns = process.env["KIE_TOOLS_CI__JUNIT_REPORT_RESULTS_PATTERNS"]
+                                .split("\n")
+                                .map(p => p.trim())
+                                .filter(p => p);
+
+            const script = require("./scripts/check-junit-report-results/src/index.js");
+            await script({ core, glob, patterns });
 
       - name: "Check hanging uncommitted files (you should commit those!)"
         if: always() && !cancelled() && steps.setup_build_mode.outputs.mode != 'none'
@@ -160,6 +167,8 @@ jobs:
           BUILDKITE_BRANCH: ${{ github.ref_name }}
           BUILDKITE_MESSAGE: ${{ github.event.commits[0].message }}
         run: |
+          eval "find -P * -type f ${{ steps.ci_patterns.outputs.integration_tests_reports_patterns_for_find }}"
+          echo "---------------------------- starting upload -----------------------"
           eval "find -P * -type f ${{ steps.ci_patterns.outputs.integration_tests_reports_patterns_for_find }}" | xargs -I{} curl -X POST \
             -H "Authorization: Token token=\"$BUILDKITE_ANALYTICS_TOKEN\"" \
             -F "format=junit" \
diff --git a/examples/base64png-editor/package.json b/examples/base64png-editor/package.json
index 87c393fde0..b8c1f66ca9 100644
--- a/examples/base64png-editor/package.json
+++ b/examples/base64png-editor/package.json
@@ -28,8 +28,8 @@
     "@kie-tools-core/notifications": "workspace:*",
     "@kie-tools-core/patternfly-base": "workspace:*",
     "@kie-tools-core/workspace": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
     "react": "^17.0.2",
     "react-dom": "^17.0.2"
   },
diff --git a/examples/uniforms-patternfly/package.json b/examples/uniforms-patternfly/package.json
index 234e211670..47fbb90a8a 100644
--- a/examples/uniforms-patternfly/package.json
+++ b/examples/uniforms-patternfly/package.json
@@ -12,8 +12,8 @@
   "dependencies": {
     "@kie-tools-core/patternfly-base": "workspace:*",
     "@kie-tools/uniforms-patternfly": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
     "ajv": "^6.12.6",
     "react": "^17.0.2",
     "react-dom": "^17.0.2",
diff --git a/examples/webapp/package.json b/examples/webapp/package.json
index f1939095e6..dbc1557aeb 100644
--- a/examples/webapp/package.json
+++ b/examples/webapp/package.json
@@ -22,8 +22,8 @@
     "@kie-tools/kie-bc-editors": "workspace:*",
     "@kie-tools/kie-editors-standalone": "workspace:*",
     "@kie-tools/serverless-workflow-standalone-editor": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
     "monaco-editor": "^0.33.0",
     "react": "^17.0.2",
     "react-dom": "^17.0.2"
diff --git a/package.json b/package.json
index b3f35b0a6d..7332149438 100644
--- a/package.json
+++ b/package.json
@@ -15,6 +15,7 @@
   "devDependencies": {
     "@kie-tools-scripts/bootstrap": "workspace:*",
     "@kie-tools-scripts/build-env": "workspace:*",
+    "@kie-tools-scripts/check-junit-report-results": "workspace:*",
     "@kie-tools-scripts/run-script-if": "workspace:*",
     "@kie-tools-scripts/sparse-checkout": "workspace:*",
     "@kie-tools-scripts/update-version": "workspace:*",
diff --git a/packages/backend/package.json b/packages/backend/package.json
index b1194ffde9..8e079d453c 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -27,7 +27,7 @@
     "@kie-tools-core/notifications": "workspace:*",
     "@kie-tools-core/workspace": "workspace:*",
     "axios": "^0.27.2",
-    "fast-xml-parser": "^3.17.4",
+    "fast-xml-parser": "^4.1.2",
     "portfinder": "^1.0.32",
     "semver": "^7.3.5",
     "sinon": "^11.1.1"
diff --git a/packages/backend/src/node/TestScenarioRunnerService.ts b/packages/backend/src/node/TestScenarioRunnerService.ts
index 57c6a00cb0..a5fb515fc4 100644
--- a/packages/backend/src/node/TestScenarioRunnerService.ts
+++ b/packages/backend/src/node/TestScenarioRunnerService.ts
@@ -15,7 +15,7 @@
  */
 
 import * as cp from "child_process";
-import * as xmlParser from "fast-xml-parser";
+import { XMLParser } from "fast-xml-parser";
 import * as fs from "fs";
 import * as path from "path";
 import { CapabilityResponse, Service } from "../api";
@@ -88,13 +88,14 @@ export class TestScenarioRunnerService implements Service, TestScenarioRunnerCap
         }
 
         const resultXmlPath = path.join(baseDir, "target", "surefire-reports", "TEST-" + runnerClass + ".xml");
-        const attrsMap = xmlParser.getTraversalObj(fs.readFileSync(resultXmlPath).toString(), {
+        const parser = new XMLParser({
           attributeNamePrefix: "",
-          ignoreNameSpace: true,
+          removeNSPrefix: true,
           ignoreAttributes: false,
           parseAttributeValue: true,
           trimValues: true,
-        }).child.testsuite[0].attrsMap;
+        });
+        const attrsMap = parser.parse(fs.readFileSync(resultXmlPath).toString()).testsuites.testsuite[0];
 
         resolve(
           CapabilityResponse.ok({
diff --git a/packages/boxed-expression-component/it-tests/cypress/snapshots/context_expression.cy.ts/data_cell_focus.snap.png b/packages/boxed-expression-component/it-tests/cypress/snapshots/context_expression.cy.ts/data_cell_focus.snap.png
index 878209e3d3..ea84c90c04 100644
Binary files a/packages/boxed-expression-component/it-tests/cypress/snapshots/context_expression.cy.ts/data_cell_focus.snap.png and b/packages/boxed-expression-component/it-tests/cypress/snapshots/context_expression.cy.ts/data_cell_focus.snap.png differ
diff --git a/packages/boxed-expression-component/it-tests/cypress/snapshots/context_expression.cy.ts/header_cell_focus.snap.png b/packages/boxed-expression-component/it-tests/cypress/snapshots/context_expression.cy.ts/header_cell_focus.snap.png
index d3ee85956f..8f62bf695f 100644
Binary files a/packages/boxed-expression-component/it-tests/cypress/snapshots/context_expression.cy.ts/header_cell_focus.snap.png and b/packages/boxed-expression-component/it-tests/cypress/snapshots/context_expression.cy.ts/header_cell_focus.snap.png differ
diff --git a/packages/boxed-expression-component/it-tests/cypress/snapshots/decision_table_expression.cy.ts/input_header_cell_focus.snap.png b/packages/boxed-expression-component/it-tests/cypress/snapshots/decision_table_expression.cy.ts/input_header_cell_focus.snap.png
index 985d91afc0..be55bf6977 100644
Binary files a/packages/boxed-expression-component/it-tests/cypress/snapshots/decision_table_expression.cy.ts/input_header_cell_focus.snap.png and b/packages/boxed-expression-component/it-tests/cypress/snapshots/decision_table_expression.cy.ts/input_header_cell_focus.snap.png differ
diff --git a/packages/boxed-expression-component/it-tests/cypress/snapshots/invocation_expression.cy.ts/function_parameter_focus.snap.png b/packages/boxed-expression-component/it-tests/cypress/snapshots/invocation_expression.cy.ts/function_parameter_focus.snap.png
index 10f4a8f399..cd58c35d4e 100644
Binary files a/packages/boxed-expression-component/it-tests/cypress/snapshots/invocation_expression.cy.ts/function_parameter_focus.snap.png and b/packages/boxed-expression-component/it-tests/cypress/snapshots/invocation_expression.cy.ts/function_parameter_focus.snap.png differ
diff --git a/packages/boxed-expression-component/it-tests/cypress/snapshots/list_expression.cy.ts/data_cell_focus.snap.png b/packages/boxed-expression-component/it-tests/cypress/snapshots/list_expression.cy.ts/data_cell_focus.snap.png
index 05ae9370d5..d4b56e0caf 100644
Binary files a/packages/boxed-expression-component/it-tests/cypress/snapshots/list_expression.cy.ts/data_cell_focus.snap.png and b/packages/boxed-expression-component/it-tests/cypress/snapshots/list_expression.cy.ts/data_cell_focus.snap.png differ
diff --git a/packages/boxed-expression-component/it-tests/cypress/snapshots/literal_expression.cy.ts/data_cell_focus.snap.png b/packages/boxed-expression-component/it-tests/cypress/snapshots/literal_expression.cy.ts/data_cell_focus.snap.png
index 85b3c3bbf3..e6f3ac3293 100644
Binary files a/packages/boxed-expression-component/it-tests/cypress/snapshots/literal_expression.cy.ts/data_cell_focus.snap.png and b/packages/boxed-expression-component/it-tests/cypress/snapshots/literal_expression.cy.ts/data_cell_focus.snap.png differ
diff --git a/packages/boxed-expression-component/it-tests/cypress/snapshots/literal_expression.cy.ts/no_focus.snap.png b/packages/boxed-expression-component/it-tests/cypress/snapshots/literal_expression.cy.ts/no_focus.snap.png
index 9edce3947a..0a8c6cfc2b 100644
Binary files a/packages/boxed-expression-component/it-tests/cypress/snapshots/literal_expression.cy.ts/no_focus.snap.png and b/packages/boxed-expression-component/it-tests/cypress/snapshots/literal_expression.cy.ts/no_focus.snap.png differ
diff --git a/packages/boxed-expression-component/it-tests/cypress/snapshots/relation_expression.cy.ts/data_cell_focus.snap.png b/packages/boxed-expression-component/it-tests/cypress/snapshots/relation_expression.cy.ts/data_cell_focus.snap.png
index ee89771537..59816ba588 100644
Binary files a/packages/boxed-expression-component/it-tests/cypress/snapshots/relation_expression.cy.ts/data_cell_focus.snap.png and b/packages/boxed-expression-component/it-tests/cypress/snapshots/relation_expression.cy.ts/data_cell_focus.snap.png differ
diff --git a/packages/boxed-expression-component/it-tests/e2e/context_expression.cy.ts b/packages/boxed-expression-component/it-tests/e2e/context_expression.cy.ts
index 6f4e00f635..f40d71db4b 100644
--- a/packages/boxed-expression-component/it-tests/e2e/context_expression.cy.ts
+++ b/packages/boxed-expression-component/it-tests/e2e/context_expression.cy.ts
@@ -101,7 +101,7 @@ describe("Context Expression Tests", () => {
     cy.ouiaId("expression-popover-menu").contains("Context").click({ force: true });
 
     // Invoke Logic type selector for first context entry
-    cy.ouiaId("OUIA-Generated-TableRow-2").within(($row) => {
+    cy.ouiaId("expression-additive-row").within(($row) => {
       cy.contains("Select expression").click();
     });
 
@@ -206,7 +206,7 @@ describe("Context Expression Tests :: Nested Relations", () => {
       .type("{rightarrow}{rightarrow}{rightarrow}{downarrow}");
 
     // from last cell navigate to the upper cell
-    cy.ouiaId("OUIA-Generated-TableRow-2").contains("td", "Select expression").should("be.focused").type("{uparrow}");
+    cy.ouiaId("expression-additive-row").contains("td", "Select expression").should("be.focused").type("{uparrow}");
 
     // check if the expression cell of the 2nd row is focused
     cy.ouiaId("expression-row-1").ouiaId("expression-column-2").should("be.focused");
@@ -241,7 +241,7 @@ describe("Context Expression Tests :: Nested Relations", () => {
 
   it("Keyboard interaction with contextMenu", () => {
     // open contextMenu and expression menu from the expression cell of the 2nd row and check you are not able to navigate. Then close the contextMenu.
-    cy.ouiaId("OUIA-Generated-TableRow-2")
+    cy.ouiaId("expression-additive-row")
       .contains("td", "Select expression")
       .rightclick()
       .type("{leftarrow}")
diff --git a/packages/boxed-expression-component/package.json b/packages/boxed-expression-component/package.json
index a08323c098..c01c708de4 100644
--- a/packages/boxed-expression-component/package.json
+++ b/packages/boxed-expression-component/package.json
@@ -23,10 +23,10 @@
     "@kie-tools-core/patternfly-base": "workspace:*",
     "@kie-tools/feel-input-component": "workspace:*",
     "@kie-tools/i18n-common-dictionary": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
-    "@patternfly/react-styles": "^4.18.8",
-    "@patternfly/react-table": "^4.27.15",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
+    "@patternfly/react-styles": "^4.92.6",
+    "@patternfly/react-table": "^4.112.39",
     "lodash": "^4.17.21",
     "papaparse": "^5.3.2",
     "react": "^17.0.2",
diff --git a/packages/boxed-expression-component/src/components/Table/TableBody.tsx b/packages/boxed-expression-component/src/components/Table/TableBody.tsx
index a530c8ed45..65ced52db7 100644
--- a/packages/boxed-expression-component/src/components/Table/TableBody.tsx
+++ b/packages/boxed-expression-component/src/components/Table/TableBody.tsx
@@ -150,7 +150,7 @@ export const TableBody: React.FunctionComponent<TableBodyProps> = ({
 
   const renderAdditiveRow = useCallback(
     (rowIndex: number) => (
-      <Tr className="table-row additive-row">
+      <Tr className="table-row additive-row" ouiaId={"expression-additive-row"}>
         <TdAdditiveCell
           isEmptyCell={true}
           rowIndex={rowIndex}
diff --git a/packages/dashbuilder-component-table/package.json b/packages/dashbuilder-component-table/package.json
index 21f5da7bf5..53bc92c0c4 100644
--- a/packages/dashbuilder-component-table/package.json
+++ b/packages/dashbuilder-component-table/package.json
@@ -25,8 +25,8 @@
   "dependencies": {
     "@kie-tools-core/patternfly-base": "workspace:*",
     "@kie-tools/dashbuilder-component-api": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-table": "^4.27.15",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-table": "^4.112.39",
     "react": "^17.0.2",
     "react-dom": "^17.0.2"
   },
diff --git a/packages/dashbuilder-component-table/src/FilteredTable.tsx b/packages/dashbuilder-component-table/src/FilteredTable.tsx
index f2112b6a56..58f4387958 100644
--- a/packages/dashbuilder-component-table/src/FilteredTable.tsx
+++ b/packages/dashbuilder-component-table/src/FilteredTable.tsx
@@ -160,7 +160,7 @@ export const FilteredTable = (props: Props) => {
             <SearchInput
               placeholder="Filter"
               value={search}
-              onChange={(v: any) => onSearch(v as string)}
+              onChange={(evt: any, v: string) => onSearch(v)}
               onClear={() => onSearch("")}
             />
           </FlexItem>
diff --git a/packages/dashbuilder-component-uniforms/package.json b/packages/dashbuilder-component-uniforms/package.json
index 94b5f30ba3..89ccbfa9c2 100644
--- a/packages/dashbuilder-component-uniforms/package.json
+++ b/packages/dashbuilder-component-uniforms/package.json
@@ -25,8 +25,8 @@
     "@kie-tools-core/patternfly-base": "workspace:*",
     "@kie-tools/dashbuilder-component-api": "workspace:*",
     "@kie-tools/uniforms-patternfly": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-table": "^4.27.15",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-table": "^4.112.39",
     "ajv": "^6.12.6",
     "lodash": "^4.17.21",
     "react": "^17.0.2",
diff --git a/packages/dashbuilder-component-victory-charts/dev-webapp/manifest.dev.json b/packages/dashbuilder-component-victory-charts/dev-webapp/manifest.dev.json
index e621a55d83..539ff4d964 100644
--- a/packages/dashbuilder-component-victory-charts/dev-webapp/manifest.dev.json
+++ b/packages/dashbuilder-component-victory-charts/dev-webapp/manifest.dev.json
@@ -87,6 +87,10 @@
     {
       "key": "barOffset",
       "value": "10"
+    },
+    {
+      "key": "mode",
+      "value": "dark"
     }
   ],
   "dataSet": {
diff --git a/packages/dashbuilder-component-victory-charts/package.json b/packages/dashbuilder-component-victory-charts/package.json
index e6f04c988c..471c239f28 100644
--- a/packages/dashbuilder-component-victory-charts/package.json
+++ b/packages/dashbuilder-component-victory-charts/package.json
@@ -25,9 +25,9 @@
   "dependencies": {
     "@kie-tools-core/patternfly-base": "workspace:*",
     "@kie-tools/dashbuilder-component-api": "workspace:*",
-    "@patternfly/react-charts": "^6.15.23",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-table": "^4.27.15",
+    "@patternfly/react-charts": "^6.94.18",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-table": "^4.112.39",
     "numeral": "^2.0.6",
     "react": "^17.0.2",
     "react-dom": "^17.0.2",
diff --git a/packages/dashbuilder-component-victory-charts/src/VictoryChartComponent.tsx b/packages/dashbuilder-component-victory-charts/src/VictoryChartComponent.tsx
index 90e9fdce69..2ef494c596 100644
--- a/packages/dashbuilder-component-victory-charts/src/VictoryChartComponent.tsx
+++ b/packages/dashbuilder-component-victory-charts/src/VictoryChartComponent.tsx
@@ -39,6 +39,10 @@ export function VictoryChartComponent(props: Props) {
 
   useEffect(() => {
     props.controller.setOnInit((params: Map<string, any>) => {
+      const mode = params.get("mode");
+      if (mode) {
+        document.body.setAttribute("mode", mode.toLowerCase());
+      }
       setVictoryChartProps((props: VictoryChartProps) => {
         return {
           ...props,
diff --git a/packages/dashbuilder-component-victory-charts/static/index.css b/packages/dashbuilder-component-victory-charts/static/index.css
new file mode 100644
index 0000000000..02a86c2b31
--- /dev/null
+++ b/packages/dashbuilder-component-victory-charts/static/index.css
@@ -0,0 +1,11 @@
+[mode="dark"] .pf-c-chart {
+  background-color: #100c2a;
+}
+
+[mode="dark"] .pf-c-chart g text tspan {
+  fill: #eef1fa !important;
+}
+
+[mode="dark"] .pf-c-chart g line {
+  stroke: #eef1fa !important;
+}
diff --git a/packages/dashbuilder-component-victory-charts/static/index.html b/packages/dashbuilder-component-victory-charts/static/index.html
index 332edd6bce..989d897050 100644
--- a/packages/dashbuilder-component-victory-charts/static/index.html
+++ b/packages/dashbuilder-component-victory-charts/static/index.html
@@ -18,6 +18,7 @@
   <head>
     <title>Chart</title>
     <link rel="stylesheet" href="patternfly.min.css" />
+    <link rel="stylesheet" href="index.css" />
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
diff --git a/packages/dashbuilder-editor/package.json b/packages/dashbuilder-editor/package.json
index 5c37c16265..654c095e26 100644
--- a/packages/dashbuilder-editor/package.json
+++ b/packages/dashbuilder-editor/package.json
@@ -40,8 +40,8 @@
     "@kie-tools-core/workspace": "workspace:*",
     "@kie-tools/dashbuilder-client": "workspace:*",
     "@kie-tools/dashbuilder-language-service": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
     "json-schema": "^0.4.0",
     "monaco-editor": "^0.33.0",
     "monaco-yaml": "^4.0.0",
diff --git a/packages/dashbuilder-viewer-deployment-webapp/package.json b/packages/dashbuilder-viewer-deployment-webapp/package.json
index 05e5b7a5a2..d6da3f1581 100644
--- a/packages/dashbuilder-viewer-deployment-webapp/package.json
+++ b/packages/dashbuilder-viewer-deployment-webapp/package.json
@@ -30,8 +30,8 @@
     "@kie-tools-core/workspaces-git-fs": "workspace:*",
     "@kie-tools/dashbuilder-viewer": "workspace:*",
     "@kie-tools/i18n-common-dictionary": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
     "react": "^17.0.2",
     "react-dom": "^17.0.2",
     "react-router": "^5.2.1",
diff --git a/packages/dashbuilder-viewer/package.json b/packages/dashbuilder-viewer/package.json
index fe71ab9777..e5721c0290 100644
--- a/packages/dashbuilder-viewer/package.json
+++ b/packages/dashbuilder-viewer/package.json
@@ -36,8 +36,8 @@
     "@kie-tools-core/operating-system": "workspace:*",
     "@kie-tools-core/patternfly-base": "workspace:*",
     "@kie-tools-core/workspace": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
     "react": "^17.0.2",
     "react-dom": "^17.0.2"
   },
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/RuntimeClientLoader.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/RuntimeClientLoader.java
index da6dfb5db3..9834859dcd 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/RuntimeClientLoader.java
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/RuntimeClientLoader.java
@@ -36,6 +36,7 @@ import org.dashbuilder.client.perspective.generator.RuntimePerspectiveGenerator;
 import org.dashbuilder.client.plugins.RuntimePerspectivePluginManager;
 import org.dashbuilder.client.resources.i18n.AppConstants;
 import org.dashbuilder.client.screens.RouterScreen;
+import org.dashbuilder.client.services.SamplesService;
 import org.dashbuilder.client.setup.RuntimeClientMode;
 import org.dashbuilder.client.setup.RuntimeClientSetup;
 import org.dashbuilder.dataset.events.DataSetDefRemovedEvent;
@@ -85,6 +86,8 @@ public class RuntimeClientLoader {
 
     RuntimeClientSetup setup;
 
+    private SamplesService samplesService;
+
     Event<DataSetDefRemovedEvent> dataSetDefRemovedEvent;
 
     String clientModelBaseUrl;
@@ -102,6 +105,7 @@ public class RuntimeClientLoader {
                                NavigationManager navigationManager,
                                BusyIndicatorView loading,
                                ExternalDataSetClientProvider externalDataSetRegister,
+                               SamplesService samplesService,
                                RuntimeModelClientParserFactory parserFactory,
                                RuntimeModelContentListener contentListener,
                                Event<UpdatedRuntimeModelEvent> updatedRuntimeModelEvent,
@@ -113,6 +117,7 @@ public class RuntimeClientLoader {
         this.runtimePerspectivePluginManager = runtimePerspectivePluginManager;
         this.navigationManager = navigationManager;
         this.externalDataSetProvider = externalDataSetRegister;
+        this.samplesService = samplesService;
         this.parserFactory = parserFactory;
         this.contentListener = contentListener;
         this.loading = loading;
@@ -134,7 +139,8 @@ public class RuntimeClientLoader {
             hideNavBar = setup.getHideNavBar();
             if (modeStr != null) {
                 mode = RuntimeClientMode.getOrDefault(modeStr);
-            } else if (setup.getDashboards() != null && setup.getDashboards().length > 0) {
+            } else if ((setup.getDashboards() != null && setup.getDashboards().length > 0) ||
+                       setup.getSamplesUrl() != null && !setup.getSamplesUrl().trim().isEmpty()) {
                 mode = RuntimeClientMode.CLIENT;
             }
 
@@ -252,6 +258,10 @@ public class RuntimeClientLoader {
         return hideNavBar;
     }
 
+    public boolean hasSamples() {
+        return !samplesService.allSamples().isEmpty();
+    }
+
     /**
      * Loads the given content and attempts to route the result. 
      * @param content
@@ -397,6 +407,9 @@ public class RuntimeClientLoader {
             }
             throw new IllegalArgumentException("External models are not enabled");
         }
+        if (samplesService.isSample(importID)) {
+            return importID;
+        }
         return clientModelBaseUrl + importID;
     }
 }
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/parser/JSONRuntimeModelClientParser.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/parser/JSONRuntimeModelClientParser.java
index fc6ed7624b..b8c3f667e5 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/parser/JSONRuntimeModelClientParser.java
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/parser/JSONRuntimeModelClientParser.java
@@ -27,15 +27,17 @@ public class JSONRuntimeModelClientParser implements RuntimeModelClientParser {
 
     @Inject
     PropertyReplacementService replaceService;
-    
+
     @Inject
     GlobalDisplayerSettings globalDisplayerSettings;
 
     @Override
     public RuntimeModel parse(String jsonContent) {
         var runtimeModelJsonMarshaller = RuntimeModelJSONMarshaller.get();
+        var allowUrlProperties = runtimeModelJsonMarshaller.retrieveGlobalSettings(jsonContent).isAllowUrlProperties();
+
         var properties = runtimeModelJsonMarshaller.retrieveProperties(jsonContent);
-        var newContent = replaceService.replace(jsonContent, properties);        
+        var newContent = replaceService.replace(jsonContent, properties, allowUrlProperties);
         return runtimeModelJsonMarshaller.fromJson(newContent);
     }
 
@@ -44,4 +46,4 @@ public class JSONRuntimeModelClientParser implements RuntimeModelClientParser {
         return content.trim().startsWith("{");
     }
 
-}
\ No newline at end of file
+}
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/parser/PropertyReplacementService.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/parser/PropertyReplacementService.java
index 8e0a3110aa..b626ee4f2d 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/parser/PropertyReplacementService.java
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/parser/PropertyReplacementService.java
@@ -17,10 +17,10 @@
 package org.dashbuilder.client.parser;
 
 import java.util.Map;
-import java.util.Optional;
 
 import javax.enterprise.context.ApplicationScoped;
 
+import com.google.gwt.safehtml.shared.SimpleHtmlSanitizer;
 import elemental2.dom.DomGlobal;
 import elemental2.dom.URLSearchParams;
 
@@ -31,9 +31,13 @@ public class PropertyReplacementService {
     private static String PROPERTY_REPLACEMENT_PATTERN = "\\$\\{" + PROPERTY_KEY + "\\}";
 
     public String replace(String content, Map<String, String> properties) {
+        return replace(content, properties, false);
+    }
+
+    public String replace(String content, Map<String, String> properties, boolean allowUrlProperties) {
         var contentSb = new StringBuffer(content);
         properties.forEach((k, v) -> {
-            var value = getExternalPropertyValue(k, v);
+            var value = getExternalPropertyValue(allowUrlProperties, k, v);
             var replaceToken = PROPERTY_REPLACEMENT_PATTERN.replace(PROPERTY_KEY, k);
             var replacedContent = contentSb.toString().replaceAll(replaceToken, value);
             contentSb.replace(0, contentSb.length(), replacedContent);
@@ -41,13 +45,16 @@ public class PropertyReplacementService {
         return contentSb.toString();
     }
 
-    public String getExternalPropertyValue(String key, String v) {
-        if (DomGlobal.window != null) {
+    public String getExternalPropertyValue(boolean allowUrlProperties, String key, String v) {
+        if (DomGlobal.window != null && allowUrlProperties) {
             var params = new URLSearchParams(DomGlobal.window.location.search);
-            return Optional.ofNullable(params.get(key)).orElse(v);
-        } else {
-            return v;
+            var value = params.get(key);
+            if (value != null) {
+                return SimpleHtmlSanitizer.sanitizeHtml(value).asString();
+            }
         }
+        return v;
+
     }
 
 }
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/parser/YAMLRuntimeModelClientParser.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/parser/YAMLRuntimeModelClientParser.java
index 9c5405abac..b2fd7cc5eb 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/parser/YAMLRuntimeModelClientParser.java
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/parser/YAMLRuntimeModelClientParser.java
@@ -43,10 +43,12 @@ public class YAMLRuntimeModelClientParser implements RuntimeModelClientParser {
     @Override
     public RuntimeModel parse(String content) {
         var jsonContent = convertToJson(content);
-        var properties = RuntimeModelJSONMarshaller.get().retrieveProperties(jsonContent);
+        var jsonMarshaller = RuntimeModelJSONMarshaller.get();
+        var properties = jsonMarshaller.retrieveProperties(jsonContent);
+        var allowUrlProperties = jsonMarshaller.retrieveGlobalSettings(jsonContent).isAllowUrlProperties();
 
         if (properties != null && !properties.isEmpty()) {
-            var replacedContent = replacementService.replace(content, properties);
+            var replacedContent = replacementService.replace(content, properties, allowUrlProperties);
             jsonContent = convertToJson(replacedContent);
         }
         return jsonParser.parse(jsonContent);
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/perspective/SamplesPerspective.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/perspective/SamplesPerspective.java
new file mode 100644
index 0000000000..0a251664ed
--- /dev/null
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/perspective/SamplesPerspective.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.dashbuilder.client.perspective;
+
+import javax.enterprise.context.ApplicationScoped;
+
+import org.dashbuilder.client.screens.SamplesScreen;
+import org.uberfire.client.annotations.Perspective;
+import org.uberfire.client.annotations.WorkbenchPerspective;
+import org.uberfire.client.workbench.panels.impl.StaticWorkbenchPanelPresenter;
+import org.uberfire.mvp.impl.DefaultPlaceRequest;
+import org.uberfire.workbench.model.PerspectiveDefinition;
+import org.uberfire.workbench.model.impl.PartDefinitionImpl;
+import org.uberfire.workbench.model.impl.PerspectiveDefinitionImpl;
+
+@ApplicationScoped
+@WorkbenchPerspective(identifier = SamplesPerspective.ID)
+public class SamplesPerspective {
+
+    public static final String ID = "SamplesPerspective";
+
+    @Perspective
+    public PerspectiveDefinition buildPerspective() {
+        var perspective = new PerspectiveDefinitionImpl(StaticWorkbenchPanelPresenter.class
+                .getName());
+        final var place = new DefaultPlaceRequest(SamplesScreen.ID);
+        var samplesScreen = new PartDefinitionImpl(place);
+        perspective.getRoot().addPart(samplesScreen);
+        perspective.setName("Samples");
+        return perspective;
+    }
+
+}
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/resources/i18n/AppConstants.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/resources/i18n/AppConstants.java
index 14e18d7143..298ee2bc6c 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/resources/i18n/AppConstants.java
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/resources/i18n/AppConstants.java
@@ -50,7 +50,7 @@ public interface AppConstants extends Messages {
     String listDashboardsScreenTitle();
 
     String routerPerspective();
-    
+
     String dashboardAlreadyImport(String newModelId, String exitingModel);
 
     String importSuccess(String fileName);
@@ -62,7 +62,7 @@ public interface AppConstants extends Messages {
     String sessionTimeout();
 
     String invalidBusResponseProbablySessionTimeout();
-    
+
     String dashboardOpenTooltip();
 
     String defaultErrorMessage();
@@ -83,4 +83,8 @@ public interface AppConstants extends Messages {
 
     String errorContentTitle();
 
-}
\ No newline at end of file
+    String samplesScreenTitle();
+
+    String emptyScreenTrySamples();
+
+}
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/EmptyScreen.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/EmptyScreen.java
index dadd5c247f..df963a01d2 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/EmptyScreen.java
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/EmptyScreen.java
@@ -45,7 +45,7 @@ public class EmptyScreen {
 
     @Inject
     View view;
-    
+
     @Inject
     RouterScreen router;
 
@@ -54,15 +54,17 @@ public class EmptyScreen {
 
     @Inject
     RuntimeClientLoader loader;
-    
+
     public interface View extends UberElemental<EmptyScreen> {
-        
+
         void editorMode();
 
         void noModel();
 
         void modelId(String modelId);
-        
+
+        void enableSamplesButton(Runnable action);
+
     }
 
     @PostConstruct
@@ -79,7 +81,7 @@ public class EmptyScreen {
     protected View getPart() {
         return view;
     }
-    
+
     @OnOpen
     protected void onOpen() {
         var modelId = loader.getImportId();
@@ -90,8 +92,12 @@ public class EmptyScreen {
         } else {
             view.noModel();
         }
+
+        if (loader.hasSamples()) {
+            view.enableSamplesButton(router::goToSamplesScreen);
+        }
     }
-    
+
     public void onModelUpdated(@Observes UpdatedRuntimeModelEvent event) {
         reload();
     }
@@ -103,4 +109,4 @@ public class EmptyScreen {
         }
     }
 
-}
\ No newline at end of file
+}
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/RouterScreen.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/RouterScreen.java
index 711a9434db..0617f97e4c 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/RouterScreen.java
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/RouterScreen.java
@@ -22,6 +22,7 @@ import javax.inject.Inject;
 
 import com.google.gwt.core.client.GWT;
 import elemental2.dom.DomGlobal;
+import elemental2.dom.URLSearchParams;
 import org.dashbuilder.client.RuntimeClientLoader;
 import org.dashbuilder.client.RuntimeCommunication;
 import org.dashbuilder.client.navbar.AppNavBar;
@@ -29,6 +30,7 @@ import org.dashbuilder.client.perspective.ContentErrorPerspective;
 import org.dashbuilder.client.perspective.DashboardsListPerspective;
 import org.dashbuilder.client.perspective.EmptyPerspective;
 import org.dashbuilder.client.perspective.RuntimePerspective;
+import org.dashbuilder.client.perspective.SamplesPerspective;
 import org.dashbuilder.client.resources.i18n.AppConstants;
 import org.dashbuilder.shared.event.UpdatedRuntimeModelEvent;
 import org.dashbuilder.shared.model.DashbuilderRuntimeMode;
@@ -51,6 +53,8 @@ public class RouterScreen {
 
     public static final String ID = "RouterScreen";
 
+    public static final String SAMPLES_PARAM = "samples";
+
     private static AppConstants i18n = AppConstants.INSTANCE;
 
     public interface View extends UberElemental<RouterScreen> {
@@ -66,6 +70,9 @@ public class RouterScreen {
     @Inject
     DashboardsListScreen dashboardsListScreen;
 
+    @Inject
+    SamplesScreen samplesScreen;
+
     @Inject
     ContentErrorScreen contentErrorScreen;
 
@@ -99,12 +106,18 @@ public class RouterScreen {
     }
 
     public void doRoute() {
+        var query = new URLSearchParams(DomGlobal.window.location.search);
+        // shortcut to samples screen
+        if (query.get(SAMPLES_PARAM) != null && clientLoader.hasSamples()) {
+            placeManager.goTo(SamplesPerspective.ID);
+            return;
+        }
         clientLoader.load(this::route,
                 (a, t) -> {
                     appNavBar.setHide(true);
                     DomGlobal.console.log("Error loading models: " + a);
                     DomGlobal.console.debug(t);
-                    placeManager.goTo(EmptyPerspective.ID);
+                    goToNoModelsScreen();
                 });
     }
 
@@ -123,7 +136,7 @@ public class RouterScreen {
         }
 
         if (response.getAvailableModels().isEmpty()) {
-            placeManager.goTo(EmptyPerspective.ID);
+            goToNoModelsScreen();
             return;
         }
 
@@ -172,4 +185,12 @@ public class RouterScreen {
         }
     }
 
+    void goToSamplesScreen() {
+        final var newUrl = GWT.getHostPageBaseURL() + "?" + SAMPLES_PARAM;
+        DomGlobal.window.location.href = newUrl;
+    }
+
+    private void goToNoModelsScreen() {
+        placeManager.goTo(EmptyPerspective.ID);
+    }
 }
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/SamplesScreen.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/SamplesScreen.java
new file mode 100644
index 0000000000..b06d528402
--- /dev/null
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/SamplesScreen.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dashbuilder.client.screens;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.PostConstruct;
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+
+import org.dashbuilder.client.resources.i18n.AppConstants;
+import org.dashbuilder.client.services.SamplesService;
+import org.dashbuilder.client.widgets.SampleCard;
+import org.dashbuilder.client.widgets.SamplesCardRow;
+import org.jboss.errai.ioc.client.api.ManagedInstance;
+import org.uberfire.client.annotations.WorkbenchPartTitle;
+import org.uberfire.client.annotations.WorkbenchPartView;
+import org.uberfire.client.annotations.WorkbenchScreen;
+import org.uberfire.client.mvp.UberElemental;
+import org.uberfire.lifecycle.OnClose;
+import org.uberfire.lifecycle.OnOpen;
+
+/**
+ * Screen displayed when there's no dashboards available and samples url is configured
+ *
+ */
+@ApplicationScoped
+@WorkbenchScreen(identifier = SamplesScreen.ID)
+public class SamplesScreen {
+
+    public static final String ID = "SamplesScreen";
+
+    private static final AppConstants i18n = AppConstants.INSTANCE;
+
+    @Inject
+    View view;
+
+    @Inject
+    RouterScreen router;
+
+    @Inject
+    SamplesService samplesService;
+
+    @Inject
+    ManagedInstance<SampleCard> sampleCardInstance;
+
+    @Inject
+    ManagedInstance<SamplesCardRow> samplesCardRowInstance;
+
+    public interface View extends UberElemental<SamplesScreen> {
+
+        void addRows(List<SamplesCardRow> rows);
+
+        void clear();
+    }
+
+    @PostConstruct
+    public void init() {
+        view.init(this);
+    }
+
+    @WorkbenchPartTitle
+    public String title() {
+        return i18n.samplesScreenTitle();
+    }
+
+    @WorkbenchPartView
+    protected View getPart() {
+        return view;
+    }
+
+    @OnOpen
+    protected void onOpen() {
+        var rows = new ArrayList<SamplesCardRow>();
+        samplesService.samplesByCategory().forEach((cat, samples) -> {
+            var samplesCards = new ArrayList<SampleCard>();
+            samples.forEach(sample -> {
+                var card = sampleCardInstance.get();
+                card.setSample(sample, () -> router.loadDashboard(sample.getSourceUrl()));
+                samplesCards.add(card);
+            });
+            var row = samplesCardRowInstance.get();
+            row.setCategoryAndSamples(cat, samplesCards);
+            rows.add(row);
+        });
+        view.addRows(rows);
+    }
+
+    @OnClose
+    public void clear() {
+        sampleCardInstance.destroyAll();
+        samplesCardRowInstance.destroyAll();
+        view.clear();
+    }
+}
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/view/EmptyScreenView.html b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/view/EmptyScreenView.html
index 2e93e6a883..507ebd50b4 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/view/EmptyScreenView.html
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/view/EmptyScreenView.html
@@ -19,5 +19,9 @@
   </div>
   <h1 data-i18n-key="title"></h1>
   <p data-i18n-key="subTitle" id="subTitleParagraph"></p>
+  <p data-i18n-key="learnMore"></p>
   <div class="blank-slate-pf-main-action" id="uploadContainer"></div>
+  <div class="blank-slate-pf-main-action" id="trySamplesContainer" style="display: none">
+    <button class="btn btn-primary btn-lg" data-field="trySamples" data-i18n-key="TrySamples"></button>
+  </div>
 </div>
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/view/EmptyScreenView.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/view/EmptyScreenView.java
index b963cecd11..7e82e604ea 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/view/EmptyScreenView.java
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/view/EmptyScreenView.java
@@ -19,6 +19,7 @@ import javax.enterprise.context.Dependent;
 import javax.inject.Inject;
 
 import com.google.gwt.dom.client.Style.Display;
+import elemental2.dom.HTMLButtonElement;
 import elemental2.dom.HTMLDivElement;
 import elemental2.dom.HTMLElement;
 import elemental2.dom.HTMLParagraphElement;
@@ -41,11 +42,19 @@ public class EmptyScreenView implements EmptyScreen.View {
     @Inject
     @DataField
     HTMLDivElement uploadContainer;
-    
+
+    @Inject
+    @DataField
+    HTMLDivElement trySamplesContainer;
+
     @Inject
     @DataField
     HTMLParagraphElement subTitleParagraph;
 
+    @Inject
+    @DataField
+    HTMLButtonElement trySamples;
+
     @Inject
     UploadWidget uploadWidget;
 
@@ -75,4 +84,15 @@ public class EmptyScreenView implements EmptyScreen.View {
         subTitleParagraph.innerHTML = AppConstants.INSTANCE.emptyWithImportId(modelId);
     }
 
-}
\ No newline at end of file
+    @Override
+    public void enableSamplesButton(Runnable action) {
+        uploadContainer.style.display = Display.NONE.getCssName();
+        subTitleParagraph.textContent = subTitleParagraph.textContent + " " + AppConstants.INSTANCE
+                .emptyScreenTrySamples();
+        trySamplesContainer.style.display = Display.INLINE_BLOCK.getCssName();
+        trySamples.onclick = e -> {
+            action.run();
+            return true;
+        };
+    }
+}
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/view/SamplesScreenView.css b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/view/SamplesScreenView.css
new file mode 100644
index 0000000000..2f37eb620d
--- /dev/null
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/view/SamplesScreenView.css
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+.samplesScreenRoot {
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  background: rgba(200, 200, 200, 0.2);
+  overflow: hidden;
+}
+
+.rowsContainer {
+  transition: 0.2s ease-in-out;
+  margin-left: 200px;
+  padding-top: 60px;
+  overflow-y: auto;
+  height: 100%;
+}
+
+.samplesCategoriesNav {
+  transition: 0.2s ease-in-out;
+  width: 200px;
+}
+
+.catNavCollapse {
+  width: 0px !important;
+}
+
+.catNavCollapsed {
+  margin-left: 0px;
+}
+
+.samplesVerticalNavBar {
+  left: 0;
+  position: fixed;
+  right: 0;
+  top: 0;
+  z-index: 1030;
+}
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/view/SamplesScreenView.html b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/view/SamplesScreenView.html
new file mode 100644
index 0000000000..90816a2c31
--- /dev/null
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/view/SamplesScreenView.html
@@ -0,0 +1,35 @@
+<!--
+  Copyright 2023 Red Hat, Inc. and/or its affiliates.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<div class="samplesScreenRoot">
+  <div class="samplesNavBarContainer">
+    <nav class="navbar navbar-pf-vertical samplesVerticalNavBar">
+      <button type="button" class="navbar-toggle" id="toggleCategoriesNavigation">
+        <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span>
+        <span class="icon-bar"></span>
+      </button>
+      <div class="navbar-header">
+        <a href="/" class="navbar-brand"> <img class="navbar-brand-icon" src="images/samples_brand.png" alt="" /> </a>
+      </div>
+    </nav>
+  </div>
+  <!-- Samples NavBar -->
+  <div class="nav-pf-vertical samplesCategoriesNav hidden-icons-pf">
+    <ul class="list-group" id="samplesCategoriesGroup"></ul>
+  </div>
+
+  <!-- Samples Row Container -->
+  <div class="container-fluid rowsContainer"></div>
+</div>
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/view/SamplesScreenView.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/view/SamplesScreenView.java
new file mode 100644
index 0000000000..36737cded6
--- /dev/null
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/view/SamplesScreenView.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dashbuilder.client.screens.view;
+
+import java.util.List;
+
+import javax.enterprise.context.Dependent;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.event.dom.client.ClickEvent;
+import elemental2.dom.DomGlobal;
+import elemental2.dom.HTMLAnchorElement;
+import elemental2.dom.HTMLButtonElement;
+import elemental2.dom.HTMLDivElement;
+import elemental2.dom.HTMLElement;
+import org.dashbuilder.client.screens.SamplesScreen;
+import org.dashbuilder.client.widgets.SamplesCardRow;
+import org.jboss.errai.ui.shared.api.annotations.DataField;
+import org.jboss.errai.ui.shared.api.annotations.EventHandler;
+import org.jboss.errai.ui.shared.api.annotations.Templated;
+
+@Templated
+@Dependent
+public class SamplesScreenView implements SamplesScreen.View {
+
+    private static final String ACTIVE_CLASS = "active";
+
+    private static final double MARGIN_SCROLL_COMPENSATION = 100;
+
+    @Inject
+    @DataField
+    HTMLDivElement samplesScreenRoot;
+
+    @Inject
+    @DataField
+    HTMLDivElement rowsContainer;
+
+    @Inject
+    @DataField
+    HTMLDivElement samplesCategoriesNav;
+
+    @Inject
+    @DataField
+    @Named("ul")
+    HTMLElement samplesCategoriesGroup;
+
+    @Inject
+    @DataField
+    HTMLButtonElement toggleCategoriesNavigation;
+
+    @Override
+    public HTMLElement getElement() {
+        return samplesScreenRoot;
+    }
+
+    @Override
+    public void init(SamplesScreen presenter) {
+        registerScrollListener();
+    }
+
+    @Override
+    public void addRows(List<SamplesCardRow> rows) {
+        rows.forEach(r -> {
+            appendCategory(r.getCategory());
+            rowsContainer.appendChild(r.getElement());
+        });
+    }
+
+    @Override
+    public void clear() {
+        rowsContainer.innerHTML = "";
+        samplesCategoriesGroup.innerHTML = "";
+    }
+
+    private void appendCategory(String category) {
+        var li = DomGlobal.document.createElement("li");
+        var a = (HTMLAnchorElement) DomGlobal.document.createElement("a");
+        li.classList.add("list-group-item");
+        a.classList.add("list-group-item-value");
+        a.textContent = category;
+        a.title = category;
+        a.href = "#" + category;
+        a.onclick = e -> {
+            Scheduler.get().scheduleDeferred(() -> {
+                clearActiveNavItems();
+                a.parentElement.classList.add(ACTIVE_CLASS);
+            });
+            return e;
+        };
+        li.appendChild(a);
+        samplesCategoriesGroup.appendChild(li);
+    }
+
+    @EventHandler("toggleCategoriesNavigation")
+    void toggleCategoriesNavigation(ClickEvent e) {
+        samplesCategoriesNav.classList.toggle("catNavCollapse");
+        rowsContainer.classList.toggle("catNavCollapsed");
+    }
+
+    private void registerScrollListener() {
+        rowsContainer.addEventListener("scroll", e -> {
+            var yPos = rowsContainer.scrollTop;
+            var navLinks = samplesCategoriesGroup.querySelectorAll("li a");
+            navLinks.forEach((item, i, listObj) -> {
+                var a = (HTMLAnchorElement) item;
+                var catId = a.title;
+                var section = (HTMLElement)  DomGlobal.document.getElementById(catId);
+                var bounds = section.parentElement.getBoundingClientRect();
+                var minY = section.offsetTop - MARGIN_SCROLL_COMPENSATION;
+                var maxY = minY + bounds.height;
+
+                if (yPos >= minY && yPos < maxY) {
+                    item.parentElement.classList.add(ACTIVE_CLASS);
+                } else {
+                    a.parentElement.classList.remove(ACTIVE_CLASS);
+                }
+                return item;
+            });
+        });
+
+    }
+
+    private void clearActiveNavItems() {
+        var navLinks = samplesCategoriesGroup.querySelectorAll("li");
+        navLinks.forEach((item, i, listObj) -> {
+            item.classList.remove(ACTIVE_CLASS);
+            return item;
+        });
+    }
+
+}
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/services/SamplesService.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/services/SamplesService.java
new file mode 100644
index 0000000000..0a2b5618ee
--- /dev/null
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/services/SamplesService.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dashbuilder.client.services;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import javax.annotation.PostConstruct;
+import javax.enterprise.context.ApplicationScoped;
+
+import elemental2.dom.DomGlobal;
+import elemental2.dom.XMLHttpRequest;
+import org.dashbuilder.client.setup.RuntimeClientSetup;
+import org.dashbuilder.json.Json;
+import org.jboss.errai.ioc.client.api.EntryPoint;
+
+@EntryPoint
+@ApplicationScoped
+public class SamplesService {
+
+    Map<String, List<SampleInfo>> samplesByCategory;
+
+    final String SAMPLES_FILE = "samples.json";
+    final String SAMPLE_ID_KEY = "id";
+    final String SAMPLE_NAME_KEY = "name";
+
+    final String SAMPLE_ID_PARAM = "sampleId";
+
+    String samplesEditUrl;
+
+    @PostConstruct
+    void init() {
+        var setup = RuntimeClientSetup.Builder.get();
+        var userSamplesUrl = setup == null ? null : RuntimeClientSetup.Builder.get().getSamplesUrl();
+        samplesByCategory = new HashMap<>();
+
+        if (userSamplesUrl != null) {
+            var xhr = new XMLHttpRequest();
+            samplesEditUrl = setup.getSamplesEditService();
+            xhr.open("GET", SAMPLES_FILE, false);
+            xhr.send();
+            if (xhr.status >= 200 && xhr.status < 300) {
+                this.extractSamplesFromResponse(userSamplesUrl, xhr.responseText);
+            } else {
+                DomGlobal.console.warn("Not able to load samples, server responded with " + xhr.status);
+            }
+        }
+
+    }
+
+    public Map<String, List<SampleInfo>> samplesByCategory() {
+        return samplesByCategory;
+    }
+
+    public Collection<SampleInfo> allSamples() {
+        return samplesByCategory.values()
+                .stream()
+                .flatMap(s -> s.stream())
+                .collect(Collectors.toList());
+    }
+
+    public boolean isSample(String importID) {
+        return samplesByCategory.values()
+                .stream()
+                .flatMap(Collection::stream)
+                .anyMatch(sample -> sample.sourceUrl.equals(importID));
+
+    }
+
+    void extractSamplesFromResponse(String userSamplesUrl, String txt) {
+        var samplesUrl = userSamplesUrl.endsWith("/") ? userSamplesUrl : userSamplesUrl + "/";
+        var samplesJson = Json.parse(txt);
+        for (var cat : samplesJson.keys()) {
+            var samplesArray = samplesJson.getArray(cat);
+            var samples = new ArrayList<SampleInfo>();
+            for (var i = 0; i < samplesArray.length(); i++) {
+                var sampleJson = samplesArray.getObject(i);
+                var id = sampleJson.getString(SAMPLE_ID_KEY);
+                var name = sampleJson.getString(SAMPLE_NAME_KEY);
+                var sampleBaseUrl = samplesUrl + id + "/";
+                var samplesSourceUrl = sampleBaseUrl + id + ".dash.yaml";
+                var editUrl = buildSampleUrl(id);
+                samples.add(new SampleInfo(id,
+                        name == null ? id : name,
+                        sampleBaseUrl + id + ".svg",
+                        samplesSourceUrl,
+                        editUrl));
+            }
+            if (samples.size() > 0) {
+                samplesByCategory.put(cat, samples);
+            }
+        }
+    }
+
+    String buildSampleUrl(String id) {
+        if (samplesEditUrl != null) {
+            var sampleUrl = samplesEditUrl;
+            var sampleIdParam = SAMPLE_ID_PARAM + "=" + id;
+            if (sampleUrl.indexOf('?') == -1) {
+                sampleUrl += "?";
+            } else {
+                sampleUrl += "&";
+            }
+            sampleUrl += sampleIdParam;
+            return sampleUrl;
+        }
+        return null;
+    }
+
+    public static class SampleInfo {
+
+        /**
+         * The sample ID which will be used as base for the SVG, source URLs and edit service (if available)
+         */
+        private String id;
+        /**
+         * A human friendly name for the sample
+         */
+        private String name;
+
+        private String svgUrl;
+        private String sourceUrl;
+        private Optional<String> editUrl;
+
+        public SampleInfo(String id,
+                          String name,
+                          String svgUrl,
+                          String sourceUrl,
+                          String editUrl) {
+            this.id = id;
+            this.name = name;
+            this.svgUrl = svgUrl;
+            this.sourceUrl = sourceUrl;
+            this.editUrl = Optional.ofNullable(editUrl);
+        }
+
+        public String getId() {
+            return id;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public String getSvgUrl() {
+            return svgUrl;
+        }
+
+        public String getSourceUrl() {
+            return sourceUrl;
+        }
+
+        public Optional<String> getEditUrl() {
+            return editUrl;
+        }
+
+    }
+}
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/setup/RuntimeClientSetup.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/setup/RuntimeClientSetup.java
index fd1090c414..d5a36eab65 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/setup/RuntimeClientSetup.java
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/setup/RuntimeClientSetup.java
@@ -34,13 +34,19 @@ public interface RuntimeClientSetup {
 
     @JsProperty
     String getPath();
-    
+
     @JsProperty
     boolean getHideNavBar();
 
     @JsProperty
     String[] getDashboards();
 
+    @JsProperty
+    String getSamplesUrl();
+
+    @JsProperty
+    String getSamplesEditService();
+
     class Builder {
 
         @JsProperty(name = "dashbuilder", namespace = JsPackage.GLOBAL)
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/SampleCard.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/SampleCard.java
new file mode 100644
index 0000000000..fd916c8434
--- /dev/null
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/SampleCard.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.dashbuilder.client.widgets;
+
+import java.util.function.Supplier;
+
+import javax.annotation.PostConstruct;
+import javax.enterprise.context.Dependent;
+import javax.inject.Inject;
+
+import elemental2.dom.DomGlobal;
+import elemental2.dom.HTMLElement;
+import elemental2.dom.XMLHttpRequest;
+import org.dashbuilder.client.resources.i18n.AppConstants;
+import org.dashbuilder.client.screens.RouterScreen;
+import org.dashbuilder.client.services.SamplesService.SampleInfo;
+import org.jboss.errai.ui.client.local.api.elemental2.IsElement;
+import org.uberfire.client.mvp.PlaceManager;
+import org.uberfire.client.mvp.UberElemental;
+
+/**
+ * Shows a sample in cards
+ *
+ */
+@Dependent
+public class SampleCard implements IsElement {
+
+    static final AppConstants i18n = AppConstants.INSTANCE;
+
+    @Inject
+    View view;
+
+    @Inject
+    RouterScreen routerScreen;
+
+    @Inject
+    PlaceManager placeManager;
+
+    public interface View extends UberElemental<SampleCard> {
+
+        void setSampleData(String sampleName, String sampleUrl, Runnable sampleClickCallback);
+
+        void setSampleSvg(String sampleSvg);
+
+        void enableEdit(Supplier<String> getSamplePath);
+
+    }
+
+    @PostConstruct
+    public void init() {
+        this.view.init(this);
+    }
+
+    @Override
+    public HTMLElement getElement() {
+        return this.view.getElement();
+    }
+
+    public void setSample(SampleInfo sample, Runnable sampleClickCallback) {
+        view.setSampleData(sample.getName(), sample.getSourceUrl(), sampleClickCallback);
+        DomGlobal.fetch(sample.getSvgUrl()).then(r -> {
+            if (r.status == 404) {
+                return null;
+            }
+            return r.text();
+        }).then(txt -> {
+            if (txt != null && !txt.trim().isEmpty()) {
+                view.setSampleSvg(txt);
+            }
+            return null;
+        });
+
+        sample.getEditUrl().ifPresent(editUrl -> {
+            view.enableEdit(() -> {
+                var xhr = new XMLHttpRequest();
+                xhr.open("GET", sample.getEditUrl().get(), false);
+                xhr.send();
+                if (xhr.status >= 200 && xhr.status < 300) {
+                    return xhr.responseText;
+                }
+                DomGlobal.console.warn("Error calling sample edit service, server responded with " + xhr.status);
+                return null;
+            });
+        });
+    }
+
+}
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/SamplesCardRow.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/SamplesCardRow.java
new file mode 100644
index 0000000000..3c6ff6341c
--- /dev/null
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/SamplesCardRow.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.dashbuilder.client.widgets;
+
+import java.util.List;
+
+import javax.annotation.PostConstruct;
+import javax.enterprise.context.Dependent;
+import javax.inject.Inject;
+
+import elemental2.dom.HTMLElement;
+import org.dashbuilder.client.resources.i18n.AppConstants;
+import org.jboss.errai.ui.client.local.api.elemental2.IsElement;
+import org.uberfire.client.mvp.UberElemental;
+
+@Dependent
+public class SamplesCardRow implements IsElement {
+
+    static final AppConstants i18n = AppConstants.INSTANCE;
+
+    @Inject
+    View view;
+
+    private String category;
+
+    public interface View extends UberElemental<SamplesCardRow> {
+
+        void setTitleAndSamples(String title,
+                                List<SampleCard> sampleCards);
+
+    }
+
+    @PostConstruct
+    public void init() {
+        this.view.init(this);
+    }
+
+    @Override
+    public HTMLElement getElement() {
+        return this.view.getElement();
+    }
+
+    public void setCategoryAndSamples(String category,
+                                      List<SampleCard> cards) {
+        this.category = category;
+        view.setTitleAndSamples(category, cards);
+    }
+
+    public String getCategory() {
+        return category;
+    }
+
+}
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/view/SampleCardView.css b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/view/SampleCardView.css
new file mode 100644
index 0000000000..8b5296e64a
--- /dev/null
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/view/SampleCardView.css
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+.sampleCardContainer {
+  padding: 10px;
+  margin-bottom: 20px;
+}
+
+.sampleImportLink {
+  margin-top: 10px;
+  border-radius: 1px;
+  box-shadow: 0 0 20px rgb(10 10 10/ 5%);
+  overflow: hidden;
+  height: 150px;
+  display: block;
+}
+
+.sampleImportLink:hover {
+  cursor: pointer;
+}
+.sampleImportLink span {
+  width: 100%;
+  height: 100%;
+  font-size: 100px;
+  padding: 20px;
+}
+
+.sampleImportLink svg {
+  width: 100%;
+  height: 100%;
+  transition: 0.5s ease-in-out;
+}
+
+.sampleImportLink svg:hover {
+  transform: scale(1.2);
+}
+
+.sampleUrlLinkDiv {
+  float: right;
+  margin-top: 10px;
+  font-size: 13px;
+}
+
+.sampleNameDiv {
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  padding: 10px 10px 0px 5px;
+  margin: 0;
+  overflow: hidden;
+  display: block;
+  font-size: 15px;
+  text-align: left;
+}
+
+.sampleCard {
+  width: 100%;
+  max-width: 350px;
+  position: relative;
+  border-radius: 10px;
+  background: white;
+  padding: 5px;
+}
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/view/SampleCardView.html b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/view/SampleCardView.html
new file mode 100644
index 0000000000..1ab99b9fab
--- /dev/null
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/view/SampleCardView.html
@@ -0,0 +1,30 @@
+<!--
+  Copyright 2023 Red Hat, Inc. and/or its affiliates.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<div class="col-xl-2 col-lg-2 col-md-4 col-sm-6 sampleCardContainer" align="center">
+  <div class="sampleCard">
+    <!-- TODO: Import the sample when this is clicked -->
+    <a id="sampleImportLink" class="sampleImportLink"> <span class="fa fa-cubes"></span> </a>
+    <div>
+      <div class="sampleUrlLinkDiv">
+        <a id="sampleEditLink" style="visibility: hidden; margin-right: 5px"> <span class="fa fa-pencil"></span></a>
+        <a id="sampleUrlLink" target="_blank"> <span class="fa fa-download"></span></a>
+      </div>
+      <div>
+        <div class="sampleNameDiv"></div>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/view/SampleCardView.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/view/SampleCardView.java
new file mode 100644
index 0000000000..145ba75c74
--- /dev/null
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/view/SampleCardView.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.dashbuilder.client.widgets.view;
+
+import java.util.function.Supplier;
+
+import javax.enterprise.context.Dependent;
+import javax.inject.Inject;
+
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.user.client.Window;
+import elemental2.dom.DomGlobal;
+import elemental2.dom.HTMLAnchorElement;
+import elemental2.dom.HTMLDivElement;
+import elemental2.dom.HTMLElement;
+import org.dashbuilder.client.widgets.SampleCard;
+import org.jboss.errai.ui.shared.api.annotations.DataField;
+import org.jboss.errai.ui.shared.api.annotations.EventHandler;
+import org.jboss.errai.ui.shared.api.annotations.Templated;
+
+@Dependent
+@Templated
+public class SampleCardView implements SampleCard.View {
+
+    @Inject
+    @DataField
+    HTMLDivElement sampleCardContainer;
+
+    @Inject
+    @DataField
+    HTMLDivElement sampleNameDiv;
+
+    @Inject
+    @DataField
+    HTMLAnchorElement sampleImportLink;
+
+    @Inject
+    @DataField
+    HTMLAnchorElement sampleUrlLink;
+
+    @Inject
+    @DataField
+    HTMLAnchorElement sampleEditLink;
+
+    private Runnable sampleClickCallback;
+
+    @Override
+    public HTMLElement getElement() {
+        return sampleCardContainer;
+    }
+
+    @Override
+    public void init(SampleCard presenter) {
+        // empty
+    }
+
+    @Override
+    public void setSampleData(String sampleName,
+                              String sampleUrl,
+                              Runnable sampleClickCallback) {
+        sampleNameDiv.textContent = sampleName;
+        sampleUrlLink.href = sampleUrl;
+        this.sampleClickCallback = sampleClickCallback;
+    }
+
+    @Override
+    public void setSampleSvg(String svgContent) {
+        sampleImportLink.innerHTML = svgContent;
+    }
+
+    @EventHandler("sampleImportLink")
+    void onSampleImportLinkClicked(ClickEvent e) {
+        sampleClickCallback.run();
+    }
+
+    @Override
+    public void enableEdit(Supplier<String> getSamplePath) {
+        sampleEditLink.style.visibility = "visible";
+        sampleEditLink.onclick = e -> {
+            var proceed = Window.confirm("This will create a new file in your project, would you like to proceed to VSCode?");
+            if (proceed) {
+                DomGlobal.window.open("vscode://file/" + getSamplePath.get());
+            }
+            return true;
+        };
+    }
+
+}
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/view/SamplesCardRowView.css b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/view/SamplesCardRowView.css
new file mode 100644
index 0000000000..112b5f88f6
--- /dev/null
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/view/SamplesCardRowView.css
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+.samplesCardRowContainer {
+  margin-left: 30px;
+  margin-right: 30px;
+}
+
+.samplesCardRowContainer h3 {
+  scroll-margin-top: 70px;
+  margin-bottom: 20px;
+  padding-bottom: 10px;
+  border-bottom: 1px solid #e1e5f2;
+  font-weight: normal;
+  color: #464646;
+  font-size: 20px;
+}
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/view/EmptyScreenView.html b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/view/SamplesCardRowView.html
similarity index 60%
copy from packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/view/EmptyScreenView.html
copy to packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/view/SamplesCardRowView.html
index 2e93e6a883..a514e8a296 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/screens/view/EmptyScreenView.html
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/view/SamplesCardRowView.html
@@ -1,5 +1,5 @@
 <!--
-  Copyright 2020 Red Hat, Inc. and/or its affiliates.
+  Copyright 2023 Red Hat, Inc. and/or its affiliates.
 
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -13,11 +13,8 @@
   See the License for the specific language governing permissions and
   limitations under the License.
 -->
-<div class="blank-slate-pf" id="emptyImport">
-  <div class="blank-slate-pf-icon">
-    <span class="pficon pficon pficon-add-circle-o"></span>
-  </div>
-  <h1 data-i18n-key="title"></h1>
-  <p data-i18n-key="subTitle" id="subTitleParagraph"></p>
-  <div class="blank-slate-pf-main-action" id="uploadContainer"></div>
+
+<div class="samplesCardRowContainer">
+  <h3 id="rowTitle"></h3>
+  <div id="samplesRowLine" class="row"></div>
 </div>
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/view/SamplesCardRowView.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/view/SamplesCardRowView.java
new file mode 100644
index 0000000000..06be6517c0
--- /dev/null
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/widgets/view/SamplesCardRowView.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.dashbuilder.client.widgets.view;
+
+import java.util.List;
+
+import javax.enterprise.context.Dependent;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import elemental2.dom.HTMLDivElement;
+import elemental2.dom.HTMLElement;
+import elemental2.dom.HTMLHeadingElement;
+import org.dashbuilder.client.widgets.SampleCard;
+import org.dashbuilder.client.widgets.SamplesCardRow;
+import org.jboss.errai.ui.shared.api.annotations.DataField;
+import org.jboss.errai.ui.shared.api.annotations.Templated;
+
+@Dependent
+@Templated
+public class SamplesCardRowView implements SamplesCardRow.View {
+
+    @Inject
+    @DataField
+    HTMLDivElement samplesCardRowContainer;
+
+    @Inject
+    @DataField
+    @Named("h3")
+    HTMLHeadingElement rowTitle;
+
+    @Inject
+    @DataField
+    HTMLDivElement samplesRowLine;
+
+    @Override
+    public HTMLElement getElement() {
+        return samplesCardRowContainer;
+    }
+
+    @Override
+    public void init(SamplesCardRow presenter) {
+        // empty
+    }
+
+    @Override
+    public void setTitleAndSamples(String title,
+                                   List<SampleCard> sampleCards) {
+        samplesCardRowContainer.id = title + "-container";
+        rowTitle.textContent = title;
+        rowTitle.id = title;
+        sampleCards.forEach(card -> samplesRowLine.appendChild(card.getElement()));
+    }
+
+}
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/resources/org/dashbuilder/client/resources/i18n/AppConstants.properties b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/resources/org/dashbuilder/client/resources/i18n/AppConstants.properties
index 4caec7df30..5b62de73a3 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/resources/org/dashbuilder/client/resources/i18n/AppConstants.properties
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/resources/org/dashbuilder/client/resources/i18n/AppConstants.properties
@@ -15,6 +15,8 @@
 #
 EmptyScreenView.title=No content to show
 EmptyScreenView.subTitle=Dashboards were not imported. You can import by uploading a supported YAML/JSON file.
+EmptyScreenView.learnMore=Learn more about this in <a href="https://www.dashbuilder.org/docs/#chap-dashbuilder-yaml-guides">Dashbuilder Documentation</a>
+EmptyScreenView.TrySamples=Try Samples
 UploadWidgetView.importButton=Import Dashboards
 RuntimeScreenView.title=Welcome to Dashbuilder Runtimes
 RuntimeScreenView.subTitle=Select a Dashboard from menu to get started.
@@ -52,6 +54,8 @@ notAuthorized=You are not authorized to access this resource.
 # Client Mode
 clientMode=Running in client mode
 emptyEditorMode=No content to display. Start editing to see the result here.
-emptyClientMode=Dashboards were not imported. You can import by uploading a supported YAML/JSON file.
-emptyWithImportId=Not able to load <strong>{0}</strong>. You can import dashboards by uploading a supported YAML/JSON file.
-errorContentTitle=Error loading content
\ No newline at end of file
+emptyClientMode=Dashboards were not imported. You can import a dashboard by creating a supported YAML/JSON file
+emptyScreenTrySamples=or you can try samples below.
+emptyWithImportId=Not able to load <strong>{0}</strong>. You can import a dashboard by creating a supported YAML/JSON file
+errorContentTitle=Error loading content
+samplesScreenTitle=Samples
\ No newline at end of file
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/webapp/images/samples_brand.png b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/webapp/images/samples_brand.png
new file mode 100644
index 0000000000..eaa84650ad
Binary files /dev/null and b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/webapp/images/samples_brand.png differ
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/webapp/setup.js b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/webapp/setup.js
index 5e402b595e..d3add774ef 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/webapp/setup.js
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/webapp/setup.js
@@ -1,15 +1,22 @@
 dashbuilder = {
   /*
-    // possible modes are EDITOR and CLIENT - if dashboards is set then CLIENT mode is assumed
-	mode: "CLIENT",
-	// The list of client dashboards - if CLIENT mode is used and no list is provided, than the dashboard "dashboard.yml" will be attempted to load. If no dashboard is found, then client opens for upload. 
-	// The dashboard can also be an URL
-	dashboards: [ "dashboard1.yaml", "dashboard2.json"],
-
-	// base path to look for dashboards. Default is /
-	path: "/path",
-	
-	// if true, then model from external urls will be allowed
-	allowExternal: true
-*/
+		  // possible modes are EDITOR and CLIENT - if dashboards is set then CLIENT mode is assumed
+		  mode: "CLIENT",
+		  // The list of client dashboards - if CLIENT mode is used and no list is provided, than the dashboard "dashboard.yml" will be attempted to load. If no dashboard is found, then client opens for upload. 
+		  // The dashboard can also be an URL
+		  dashboards: [ "dashboard1.yaml", "dashboard2.json"],
+	  
+		  // base path to look for dashboards. Default is /
+		  path: "/path",
+	  	
+		  // if true, then model from external urls will be allowed
+		  allowExternal: true,
+	  	
+		  // A base URL for the samples repository 
+		  // if set then dashbuilder tries to retrieve samples.json from root dir and load samples from the provided URL
+		  samplesUrl: "/samples",
+	  	
+		  // An URL to resolve sample path on disk. It will receive a GET request with a query parameter called "sampleId"
+		  samplesEditService: "edit"
+	  */
 };
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/test/java/org/dashbuilder/client/RuntimeClientLoaderTest.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/test/java/org/dashbuilder/client/RuntimeClientLoaderTest.java
index 74de3ee4cf..f1eb8e4238 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/test/java/org/dashbuilder/client/RuntimeClientLoaderTest.java
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/test/java/org/dashbuilder/client/RuntimeClientLoaderTest.java
@@ -31,6 +31,7 @@ import org.dashbuilder.client.navigation.NavigationManager;
 import org.dashbuilder.client.parser.RuntimeModelClientParserFactory;
 import org.dashbuilder.client.perspective.generator.RuntimePerspectiveGenerator;
 import org.dashbuilder.client.plugins.RuntimePerspectivePluginManager;
+import org.dashbuilder.client.services.SamplesService;
 import org.dashbuilder.client.setup.RuntimeClientMode;
 import org.dashbuilder.dataset.events.DataSetDefRemovedEvent;
 import org.dashbuilder.navigation.NavTree;
@@ -89,6 +90,9 @@ public class RuntimeClientLoaderTest {
 
     @Mock
     RuntimeModelContentListener runtimeModelContentListener;
+    
+    @Mock
+    SamplesService samplesService;
 
     @InjectMocks
     RuntimeClientLoader runtimeClientLoader;
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/test/java/org/dashbuilder/client/services/SamplesServiceTest.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/test/java/org/dashbuilder/client/services/SamplesServiceTest.java
new file mode 100644
index 0000000000..87cef9e521
--- /dev/null
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/test/java/org/dashbuilder/client/services/SamplesServiceTest.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dashbuilder.client.services;
+
+import java.util.HashMap;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class SamplesServiceTest {
+
+    private static final String SAMPLES_JSON = "{\n" +
+            "        \"Basic\": [\n" +
+            "                {\"id\": \"products-dashboard\"},\n" +
+            "                {\"id\": \"dashbuilder-kitchensink\"}\n" +
+            "        ],\n" +
+            "        \"Other\": [\n" +
+            "                {\"id\": \"other\"}\n" +
+            "        ],\n" +
+            "        \"Other2\": [\n" +
+            "                {\"id\": \"other2\", \"name\": \"Other 2\"}\n" +
+            "        ]\n" +
+            "}";
+
+    @Test
+    public void testJsonParse() {
+        var service = new SamplesService();
+        service.samplesByCategory = new HashMap<>();
+
+        service.extractSamplesFromResponse("http://test.org", SAMPLES_JSON);
+
+        var samplesByCategory = service.samplesByCategory();
+        var basicSamples = samplesByCategory.get("Basic");
+        var otherSamples = samplesByCategory.get("Other");
+        var other2Samples = samplesByCategory.get("Other2");
+
+        assertEquals(3, samplesByCategory.size());
+        assertEquals(2, basicSamples.size());
+        assertEquals(1, otherSamples.size());
+        assertEquals(1, other2Samples.size());
+
+        var other = otherSamples.get(0);
+        assertEquals("other", other.getId());
+        assertEquals("other", other.getName());
+
+        var other2 = other2Samples.get(0);
+        assertEquals("other2", other2.getId());
+        assertEquals("Other 2", other2.getName());
+
+    }
+
+    @Test
+    public void testIsSample() {
+        var service = new SamplesService();
+        service.samplesByCategory = new HashMap<>();
+
+        service.extractSamplesFromResponse("samples", SAMPLES_JSON);
+
+        assertTrue(service.isSample("samples/other2/other2.dash.yaml"));
+        assertTrue(service.isSample("samples/products-dashboard/products-dashboard.dash.yaml"));
+    }
+
+    @Test
+    public void testBuildSampleUrl() {
+        var service = new SamplesService();
+
+        service.samplesEditUrl = "edit";
+        assertEquals("edit?sampleId=abc", service.buildSampleUrl("abc"));
+
+        service.samplesEditUrl = "edit?otherParam=test";
+        assertEquals("edit?otherParam=test&sampleId=abc", service.buildSampleUrl("abc"));
+    }
+
+}
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/main/java/org/dashbuilder/shared/marshalling/GlobalSettingsJSONMarshaller.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/main/java/org/dashbuilder/shared/marshalling/GlobalSettingsJSONMarshaller.java
index 8cbe6f48f6..7f1b774cc9 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/main/java/org/dashbuilder/shared/marshalling/GlobalSettingsJSONMarshaller.java
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/main/java/org/dashbuilder/shared/marshalling/GlobalSettingsJSONMarshaller.java
@@ -27,6 +27,7 @@ import org.dashbuilder.shared.model.GlobalSettings;
 public class GlobalSettingsJSONMarshaller {
 
     private static final String MODE = "mode";
+    private static final String ALLOW_URL_PROPERTIES = "allowUrlProperties";
     private static final Mode DEFAULT_MODE = Mode.LIGHT;
 
     private static GlobalSettingsJSONMarshaller instance;
@@ -46,10 +47,12 @@ public class GlobalSettingsJSONMarshaller {
     public GlobalSettings fromJson(JsonObject json) {
         var globalSettings = new GlobalSettings();
         var mode = DEFAULT_MODE;
+        var allowUrlProperties = false;
         var displayerSettings = new DisplayerSettings();
 
         if (json != null) {
             mode = retrieveMode(json);
+            allowUrlProperties = retrieveAllowUrlProperties(json);
             var displayerSettingsObj = json.getObject(LayoutTemplateJSONMarshaller.SETTINGS);
             try {
                 displayerSettings = DisplayerSettingsJSONMarshaller.get().fromJsonObject(displayerSettingsObj, false);
@@ -59,12 +62,21 @@ public class GlobalSettingsJSONMarshaller {
         }
 
         displayerSettings.setMode(mode);
-        globalSettings.setSettings(displayerSettings);
         globalSettings.setMode(mode);
+        globalSettings.setSettings(displayerSettings);
+        globalSettings.setAllowUrlProperties(allowUrlProperties);
         return globalSettings;
 
     }
 
+    private boolean retrieveAllowUrlProperties(JsonObject json) {
+        if (json.has(ALLOW_URL_PROPERTIES)) {
+            var allowUrlProperties = json.getString(ALLOW_URL_PROPERTIES);
+            return Boolean.TRUE.toString().equalsIgnoreCase(allowUrlProperties);
+        }
+        return false;
+    }
+
     private Mode retrieveMode(JsonObject json) {
         if (json.has(MODE)) {
             var modeStr = json.getString(MODE);
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/main/java/org/dashbuilder/shared/marshalling/RuntimeModelJSONMarshaller.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/main/java/org/dashbuilder/shared/marshalling/RuntimeModelJSONMarshaller.java
index 44b1e73671..b383c07609 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/main/java/org/dashbuilder/shared/marshalling/RuntimeModelJSONMarshaller.java
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/main/java/org/dashbuilder/shared/marshalling/RuntimeModelJSONMarshaller.java
@@ -123,6 +123,10 @@ public class RuntimeModelJSONMarshaller {
         return extractProperties(toJsonObject(json));
     }
 
+    public GlobalSettings retrieveGlobalSettings(String json) {
+        return retrieveGlobalSettings(toJsonObject(json));
+    }
+
     GlobalSettings retrieveGlobalSettings(JsonObject json) {
         var settingsJson = json.get(GLOBAL);
         if (settingsJson != null &&
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/main/java/org/dashbuilder/shared/model/GlobalSettings.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/main/java/org/dashbuilder/shared/model/GlobalSettings.java
index 195ea783e0..d86d417261 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/main/java/org/dashbuilder/shared/model/GlobalSettings.java
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/main/java/org/dashbuilder/shared/model/GlobalSettings.java
@@ -24,6 +24,7 @@ public class GlobalSettings {
 
     private Mode mode = Mode.LIGHT;
     private DisplayerSettings settings;
+    private boolean allowUrlProperties;
 
     public Mode getMode() {
         return mode;
@@ -41,4 +42,12 @@ public class GlobalSettings {
         this.settings = settings;
     }
 
+    public boolean isAllowUrlProperties() {
+        return allowUrlProperties;
+    }
+
+    public void setAllowUrlProperties(boolean allowUrlProperties) {
+        this.allowUrlProperties = allowUrlProperties;
+    }
+
 }
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/test/java/org/dashbuilder/shared/marshalling/GlobalSettingsJSONMarshallerTest.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/test/java/org/dashbuilder/shared/marshalling/GlobalSettingsJSONMarshallerTest.java
index 4ecb5196a6..31d3f7cc4e 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/test/java/org/dashbuilder/shared/marshalling/GlobalSettingsJSONMarshallerTest.java
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/test/java/org/dashbuilder/shared/marshalling/GlobalSettingsJSONMarshallerTest.java
@@ -20,7 +20,9 @@ import org.junit.Before;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 
 public class GlobalSettingsJSONMarshallerTest {
@@ -29,7 +31,8 @@ public class GlobalSettingsJSONMarshallerTest {
     GlobalSettingsJSONMarshaller marshaller;
     
     private static final String FULL_JSON = "{\n" + 
-            "        \"mode\": \"dark\",\n" + 
+            "        \"mode\": \"dark\",\n" +
+            "        \"allowUrlProperties\": \"true\",\n" + 
             "        \"settings\": {\n" + 
             "          \"general\": {\n" + 
             "            \"title\": \"Test Title\"\n" + 
@@ -46,6 +49,7 @@ public class GlobalSettingsJSONMarshallerTest {
     public void testMarshalling() {
         var settings = marshaller.fromJson(FULL_JSON);
         assertEquals(Mode.DARK, settings.getMode());
+        assertTrue(settings.isAllowUrlProperties());
         assertEquals("Test Title", settings.getSettings().getTitle());
     }
     
@@ -54,6 +58,7 @@ public class GlobalSettingsJSONMarshallerTest {
         var settings = marshaller.fromJson("{}");
         assertNotNull(settings.getSettings());
         assertNotNull(settings.getMode());
+        assertFalse(settings.isAllowUrlProperties());
     }
     
 }
diff --git a/packages/dmn-dev-deployment-form-webapp/package.json b/packages/dmn-dev-deployment-form-webapp/package.json
index 54bebd74df..0c7c3a7d7a 100644
--- a/packages/dmn-dev-deployment-form-webapp/package.json
+++ b/packages/dmn-dev-deployment-form-webapp/package.json
@@ -26,8 +26,8 @@
     "@kie-tools-core/patternfly-base": "workspace:*",
     "@kie-tools/form-dmn": "workspace:*",
     "@kie-tools/i18n-common-dictionary": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
     "react": "^17.0.2",
     "react-dom": "^17.0.2",
     "react-router": "^5.2.1",
diff --git a/packages/editor/package.json b/packages/editor/package.json
index 2f9c4124b6..7f1e3f27bb 100644
--- a/packages/editor/package.json
+++ b/packages/editor/package.json
@@ -36,8 +36,8 @@
     "@kie-tools-core/operating-system": "workspace:*",
     "@kie-tools-core/patternfly-base": "workspace:*",
     "@kie-tools-core/workspace": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
     "csstype": "^3.0.11",
     "minimatch": "^3.0.4",
     "react": "^17.0.2",
diff --git a/packages/editor/tests/envelope/KeyBindingHelpOverlay/__snapshots__/KeyBindingsHelpOverlay.test.tsx.snap b/packages/editor/tests/envelope/KeyBindingHelpOverlay/__snapshots__/KeyBindingsHelpOverlay.test.tsx.snap
index 3e1974729a..2d5a428031 100644
--- a/packages/editor/tests/envelope/KeyBindingHelpOverlay/__snapshots__/KeyBindingsHelpOverlay.test.tsx.snap
+++ b/packages/editor/tests/envelope/KeyBindingHelpOverlay/__snapshots__/KeyBindingsHelpOverlay.test.tsx.snap
@@ -50,7 +50,7 @@ exports[`KeyBindingsHelpOverlay minimal setup 1`] = `
             aria-disabled="false"
             aria-label="Close"
             class="pf-c-button pf-m-plain"
-            data-ouia-component-id="OUIA-Generated-Button-plain-1"
+            data-ouia-component-id="OUIA-Generated-Modal-default-1-ModalBoxCloseButton"
             data-ouia-component-type="PF4/Button"
             data-ouia-safe="true"
             type="button"
@@ -94,7 +94,6 @@ exports[`KeyBindingsHelpOverlay minimal setup 1`] = `
             >
               <dl
                 class=""
-                data-pf-content="true"
               >
                 <h2
                   class=""
@@ -107,13 +106,11 @@ exports[`KeyBindingsHelpOverlay minimal setup 1`] = `
                 </h2>
                 <dt
                   class=""
-                  data-pf-content="true"
                 >
                   Ctrl + C
                 </dt>
                 <dd
                   class=""
-                  data-pf-content="true"
                 />
                 <h2
                   class=""
@@ -126,13 +123,11 @@ exports[`KeyBindingsHelpOverlay minimal setup 1`] = `
                 </h2>
                 <dt
                   class=""
-                  data-pf-content="true"
                 >
                   Shift + /
                 </dt>
                 <dd
                   class=""
-                  data-pf-content="true"
                 >
                   Show keyboard shortcuts
                 </dd>
diff --git a/packages/editor/tests/envelope/LoadingScreen/__snapshots__/LoadingScreen.test.tsx.snap b/packages/editor/tests/envelope/LoadingScreen/__snapshots__/LoadingScreen.test.tsx.snap
index d3e2e96410..1ae78b34ae 100644
--- a/packages/editor/tests/envelope/LoadingScreen/__snapshots__/LoadingScreen.test.tsx.snap
+++ b/packages/editor/tests/envelope/LoadingScreen/__snapshots__/LoadingScreen.test.tsx.snap
@@ -18,6 +18,7 @@ exports[`LoadingScreen when just made not visible 1`] = `
         >
           <div>
             <span
+              aria-label="Contents"
               aria-valuetext="Loading..."
               class="pf-c-spinner pf-m-xl"
               role="progressbar"
@@ -66,6 +67,7 @@ exports[`LoadingScreen when not visible after fadeout delay 1`] = `
         >
           <div>
             <span
+              aria-label="Contents"
               aria-valuetext="Loading..."
               class="pf-c-spinner pf-m-xl"
               role="progressbar"
@@ -114,6 +116,7 @@ exports[`LoadingScreen when visible 1`] = `
         >
           <div>
             <span
+              aria-label="Contents"
               aria-valuetext="Loading..."
               class="pf-c-spinner pf-m-xl"
               role="progressbar"
diff --git a/packages/editor/tests/envelope/__snapshots__/EditorEnvelopeView.test.tsx.snap b/packages/editor/tests/envelope/__snapshots__/EditorEnvelopeView.test.tsx.snap
index 8ae2202e6a..8125af90cc 100644
--- a/packages/editor/tests/envelope/__snapshots__/EditorEnvelopeView.test.tsx.snap
+++ b/packages/editor/tests/envelope/__snapshots__/EditorEnvelopeView.test.tsx.snap
@@ -123,6 +123,7 @@ exports[`EditorEnvelopeView first open 1`] = `
           >
             <div>
               <span
+                aria-label="Contents"
                 aria-valuetext="Loading..."
                 class="pf-c-spinner pf-m-xl"
                 role="progressbar"
diff --git a/packages/form-dmn/package.json b/packages/form-dmn/package.json
index dc3e4670f9..89466ce525 100644
--- a/packages/form-dmn/package.json
+++ b/packages/form-dmn/package.json
@@ -30,8 +30,8 @@
     "@kie-tools/form": "workspace:*",
     "@kie-tools/i18n-common-dictionary": "workspace:*",
     "@kie-tools/uniforms-patternfly": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
     "ajv": "^6.12.6",
     "ajv-errors": "^1.0.1",
     "deep-object-diff": "^1.1.0",
diff --git a/packages/form-dmn/src/DmnFormResult.tsx b/packages/form-dmn/src/DmnFormResult.tsx
index 3b24b64826..56776537c8 100644
--- a/packages/form-dmn/src/DmnFormResult.tsx
+++ b/packages/form-dmn/src/DmnFormResult.tsx
@@ -101,7 +101,7 @@ export function extractDifferences(current: DecisionResult[], previous: Decision
     });
 }
 
-export function DmnFormResult(props: DmnFormResultProps) {
+export function DmnFormResult({ openExecutionTab, ...props }: DmnFormResultProps) {
   const [formResultStatus, setFormResultStatus] = useState<DmnFormResultStatus>(DmnFormResultStatus.EMPTY);
   const [formResultError, setFormResultError] = useState<boolean>(false);
   const i18n = useMemo(() => {
@@ -129,11 +129,11 @@ export function DmnFormResult(props: DmnFormResultProps) {
     updatedResult?.classList.remove("kogito--editor__dmn-form-result__leaf-updated");
   }, []);
 
-  const openExecutionTab = useCallback(() => {
+  const onOpenExecutionTab = useCallback(() => {
     if (props.notificationsPanel) {
-      props.openExecutionTab?.();
+      openExecutionTab?.();
     }
-  }, [props.notificationsPanel]);
+  }, [props.notificationsPanel, openExecutionTab]);
 
   const resultStatus = useCallback(
     (evaluationStatus: EvaluationStatus) => {
@@ -144,7 +144,7 @@ export function DmnFormResult(props: DmnFormResultProps) {
               <div className={"kie-tools__dmn-form-result__evaluation"}>
                 <CheckCircleIcon />
                 {props.notificationsPanel ? (
-                  <a onClick={openExecutionTab} className={"kogito--editor__dmn-form-result__evaluation-link"}>
+                  <a onClick={onOpenExecutionTab} className={"kogito--editor__dmn-form-result__evaluation-link"}>
                     {i18n.result.evaluation.success}
                   </a>
                 ) : (
@@ -159,7 +159,7 @@ export function DmnFormResult(props: DmnFormResultProps) {
               <div className={"kie-tools__dmn-form-result__evaluation"}>
                 <InfoCircleIcon />
                 {props.notificationsPanel ? (
-                  <a onClick={openExecutionTab} className={"kogito--editor__dmn-form-result__evaluation-link"}>
+                  <a onClick={onOpenExecutionTab} className={"kogito--editor__dmn-form-result__evaluation-link"}>
                     {i18n.result.evaluation.skipped}
                   </a>
                 ) : (
@@ -174,7 +174,7 @@ export function DmnFormResult(props: DmnFormResultProps) {
               <div className={"kie-tools__dmn-form-result__evaluation"}>
                 <ExclamationCircleIcon />
                 {props.notificationsPanel ? (
-                  <a onClick={openExecutionTab} className={"kogito--editor__dmn-form-result__evaluation-link"}>
+                  <a onClick={onOpenExecutionTab} className={"kogito--editor__dmn-form-result__evaluation-link"}>
                     {i18n.result.evaluation.failed}
                   </a>
                 ) : (
@@ -189,7 +189,7 @@ export function DmnFormResult(props: DmnFormResultProps) {
       i18n.result.evaluation.failed,
       i18n.result.evaluation.skipped,
       i18n.result.evaluation.success,
-      openExecutionTab,
+      onOpenExecutionTab,
       props.notificationsPanel,
     ]
   );
diff --git a/packages/form-dmn/tests/DmnForm.test.tsx b/packages/form-dmn/tests/DmnForm.test.tsx
index 47470c10ee..1781e7291a 100644
--- a/packages/form-dmn/tests/DmnForm.test.tsx
+++ b/packages/form-dmn/tests/DmnForm.test.tsx
@@ -54,76 +54,92 @@ const props: FormComponentProps<InputRow, DmnSchema> = {
 
 describe("DmnForm tests", () => {
   it("should render the DMN Form", async () => {
-    const newProps = { ...props, formData: { name: "Kogito", lastName: "Tooling", daysAndTimeDuration: "P1D" } };
+    const newProps = { ...props, formInputs: { name: "Kogito", lastName: "Tooling", daysAndTimeDuration: "P1D" } };
 
     const { findByTestId } = render(<DmnForm {...newProps} />);
 
     expect(await findByTestId("form-base")).toMatchSnapshot();
   });
 
-  it("should submit the formData", async () => {
-    const formRef = React.createRef<HTMLFormElement>();
+  it("should submit the formInputs", async () => {
+    let formRef: HTMLFormElement;
+    const setFormRef = (node: any) => {
+      formRef = node;
+    };
     const onSubmit = jest.fn();
-    const formData = { name: "Kogito", lastName: "Tooling", daysAndTimeDuration: "P1D" };
+    const formInputs = { name: "Kogito", lastName: "Tooling", daysAndTimeDuration: "P1D" };
 
-    const { findByTestId } = render(<DmnForm {...props} onSubmit={onSubmit} formRef={formRef} formInputs={formData} />);
+    const { findByTestId } = render(
+      <DmnForm {...props} onSubmit={onSubmit} setFormRef={setFormRef} formInputs={formInputs} />
+    );
 
     expect(await findByTestId("form-base")).toMatchSnapshot();
 
     await act(async () => {
-      formRef.current?.submit();
+      formRef?.submit();
     });
 
-    expect(onSubmit).toHaveBeenCalledWith(formData);
+    expect(onSubmit).toHaveBeenCalledWith(formInputs);
   });
 
-  it("shouldn't submit the formData", async () => {
-    const formRef = React.createRef<HTMLFormElement>();
+  it("shouldn't submit the formInputs", async () => {
+    let formRef: HTMLFormElement;
+    const setFormRef = (node: any) => {
+      formRef = node;
+    };
     const onSubmit = jest.fn();
-    const formData = { daysAndTimeDuration: "p" };
+    const formInputs = { daysAndTimeDuration: "p" };
 
-    const { findByTestId } = render(<DmnForm {...props} onSubmit={onSubmit} formRef={formRef} formInputs={formData} />);
+    const { findByTestId } = render(
+      <DmnForm {...props} onSubmit={onSubmit} setFormRef={setFormRef} formInputs={formInputs} />
+    );
 
     expect(await findByTestId("form-base")).toMatchSnapshot();
 
     await act(async () => {
-      formRef.current?.submit();
+      formRef?.submit();
     });
 
     expect(onSubmit).toHaveBeenCalledTimes(0);
   });
 
-  it("should validate the formData - success", async () => {
-    const formRef = React.createRef<HTMLFormElement>();
+  it("should validate the formInputs - success", async () => {
+    let formRef: HTMLFormElement;
+    const setFormRef = (node: any) => {
+      formRef = node;
+    };
     const onValidate = jest.fn();
-    const formData = { name: "Kogito", lastName: "Tooling", daysAndTimeDuration: "P1D" };
+    const formInputs = { name: "Kogito", lastName: "Tooling", daysAndTimeDuration: "P1D" };
 
     const { findByTestId } = render(
-      <DmnForm {...props} formRef={formRef} onValidate={onValidate} formInputs={formData} />
+      <DmnForm {...props} setFormRef={setFormRef} onValidate={onValidate} formInputs={formInputs} />
     );
 
     expect(await findByTestId("form-base")).toMatchSnapshot();
 
     await act(async () => {
-      formRef.current?.submit();
+      formRef?.submit();
     });
 
-    expect(onValidate).toHaveBeenCalledWith(formData, null);
+    expect(onValidate).toHaveBeenCalledWith(formInputs, null);
   });
 
-  it("should validate the formData - invalid", async () => {
-    const formRef = React.createRef<HTMLFormElement>();
+  it("should validate the formInputs - invalid", async () => {
+    let formRef: HTMLFormElement;
+    const setFormRef = (node: any) => {
+      formRef = node;
+    };
     const onValidate = jest.fn();
-    const formData = { name: "Kogito", lastName: "Tooling", daysAndTimeDuration: "p" };
+    const formInputs = { name: "Kogito", lastName: "Tooling", daysAndTimeDuration: "p" };
 
     const { findByTestId } = render(
-      <DmnForm {...props} formRef={formRef} onValidate={onValidate} formInputs={formData} />
+      <DmnForm {...props} setFormRef={setFormRef} onValidate={onValidate} formInputs={formInputs} />
     );
 
     expect(await findByTestId("form-base")).toMatchSnapshot();
 
     await act(async () => {
-      formRef.current?.submit();
+      formRef?.submit();
     });
 
     expect(onValidate).toHaveBeenCalledTimes(2);
@@ -142,12 +158,9 @@ describe("DmnForm tests", () => {
       },
     };
 
-    const formRef = React.createRef<HTMLFormElement>();
-    const formData = {};
+    const formInputs = {};
 
-    const { getByText } = render(
-      <DmnForm {...props} placeholder={true} formSchema={schema} formRef={formRef} formInputs={formData} />
-    );
+    const { getByText } = render(<DmnForm {...props} placeholder={true} formSchema={schema} formInputs={formInputs} />);
 
     expect(getByText(dmnFormI18n.getCurrent().schema.selectPlaceholder)).toMatchSnapshot();
   });
@@ -165,11 +178,14 @@ describe("DmnForm tests", () => {
       },
     };
 
-    const formRef = React.createRef<HTMLFormElement>();
-    const formData = {};
+    let formRef: HTMLFormElement;
+    const setFormRef = (node: any) => {
+      formRef = node;
+    };
+    const formInputs = {};
 
     const { getByText } = render(
-      <DmnForm {...props} placeholder={true} formSchema={schema} formRef={formRef} formInputs={formData} />
+      <DmnForm {...props} placeholder={true} formSchema={schema} setFormRef={setFormRef} formInputs={formInputs} />
     );
 
     expect(getByText("name")).toMatchSnapshot();
@@ -189,8 +205,11 @@ describe("DmnForm tests", () => {
       },
     };
 
-    const formRef = React.createRef<HTMLFormElement>();
-    const formData = {};
+    let formRef: HTMLFormElement;
+    const setFormRef = (node: any) => {
+      formRef = node;
+    };
+    const formInputs = {};
     const onSubmit = jest.fn();
 
     const { container } = render(
@@ -199,17 +218,17 @@ describe("DmnForm tests", () => {
         placeholder={true}
         formSchema={schema}
         onSubmit={onSubmit}
-        formRef={formRef}
-        formInputs={formData}
+        setFormRef={setFormRef}
+        formInputs={formInputs}
       />
     );
 
     expect(container).toMatchSnapshot();
 
     await act(async () => {
-      formRef.current?.submit();
+      formRef?.submit();
     });
 
-    expect(onSubmit).toHaveBeenCalledTimes(1);
+    expect(onSubmit).toHaveBeenCalledTimes(2);
   });
 });
diff --git a/packages/form-dmn/tests/__snapshots__/DmnForm.test.tsx.snap b/packages/form-dmn/tests/__snapshots__/DmnForm.test.tsx.snap
index 03d8a34534..cedcc25f80 100644
--- a/packages/form-dmn/tests/__snapshots__/DmnForm.test.tsx.snap
+++ b/packages/form-dmn/tests/__snapshots__/DmnForm.test.tsx.snap
@@ -114,7 +114,7 @@ exports[`DmnForm tests should render the DMN Form 1`] = `
             name="name"
             placeholder=""
             type="text"
-            value=""
+            value="Kogito"
           />
           
         </div>
@@ -152,7 +152,7 @@ exports[`DmnForm tests should render the DMN Form 1`] = `
             name="lastName"
             placeholder=""
             type="text"
-            value=""
+            value="Tooling"
           />
           
         </div>
@@ -190,7 +190,7 @@ exports[`DmnForm tests should render the DMN Form 1`] = `
             name="daysAndTimeDuration"
             placeholder=""
             type="text"
-            value=""
+            value="P1D"
           />
           
         </div>
@@ -238,7 +238,7 @@ exports[`DmnForm tests should render the DMN Form 1`] = `
 </div>
 `;
 
-exports[`DmnForm tests should submit the formData 1`] = `
+exports[`DmnForm tests should submit the formInputs 1`] = `
 <div
   data-testid="form-base"
 >
@@ -405,7 +405,7 @@ exports[`DmnForm tests should submit the formData 1`] = `
 </div>
 `;
 
-exports[`DmnForm tests should validate the formData - invalid 1`] = `
+exports[`DmnForm tests should validate the formInputs - invalid 1`] = `
 <div
   data-testid="form-base"
 >
@@ -578,7 +578,7 @@ exports[`DmnForm tests should validate the formData - invalid 1`] = `
 </div>
 `;
 
-exports[`DmnForm tests should validate the formData - success 1`] = `
+exports[`DmnForm tests should validate the formInputs - success 1`] = `
 <div
   data-testid="form-base"
 >
@@ -745,7 +745,7 @@ exports[`DmnForm tests should validate the formData - success 1`] = `
 </div>
 `;
 
-exports[`DmnForm tests shouldn't submit the formData 1`] = `
+exports[`DmnForm tests shouldn't submit the formInputs 1`] = `
 <div
   data-testid="form-base"
 >
diff --git a/packages/form/package.json b/packages/form/package.json
index 57d5a6236e..6c6b491276 100644
--- a/packages/form/package.json
+++ b/packages/form/package.json
@@ -28,8 +28,8 @@
     "@kie-tools-core/notifications": "workspace:*",
     "@kie-tools/i18n-common-dictionary": "workspace:*",
     "@kie-tools/uniforms-patternfly": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
     "ajv": "^6.12.6",
     "ajv-errors": "^1.0.1",
     "deep-object-diff": "^1.1.0",
diff --git a/packages/form/src/FormBase.tsx b/packages/form/src/FormBase.tsx
index 02fe94c9ca..9d43cad111 100644
--- a/packages/form/src/FormBase.tsx
+++ b/packages/form/src/FormBase.tsx
@@ -25,7 +25,7 @@ export interface FormBaseProps {
   id?: string;
   i18n: FormI18n;
   setFormError: React.Dispatch<React.SetStateAction<boolean>>;
-  formRef?: React.RefObject<HTMLFormElement>;
+  setFormRef: React.Dispatch<React.SetStateAction<HTMLFormElement | null>>;
   showInlineError?: boolean;
   autoSave?: boolean;
   autoSaveDelay?: number;
@@ -70,7 +70,7 @@ export function FormBase(props: React.PropsWithChildren<FormBaseProps>) {
             <AutoForm
               id={props.id}
               model={props.formModel}
-              ref={props.formRef}
+              ref={(node: HTMLFormElement) => props.setFormRef(node)}
               showInlineError={props.showInlineError}
               autosave={props.autoSave}
               autosaveDelay={props.autoSaveDelay}
@@ -80,7 +80,7 @@ export function FormBase(props: React.PropsWithChildren<FormBaseProps>) {
               onValidate={props.onValidate}
               errorsField={props.errorsField}
               submitField={props.submitField}
-              validate={"onChange"}
+              validate={"onSubmit"}
             >
               {props.children}
             </AutoForm>
diff --git a/packages/form/src/FormComponent.tsx b/packages/form/src/FormComponent.tsx
index ae22a6a460..6a9e3ed7a3 100644
--- a/packages/form/src/FormComponent.tsx
+++ b/packages/form/src/FormComponent.tsx
@@ -24,7 +24,7 @@ export interface FormProps<Input, Schema> {
   id?: string;
   name?: string;
   locale: string;
-  formRef?: React.RefObject<HTMLFormElement>;
+  setFormRef?: (formElement: HTMLFormElement | null) => void;
   showInlineError?: boolean;
   autoSave?: boolean;
   autoSaveDelay?: number;
@@ -50,9 +50,8 @@ export function FormComponent(props: React.PropsWithChildren<FormComponentProps<
     [props.i18n, props.locale]
   );
 
-  const { onValidate, onSubmit, formModel, formStatus, jsonSchemaBridge, errorBoundaryRef } = useForm({
+  const { onValidate, onSubmit, formStatus, jsonSchemaBridge, errorBoundaryRef, setFormRef } = useForm({
     i18n,
-    name: props.name,
     formError: props.formError,
     setFormError: props.setFormError,
     formInputs: props.formInputs,
@@ -64,6 +63,7 @@ export function FormComponent(props: React.PropsWithChildren<FormComponentProps<
     entryPath: props.entryPath,
     propertiesEntryPath: props.propertiesEntryPath,
     validator: props.validator,
+    setFormRef: props.setFormRef,
   });
 
   return (
@@ -74,9 +74,10 @@ export function FormComponent(props: React.PropsWithChildren<FormComponentProps<
         formStatus={formStatus}
         errorBoundaryRef={errorBoundaryRef}
         jsonSchemaBridge={jsonSchemaBridge}
-        formModel={formModel}
+        formModel={props.formInputs}
         onSubmit={onSubmit}
         onValidate={onValidate}
+        setFormRef={setFormRef}
       >
         {props.children}
       </FormBase>
diff --git a/packages/form/src/FormHook.tsx b/packages/form/src/FormHook.tsx
index 4d17aa98c7..5a73e43fdc 100644
--- a/packages/form/src/FormHook.tsx
+++ b/packages/form/src/FormHook.tsx
@@ -26,7 +26,6 @@ import { Validator } from "./Validator";
 import { FormI18n } from "./i18n";
 
 export interface FormHook<Input extends Record<string, any>, Schema extends Record<string, any>> {
-  name?: string;
   formError: boolean;
   setFormError: React.Dispatch<React.SetStateAction<boolean>>;
   formInputs: Input;
@@ -39,13 +38,13 @@ export interface FormHook<Input extends Record<string, any>, Schema extends Reco
   validator?: Validator;
   removeRequired?: boolean;
   i18n: FormI18n;
+  setFormRef?: (formElement: HTMLFormElement | null) => void;
 }
 
 const getObjectByPath = (obj: Record<string, Record<string, object>>, path: string) =>
-  path.split(".").reduce((acc: Record<string, Record<string, object>>, key: string) => acc?.[key], obj);
+  path.split(".").reduce((acc: Record<string, Record<string, object>>, key: string) => acc?.[key] ?? {}, obj);
 
 export function useForm<Input extends Record<string, any>, Schema extends Record<string, any>>({
-  name,
   formError,
   setFormError,
   formInputs,
@@ -58,18 +57,19 @@ export function useForm<Input extends Record<string, any>, Schema extends Record
   validator,
   removeRequired = false,
   i18n,
+  setFormRef,
 }: FormHook<Input, Schema>) {
   const errorBoundaryRef = useRef<ErrorBoundary>(null);
   const [jsonSchemaBridge, setJsonSchemaBridge] = useState<FormJsonSchemaBridge>();
-  const [formModel, setFormModel] = useState<object>();
   const [formStatus, setFormStatus] = useState<FormStatus>(FormStatus.EMPTY);
   const formValidator = useMemo(() => (validator ? validator : new Validator(i18n)), [validator, i18n]);
+  const [ref, setRef] = useState<HTMLFormElement | null>(null);
 
   const removeDeletedPropertiesAndAddDefaultValues = useCallback(
-    (model: object, bridge: FormJsonSchemaBridge, previousBridge?: FormJsonSchemaBridge) => {
+    (formInputs: object, bridge: FormJsonSchemaBridge, previousBridge?: FormJsonSchemaBridge) => {
       const propertiesDifference = diff(
-        getObjectByPath(previousBridge?.schema ?? {}, entryPath) ?? {},
-        getObjectByPath(bridge.schema ?? {}, entryPath) ?? {}
+        getObjectByPath(previousBridge?.schema ?? {}, propertiesEntryPath) ?? {},
+        getObjectByPath(bridge.schema ?? {}, propertiesEntryPath) ?? {}
       );
 
       const defaultFormValues = Object.keys(bridge?.schema?.properties ?? {}).reduce((acc, property) => {
@@ -91,13 +91,13 @@ export function useForm<Input extends Record<string, any>, Schema extends Record
           }
           return form;
         },
-        { ...defaultFormValues, ...model }
+        { ...defaultFormValues, ...formInputs }
       );
     },
-    [entryPath]
+    [propertiesEntryPath]
   );
 
-  // When the schema is updated it's necessary to update the bridge and the model (remove deleted properties and
+  // When the schema is updated it's necessary to update the bridge and the formInputs (remove deleted properties and
   // add default values to it)
   useEffect(() => {
     try {
@@ -109,14 +109,13 @@ export function useForm<Input extends Record<string, any>, Schema extends Record
       }
       const bridge = formValidator.getBridge(form);
       setJsonSchemaBridge((previousBridge) => {
-        if (formModel) {
-          const newFormModel = removeDeletedPropertiesAndAddDefaultValues(formModel, bridge, previousBridge);
-          if (Object.keys(diff(formModel ?? {}, newFormModel ?? {})).length > 0) {
-            setFormModel(newFormModel);
-          } else {
-            setFormModel(formModel);
+        setFormInputs((currentFormInputs) => {
+          const newFormInputs = removeDeletedPropertiesAndAddDefaultValues(currentFormInputs, bridge, previousBridge);
+          if (Object.keys(diff(currentFormInputs ?? {}, newFormInputs ?? {})).length > 0) {
+            return newFormInputs as Input;
           }
-        }
+          return currentFormInputs;
+        });
         return bridge;
       });
 
@@ -124,7 +123,7 @@ export function useForm<Input extends Record<string, any>, Schema extends Record
     } catch (err) {
       setFormStatus(FormStatus.VALIDATOR_ERROR);
     }
-  }, [formModel, formSchema, formValidator, entryPath, removeDeletedPropertiesAndAddDefaultValues, removeRequired]);
+  }, [setFormInputs, formSchema, formValidator, entryPath, removeDeletedPropertiesAndAddDefaultValues, removeRequired]);
 
   // Manage form status
   useEffect(() => {
@@ -139,44 +138,38 @@ export function useForm<Input extends Record<string, any>, Schema extends Record
       setFormStatus(FormStatus.WITHOUT_ERROR);
       errorBoundaryRef.current?.reset();
     }
-  }, [formError, formSchema, jsonSchemaBridge, formModel, propertiesEntryPath]);
+  }, [formError, formSchema, jsonSchemaBridge, propertiesEntryPath]);
 
   // Resets the ErrorBoundary everytime the FormSchema is updated
   useEffect(() => {
     errorBoundaryRef.current?.reset();
   }, [formSchema]);
 
-  // When form name changes, update the formModel
+  // When the formInput changes, reset the formError
   useEffect(() => {
-    const newFormModel = cloneDeep(formInputs);
-    setFormModel(newFormModel);
+    setFormError(false);
   }, [formInputs]);
 
-  // When the formModel changes, update the formData and reset the formError
+  // Submits the form in the first render triggering the onValidate function
   useEffect(() => {
-    setFormError((previousFormError) => {
-      if (!previousFormError && formModel && Object.keys(formModel).length > 0) {
-        const newFormInputs = cloneDeep(formModel) as Input;
-        setFormInputs(newFormInputs);
-      }
-      return false;
-    });
-  }, [formModel, setFormError, setFormInputs]);
+    ref?.submit();
+    setFormRef?.(ref);
+  }, [setFormRef, ref]);
 
   const onFormSubmit = useCallback(
-    (model) => {
-      onSubmit?.(model);
+    (formInputs) => {
+      onSubmit?.(formInputs);
     },
     [onSubmit]
   );
 
   // Validation occurs on every change and submit.
   const onFormValidate = useCallback(
-    (model, error: any) => {
-      onValidate?.(model, error);
-      setFormModel((previousModel) => {
-        if (Object.keys(diff(model, previousModel ?? {})).length > 0) {
-          return model;
+    (formInputs, error: any) => {
+      onValidate?.(formInputs, error);
+      setFormInputs((previousModel) => {
+        if (Object.keys(diff(formInputs, previousModel ?? {})).length > 0) {
+          return formInputs;
         }
         return previousModel ?? {};
       });
@@ -216,19 +209,19 @@ export function useForm<Input extends Record<string, any>, Schema extends Record
           } else {
             return deeper[field];
           }
-        }, model);
+        }, formInputs);
       });
       return { details };
     },
-    [onValidate]
+    [onValidate, setFormInputs]
   );
 
   return {
     onSubmit: onFormSubmit,
     onValidate: onFormValidate,
-    formModel,
     formStatus,
     jsonSchemaBridge,
     errorBoundaryRef,
+    setFormRef: setRef,
   };
 }
diff --git a/packages/guided-tour/package.json b/packages/guided-tour/package.json
index 39851a80e5..33871fd85f 100644
--- a/packages/guided-tour/package.json
+++ b/packages/guided-tour/package.json
@@ -20,8 +20,8 @@
     "@kie-tools-core/envelope-bus": "workspace:*",
     "@kie-tools-core/i18n": "workspace:*",
     "@kie-tools-core/patternfly-base": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
     "react": "^17.0.2",
     "react-dom": "^17.0.2"
   },
diff --git a/packages/import-java-classes-component/package.json b/packages/import-java-classes-component/package.json
index 2468f65574..f25eb9cb51 100644
--- a/packages/import-java-classes-component/package.json
+++ b/packages/import-java-classes-component/package.json
@@ -20,9 +20,9 @@
     "@kie-tools-core/i18n": "workspace:*",
     "@kie-tools-core/vscode-java-code-completion": "workspace:*",
     "@kie-tools/i18n-common-dictionary": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
-    "@patternfly/react-table": "^4.27.15",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
+    "@patternfly/react-table": "^4.112.39",
     "react": "^17.0.2",
     "react-dom": "^17.0.2"
   },
diff --git a/packages/import-java-classes-component/src/__tests__/ImportJavaClasses/__snapshots__/ImportJavaClasses.test.tsx.snap b/packages/import-java-classes-component/src/__tests__/ImportJavaClasses/__snapshots__/ImportJavaClasses.test.tsx.snap
index d0e0ab1b7e..f07c335488 100644
--- a/packages/import-java-classes-component/src/__tests__/ImportJavaClasses/__snapshots__/ImportJavaClasses.test.tsx.snap
+++ b/packages/import-java-classes-component/src/__tests__/ImportJavaClasses/__snapshots__/ImportJavaClasses.test.tsx.snap
@@ -63,7 +63,7 @@ exports[`ImportJavaClasses component tests Should move to second step 1`] = `
             aria-disabled="false"
             aria-label="Close"
             class="pf-c-button pf-m-plain"
-            data-ouia-component-id="OUIA-Generated-Button-plain-7"
+            data-ouia-component-id="OUIA-Generated-Modal-large-5-ModalBoxCloseButton"
             data-ouia-component-type="PF4/Button"
             data-ouia-safe="true"
             type="button"
@@ -156,6 +156,9 @@ exports[`ImportJavaClasses component tests Should move to second step 1`] = `
                 >
                   <nav
                     class="pf-c-wizard__nav"
+                    data-ouia-component-id="OUIA-Generated-WizardNav-5"
+                    data-ouia-component-type="PF4/WizardNav"
+                    data-ouia-safe="true"
                   >
                     <ol
                       class="pf-c-wizard__nav-list"
@@ -166,6 +169,9 @@ exports[`ImportJavaClasses component tests Should move to second step 1`] = `
                         <button
                           aria-current="false"
                           class="pf-c-wizard__nav-link"
+                          data-ouia-component-id="OUIA-Generated-WizardNavItem-13"
+                          data-ouia-component-type="PF4/WizardNavItem"
+                          data-ouia-safe="true"
                         >
                           Select Java classes
                         </button>
@@ -176,6 +182,9 @@ exports[`ImportJavaClasses component tests Should move to second step 1`] = `
                         <button
                           aria-current="step"
                           class="pf-c-wizard__nav-link pf-m-current"
+                          data-ouia-component-id="OUIA-Generated-WizardNavItem-14"
+                          data-ouia-component-type="PF4/WizardNavItem"
+                          data-ouia-safe="true"
                         >
                           Select fields
                         </button>
@@ -186,6 +195,9 @@ exports[`ImportJavaClasses component tests Should move to second step 1`] = `
                         <button
                           aria-current="false"
                           class="pf-c-wizard__nav-link"
+                          data-ouia-component-id="OUIA-Generated-WizardNavItem-15"
+                          data-ouia-component-type="PF4/WizardNavItem"
+                          data-ouia-safe="true"
                         >
                           Review
                         </button>
@@ -559,7 +571,7 @@ exports[`ImportJavaClasses component tests Should move to second step and fetch
             aria-disabled="false"
             aria-label="Close"
             class="pf-c-button pf-m-plain"
-            data-ouia-component-id="OUIA-Generated-Button-plain-11"
+            data-ouia-component-id="OUIA-Generated-Modal-large-6-ModalBoxCloseButton"
             data-ouia-component-type="PF4/Button"
             data-ouia-safe="true"
             type="button"
@@ -652,6 +664,9 @@ exports[`ImportJavaClasses component tests Should move to second step and fetch
                 >
                   <nav
                     class="pf-c-wizard__nav"
+                    data-ouia-component-id="OUIA-Generated-WizardNav-6"
+                    data-ouia-component-type="PF4/WizardNav"
+                    data-ouia-safe="true"
                   >
                     <ol
                       class="pf-c-wizard__nav-list"
@@ -662,6 +677,9 @@ exports[`ImportJavaClasses component tests Should move to second step and fetch
                         <button
                           aria-current="false"
                           class="pf-c-wizard__nav-link"
+                          data-ouia-component-id="OUIA-Generated-WizardNavItem-16"
+                          data-ouia-component-type="PF4/WizardNavItem"
+                          data-ouia-safe="true"
                         >
                           Select Java classes
                         </button>
@@ -672,6 +690,9 @@ exports[`ImportJavaClasses component tests Should move to second step and fetch
                         <button
                           aria-current="step"
                           class="pf-c-wizard__nav-link pf-m-current"
+                          data-ouia-component-id="OUIA-Generated-WizardNavItem-17"
+                          data-ouia-component-type="PF4/WizardNavItem"
+                          data-ouia-safe="true"
                         >
                           Select fields
                         </button>
@@ -682,6 +703,9 @@ exports[`ImportJavaClasses component tests Should move to second step and fetch
                         <button
                           aria-current="false"
                           class="pf-c-wizard__nav-link"
+                          data-ouia-component-id="OUIA-Generated-WizardNavItem-18"
+                          data-ouia-component-type="PF4/WizardNavItem"
+                          data-ouia-safe="true"
                         >
                           Review
                         </button>
@@ -1074,7 +1098,7 @@ exports[`ImportJavaClasses component tests Should move to third step 1`] = `
             aria-disabled="false"
             aria-label="Close"
             class="pf-c-button pf-m-plain"
-            data-ouia-component-id="OUIA-Generated-Button-plain-25"
+            data-ouia-component-id="OUIA-Generated-Modal-large-8-ModalBoxCloseButton"
             data-ouia-component-type="PF4/Button"
             data-ouia-safe="true"
             type="button"
@@ -1167,6 +1191,9 @@ exports[`ImportJavaClasses component tests Should move to third step 1`] = `
                 >
                   <nav
                     class="pf-c-wizard__nav"
+                    data-ouia-component-id="OUIA-Generated-WizardNav-8"
+                    data-ouia-component-type="PF4/WizardNav"
+                    data-ouia-safe="true"
                   >
                     <ol
                       class="pf-c-wizard__nav-list"
@@ -1177,6 +1204,9 @@ exports[`ImportJavaClasses component tests Should move to third step 1`] = `
                         <button
                           aria-current="false"
                           class="pf-c-wizard__nav-link"
+                          data-ouia-component-id="OUIA-Generated-WizardNavItem-22"
+                          data-ouia-component-type="PF4/WizardNavItem"
+                          data-ouia-safe="true"
                         >
                           Select Java classes
                         </button>
@@ -1187,6 +1217,9 @@ exports[`ImportJavaClasses component tests Should move to third step 1`] = `
                         <button
                           aria-current="false"
                           class="pf-c-wizard__nav-link"
+                          data-ouia-component-id="OUIA-Generated-WizardNavItem-23"
+                          data-ouia-component-type="PF4/WizardNavItem"
+                          data-ouia-safe="true"
                         >
                           Select fields
                         </button>
@@ -1197,6 +1230,9 @@ exports[`ImportJavaClasses component tests Should move to third step 1`] = `
                         <button
                           aria-current="step"
                           class="pf-c-wizard__nav-link pf-m-current"
+                          data-ouia-component-id="OUIA-Generated-WizardNavItem-24"
+                          data-ouia-component-type="PF4/WizardNavItem"
+                          data-ouia-safe="true"
                         >
                           Review
                         </button>
@@ -1564,7 +1600,7 @@ exports[`ImportJavaClasses component tests Should search box with results works
             aria-disabled="false"
             aria-label="Close"
             class="pf-c-button pf-m-plain"
-            data-ouia-component-id="OUIA-Generated-Button-plain-4"
+            data-ouia-component-id="OUIA-Generated-Modal-large-3-ModalBoxCloseButton"
             data-ouia-component-type="PF4/Button"
             data-ouia-safe="true"
             type="button"
@@ -1657,6 +1693,9 @@ exports[`ImportJavaClasses component tests Should search box with results works
                 >
                   <nav
                     class="pf-c-wizard__nav"
+                    data-ouia-component-id="OUIA-Generated-WizardNav-3"
+                    data-ouia-component-type="PF4/WizardNav"
+                    data-ouia-safe="true"
                   >
                     <ol
                       class="pf-c-wizard__nav-list"
@@ -1667,6 +1706,9 @@ exports[`ImportJavaClasses component tests Should search box with results works
                         <button
                           aria-current="step"
                           class="pf-c-wizard__nav-link pf-m-current"
+                          data-ouia-component-id="OUIA-Generated-WizardNavItem-7"
+                          data-ouia-component-type="PF4/WizardNavItem"
+                          data-ouia-safe="true"
                         >
                           Select Java classes
                         </button>
@@ -1677,6 +1719,9 @@ exports[`ImportJavaClasses component tests Should search box with results works
                         <button
                           aria-current="false"
                           class="pf-c-wizard__nav-link"
+                          data-ouia-component-id="OUIA-Generated-WizardNavItem-8"
+                          data-ouia-component-type="PF4/WizardNavItem"
+                          data-ouia-safe="true"
                         >
                           Select fields
                         </button>
@@ -1688,6 +1733,9 @@ exports[`ImportJavaClasses component tests Should search box with results works
                           aria-current="false"
                           aria-disabled="true"
                           class="pf-c-wizard__nav-link pf-m-disabled"
+                          data-ouia-component-id="OUIA-Generated-WizardNavItem-9"
+                          data-ouia-component-type="PF4/WizardNavItem"
+                          data-ouia-safe="true"
                           disabled=""
                         >
                           Review
@@ -1705,73 +1753,66 @@ exports[`ImportJavaClasses component tests Should search box with results works
                         class="fs-search-input"
                       >
                         <div
-                          class="pf-c-search-input"
+                          class="pf-c-text-input-group"
                         >
                           <div
-                            class="pf-c-input-group"
+                            class="pf-c-text-input-group__main pf-m-icon"
                           >
-                            <div
-                              class="pf-c-search-input__bar"
+                            <span
+                              class="pf-c-text-input-group__text"
                             >
                               <span
-                                class="pf-c-search-input__text"
+                                class="pf-c-text-input-group__icon"
                               >
-                                <span
-                                  class="pf-c-search-input__icon"
+                                <svg
+                                  aria-hidden="true"
+                                  fill="currentColor"
+                                  height="1em"
+                                  role="img"
+                                  style="vertical-align: -0.125em;"
+                                  viewBox="0 0 512 512"
+                                  width="1em"
                                 >
-                                  <svg
-                                    aria-hidden="true"
-                                    fill="currentColor"
-                                    height="1em"
-                                    role="img"
-                                    style="vertical-align: -0.125em;"
-                                    viewBox="0 0 512 512"
-                                    width="1em"
-                                  >
-                                    <path
-                                      d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"
-                                    />
-                                  </svg>
-                                </span>
-                                <input
-                                  aria-label="Search input"
-                                  class="pf-c-search-input__text-input"
-                                  placeholder="Type the class name here"
-                                  value="test"
-                                />
+                                  <path
+                                    d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"
+                                  />
+                                </svg>
                               </span>
-                              <span
-                                class="pf-c-search-input__utilities"
+                              <input
+                                aria-label="Search input"
+                                class="pf-c-text-input-group__text-input"
+                                placeholder="Type the class name here"
+                                type="text"
+                                value="test"
+                              />
+                            </span>
+                          </div>
+                          <div
+                            class="pf-c-text-input-group__utilities"
+                          >
+                            <button
+                              aria-disabled="false"
+                              aria-label="Reset"
+                              class="pf-c-button pf-m-plain"
+                              data-ouia-component-id="OUIA-Generated-Button-plain-5"
+                              data-ouia-component-type="PF4/Button"
+                              data-ouia-safe="true"
+                              type="button"
+                            >
+                              <svg
+                                aria-hidden="true"
+                                fill="currentColor"
+                                height="1em"
+                                role="img"
+                                style="vertical-align: -0.125em;"
+                                viewBox="0 0 352 512"
+                                width="1em"
                               >
-                                <span
-                                  class="pf-c-search-input__clear"
-                                >
-                                  <button
-                                    aria-disabled="false"
-                                    aria-label="Reset"
-                                    class="pf-c-button pf-m-plain"
-                                    data-ouia-component-id="OUIA-Generated-Button-plain-5"
-                                    data-ouia-component-type="PF4/Button"
-                                    data-ouia-safe="true"
-                                    type="button"
-                                  >
-                                    <svg
-                                      aria-hidden="true"
-                                      fill="currentColor"
-                                      height="1em"
-                                      role="img"
-                                      style="vertical-align: -0.125em;"
-                                      viewBox="0 0 352 512"
-                                      width="1em"
-                                    >
-                                      <path
-                                        d="M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z"
-                                      />
-                                    </svg>
-                                  </button>
-                                </span>
-                              </span>
-                            </div>
+                                <path
+                                  d="M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z"
+                                />
+                              </svg>
+                            </button>
                           </div>
                         </div>
                       </div>
@@ -1932,7 +1973,7 @@ exports[`ImportJavaClasses component tests Should show Modal after clicking on t
             aria-disabled="false"
             aria-label="Close"
             class="pf-c-button pf-m-plain"
-            data-ouia-component-id="OUIA-Generated-Button-plain-1"
+            data-ouia-component-id="OUIA-Generated-Modal-large-1-ModalBoxCloseButton"
             data-ouia-component-type="PF4/Button"
             data-ouia-safe="true"
             type="button"
@@ -2025,6 +2066,9 @@ exports[`ImportJavaClasses component tests Should show Modal after clicking on t
                 >
                   <nav
                     class="pf-c-wizard__nav"
+                    data-ouia-component-id="OUIA-Generated-WizardNav-1"
+                    data-ouia-component-type="PF4/WizardNav"
+                    data-ouia-safe="true"
                   >
                     <ol
                       class="pf-c-wizard__nav-list"
@@ -2035,6 +2079,9 @@ exports[`ImportJavaClasses component tests Should show Modal after clicking on t
                         <button
                           aria-current="step"
                           class="pf-c-wizard__nav-link pf-m-current"
+                          data-ouia-component-id="OUIA-Generated-WizardNavItem-1"
+                          data-ouia-component-type="PF4/WizardNavItem"
+                          data-ouia-safe="true"
                         >
                           Select Java classes
                         </button>
@@ -2046,6 +2093,9 @@ exports[`ImportJavaClasses component tests Should show Modal after clicking on t
                           aria-current="false"
                           aria-disabled="true"
                           class="pf-c-wizard__nav-link pf-m-disabled"
+                          data-ouia-component-id="OUIA-Generated-WizardNavItem-2"
+                          data-ouia-component-type="PF4/WizardNavItem"
+                          data-ouia-safe="true"
                           disabled=""
                         >
                           Select fields
@@ -2058,6 +2108,9 @@ exports[`ImportJavaClasses component tests Should show Modal after clicking on t
                           aria-current="false"
                           aria-disabled="true"
                           class="pf-c-wizard__nav-link pf-m-disabled"
+                          data-ouia-component-id="OUIA-Generated-WizardNavItem-3"
+                          data-ouia-component-type="PF4/WizardNavItem"
+                          data-ouia-safe="true"
                           disabled=""
                         >
                           Review
@@ -2075,44 +2128,41 @@ exports[`ImportJavaClasses component tests Should show Modal after clicking on t
                         class="fs-search-input"
                       >
                         <div
-                          class="pf-c-search-input"
+                          class="pf-c-text-input-group"
                         >
                           <div
-                            class="pf-c-input-group"
+                            class="pf-c-text-input-group__main pf-m-icon"
                           >
-                            <div
-                              class="pf-c-search-input__bar"
+                            <span
+                              class="pf-c-text-input-group__text"
                             >
                               <span
-                                class="pf-c-search-input__text"
+                                class="pf-c-text-input-group__icon"
                               >
-                                <span
-                                  class="pf-c-search-input__icon"
+                                <svg
+                                  aria-hidden="true"
+                                  fill="currentColor"
+                                  height="1em"
+                                  role="img"
+                                  style="vertical-align: -0.125em;"
+                                  viewBox="0 0 512 512"
+                                  width="1em"
                                 >
-                                  <svg
-                                    aria-hidden="true"
-                                    fill="currentColor"
-                                    height="1em"
-                                    role="img"
-                                    style="vertical-align: -0.125em;"
-                                    viewBox="0 0 512 512"
-                                    width="1em"
-                                  >
-                                    <path
-                                      d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"
-                                    />
-                                  </svg>
-                                </span>
-                                <input
-                                  aria-label="Search input"
-                                  class="pf-c-search-input__text-input"
-                                  placeholder="Type the class name here"
-                                  value=""
-                                />
+                                  <path
+                                    d="M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"
+                                  />
+                                </svg>
                               </span>
-                              
-                            </div>
+                              <input
+                                aria-label="Search input"
+                                class="pf-c-text-input-group__text-input"
+                                placeholder="Type the class name here"
+                                type="text"
+                                value=""
+                              />
+                            </span>
                           </div>
+                          
                         </div>
                       </div>
                       <div
diff --git a/packages/import-java-classes-component/src/components/ImportJavaClasses/ImportJavaClassesWizardFirstStep.tsx b/packages/import-java-classes-component/src/components/ImportJavaClasses/ImportJavaClassesWizardFirstStep.tsx
index 6dd7b6d36e..9a5b8294e5 100644
--- a/packages/import-java-classes-component/src/components/ImportJavaClasses/ImportJavaClassesWizardFirstStep.tsx
+++ b/packages/import-java-classes-component/src/components/ImportJavaClasses/ImportJavaClassesWizardFirstStep.tsx
@@ -80,7 +80,7 @@ export const ImportJavaClassesWizardFirstStep = ({
   );
 
   const handleSearchValueChange = useCallback(
-    (value: string) => {
+    (event: React.FormEvent<HTMLInputElement>, value: string) => {
       setSearchValue(value);
       /* Managing debounce effect */
       if (requestTimer) {
diff --git a/packages/kie-bc-editors/package.json b/packages/kie-bc-editors/package.json
index 7958139442..c6f40e0131 100644
--- a/packages/kie-bc-editors/package.json
+++ b/packages/kie-bc-editors/package.json
@@ -35,7 +35,7 @@
     "@kie-tools-core/vscode-java-code-completion": "workspace:*",
     "@kie-tools-core/workspace": "workspace:*",
     "@kie-tools/pmml-editor-marshaller": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
+    "@patternfly/react-core": "^4.276.6",
     "react": "^17.0.2",
     "react-dom": "^17.0.2"
   },
diff --git a/packages/kn-plugin-workflow/package.json b/packages/kn-plugin-workflow/package.json
index eff9bb7a37..b8ef033a1c 100644
--- a/packages/kn-plugin-workflow/package.json
+++ b/packages/kn-plugin-workflow/package.json
@@ -29,7 +29,7 @@
     "build:win32": "pnpm setup:env:win32 make build-win32-amd64",
     "debug:clean": "rimraf debug",
     "go:test": "rimraf dist-tests && mkdir dist-tests && go test -v ./... | tee ./dist-tests/go-test-output.txt",
-    "go:test:report": "go run github.com/jstemmer/go-junit-report/v2 -in ./dist-tests/go-test-output.txt -out ./dist-tests/junit-report.xml",
+    "go:test:report": "go run github.com/jstemmer/go-junit-report/v2 -set-exit-code -in ./dist-tests/go-test-output.txt -out ./dist-tests/junit-report.xml",
     "install": "go mod tidy",
     "powershell": "@powershell -NoProfile -ExecutionPolicy Unrestricted -Command",
     "setup:env": "cross-env QUARKUS_PLATFORM_GROUP_ID=$(build-env knPluginWorkflow.quarkusPlatformGroupId) QUARKUS_VERSION=$(build-env knPluginWorkflow.quarkusVersion) PLUGIN_VERSION=$(build-env knPluginWorkflow.version)",
diff --git a/packages/online-editor/package.json b/packages/online-editor/package.json
index 4812c434f7..59b241bcc4 100644
--- a/packages/online-editor/package.json
+++ b/packages/online-editor/package.json
@@ -53,9 +53,9 @@
     "@kie-tools/unitables-dmn": "workspace:*",
     "@octokit/plugin-rest-endpoint-methods": "^5.0.1",
     "@octokit/rest": "^18.5.3",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
-    "@patternfly/react-tokens": "^4.33.1",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
+    "@patternfly/react-tokens": "^4.94.6",
     "bowser": "^2.10.0",
     "buffer": "^6.0.3",
     "history": "^4.9.0",
diff --git a/packages/online-editor/src/aboutModal/AboutButton.tsx b/packages/online-editor/src/aboutModal/AboutButton.tsx
index 9979a64855..e475349e30 100644
--- a/packages/online-editor/src/aboutModal/AboutButton.tsx
+++ b/packages/online-editor/src/aboutModal/AboutButton.tsx
@@ -76,6 +76,7 @@ export const AboutButton: React.FunctionComponent = () => {
         }
         variant={ModalVariant.large}
         isOpen={isModalOpen}
+        aria-label="About Modal"
         aria-describedby="modal-title-icon-description"
         onClose={handleModalToggle}
       >
diff --git a/packages/online-editor/src/dmnRunnerInputs/DmnRunnerInputsDispatchContext.tsx b/packages/online-editor/src/dmnRunnerInputs/DmnRunnerInputsDispatchContext.tsx
index 519b9dbbc1..4ee103b011 100644
--- a/packages/online-editor/src/dmnRunnerInputs/DmnRunnerInputsDispatchContext.tsx
+++ b/packages/online-editor/src/dmnRunnerInputs/DmnRunnerInputsDispatchContext.tsx
@@ -15,17 +15,13 @@
  */
 
 import { createContext, useContext } from "react";
-import { InputRow } from "@kie-tools/form-dmn";
 import { DmnRunnerInputsService } from "./DmnRunnerInputsService";
 import { WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
 
 interface DmnInputsDispatchContextType {
   dmnRunnerInputsService: DmnRunnerInputsService;
   deletePersistedInputRows: (workspaceFile: WorkspaceFile) => void;
-  updatePersistedInputRows: (
-    workspaceFile: WorkspaceFile,
-    newInputRows: Array<InputRow> | ((previous: Array<InputRow>) => Array<InputRow>)
-  ) => void;
+  updatePersistedInputRows: (workspaceId: string, workspaceFileRelativePath: string, newInputRows: string) => void;
   getInputRowsForDownload: (workspaceFile: WorkspaceFile) => Promise<Blob | undefined>;
   uploadInputRows: (workspaceFile: WorkspaceFile, file: File) => void;
 }
diff --git a/packages/online-editor/src/dmnRunnerInputs/DmnRunnerInputsDispatchContextProvider.tsx b/packages/online-editor/src/dmnRunnerInputs/DmnRunnerInputsDispatchContextProvider.tsx
index cd0a7ad80c..4063711f92 100644
--- a/packages/online-editor/src/dmnRunnerInputs/DmnRunnerInputsDispatchContextProvider.tsx
+++ b/packages/online-editor/src/dmnRunnerInputs/DmnRunnerInputsDispatchContextProvider.tsx
@@ -18,7 +18,6 @@ import * as React from "react";
 import { useCallback, useMemo } from "react";
 import { WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
 import { DmnRunnerInputsService } from "./DmnRunnerInputsService";
-import { InputRow } from "@kie-tools/form-dmn";
 import { DmnRunnerInputsDispatchContext } from "./DmnRunnerInputsDispatchContext";
 import { decoder } from "@kie-tools-core/workspaces-git-fs/dist/encoderdecoder/EncoderDecoder";
 import { useSyncedCompanionFs } from "../companionFs/CompanionFsHooks";
@@ -32,28 +31,8 @@ export function DmnRunnerInputsDispatchContextProvider(props: React.PropsWithChi
   useSyncedCompanionFs(dmnRunnerInputsService.companionFsService);
 
   const updatePersistedInputRows = useCallback(
-    async (
-      workspaceFile: WorkspaceFile,
-      newInputRows: Array<InputRow> | ((previous: Array<InputRow>) => Array<InputRow>)
-    ) => {
-      if (typeof newInputRows === "function") {
-        const inputs = await dmnRunnerInputsService.companionFsService.get({
-          workspaceId: workspaceFile.workspaceId,
-          workspaceFileRelativePath: workspaceFile.relativePath,
-        });
-
-        const content = await inputs?.getFileContents();
-        const previousInputRows = dmnRunnerInputsService.parseDmnRunnerInputs(decoder.decode(content));
-        await dmnRunnerInputsService.companionFsService.update(
-          { workspaceId: workspaceFile.workspaceId, workspaceFileRelativePath: workspaceFile.relativePath },
-          dmnRunnerInputsService.stringifyDmnRunnerInputs(newInputRows, previousInputRows)
-        );
-      } else {
-        await dmnRunnerInputsService.companionFsService.update(
-          { workspaceId: workspaceFile.workspaceId, workspaceFileRelativePath: workspaceFile.relativePath },
-          dmnRunnerInputsService.stringifyDmnRunnerInputs(newInputRows)
-        );
-      }
+    async (workspaceId: string, workspaceFileRelativePath: string, newInputRows: string) => {
+      await dmnRunnerInputsService.companionFsService.update({ workspaceId, workspaceFileRelativePath }, newInputRows);
     },
     [dmnRunnerInputsService]
   );
diff --git a/packages/online-editor/src/dmnRunnerInputs/DmnRunnerInputsHook.tsx b/packages/online-editor/src/dmnRunnerInputs/DmnRunnerInputsHook.tsx
index 4665fef5ec..27931112f8 100644
--- a/packages/online-editor/src/dmnRunnerInputs/DmnRunnerInputsHook.tsx
+++ b/packages/online-editor/src/dmnRunnerInputs/DmnRunnerInputsHook.tsx
@@ -32,10 +32,9 @@ interface DmnRunnerInputs {
 
 export function useDmnRunnerInputs(workspaceFile: WorkspaceFile): DmnRunnerInputs {
   const { dmnRunnerInputsService, updatePersistedInputRows } = useDmnRunnerInputsDispatch();
-
   const [inputRows, setInputRows] = useState<Array<InputRow>>(EMPTY_DMN_RUNNER_INPUTS);
-  const lastInputRows = useRef<string>(JSON.stringify(EMPTY_DMN_RUNNER_INPUTS));
   const previousInputRows = usePreviousRef(inputRows);
+  const previousInputRowsStringfied = useRef<string>(JSON.stringify(EMPTY_DMN_RUNNER_INPUTS));
 
   // TODO: Use useCompanionFsFile for keeping the `inputRows` up to date with updates made to it.
   //   I.e. When the DMN Runner Inputs file is changed
@@ -67,12 +66,12 @@ export function useDmnRunnerInputs(workspaceFile: WorkspaceFile): DmnRunnerInput
             companionEvent.type === "CFSF_DELETE"
           ) {
             // Triggered by the tab
-            if (companionEvent.content === lastInputRows.current) {
+            if (companionEvent.content === previousInputRowsStringfied.current) {
               setInputRows(dmnRunnerInputsService.parseDmnRunnerInputs(companionEvent.content));
               return;
             }
             // Triggered by the other tab
-            lastInputRows.current = companionEvent.content;
+            previousInputRowsStringfied.current = companionEvent.content;
             setInputRows(dmnRunnerInputsService.parseDmnRunnerInputs(companionEvent.content));
           }
         };
@@ -114,7 +113,7 @@ export function useDmnRunnerInputs(workspaceFile: WorkspaceFile): DmnRunnerInput
                 return;
               }
               const inputRows = decoder.decode(content);
-              lastInputRows.current = inputRows;
+              previousInputRowsStringfied.current = inputRows;
               setInputRows(dmnRunnerInputsService.parseDmnRunnerInputs(inputRows));
             });
           });
@@ -132,22 +131,27 @@ export function useDmnRunnerInputs(workspaceFile: WorkspaceFile): DmnRunnerInput
       }
 
       // After a re-render the callback is called by the first time, this avoids a filesystem unnecessary re-update
-      if (
-        lastInputRows.current ===
-        dmnRunnerInputsService.stringifyDmnRunnerInputs(newInputRows, previousInputRows.current)
-      ) {
+      const stringfiedDmnRunnerInputs = dmnRunnerInputsService.stringifyDmnRunnerInputs(
+        newInputRows,
+        previousInputRows.current
+      );
+
+      if (previousInputRowsStringfied.current === stringfiedDmnRunnerInputs) {
         return;
       }
 
       timeout.current = window.setTimeout(() => {
-        updatePersistedInputRows(workspaceFile, newInputRows);
-        lastInputRows.current = dmnRunnerInputsService.stringifyDmnRunnerInputs(
-          newInputRows,
-          previousInputRows.current
-        );
+        updatePersistedInputRows(workspaceFile.workspaceId, workspaceFile.relativePath, stringfiedDmnRunnerInputs);
+        previousInputRowsStringfied.current = stringfiedDmnRunnerInputs;
       }, 400);
     },
-    [previousInputRows, updatePersistedInputRows, workspaceFile, dmnRunnerInputsService]
+    [
+      previousInputRows,
+      updatePersistedInputRows,
+      workspaceFile.workspaceId,
+      workspaceFile.relativePath,
+      dmnRunnerInputsService,
+    ]
   );
 
   return {
diff --git a/packages/online-editor/src/dmnRunnerInputs/DmnRunnerInputsService.tsx b/packages/online-editor/src/dmnRunnerInputs/DmnRunnerInputsService.tsx
index c1d938a66d..48d71328bb 100644
--- a/packages/online-editor/src/dmnRunnerInputs/DmnRunnerInputsService.tsx
+++ b/packages/online-editor/src/dmnRunnerInputs/DmnRunnerInputsService.tsx
@@ -36,6 +36,10 @@ export class DmnRunnerInputsService {
   }
 
   public parseDmnRunnerInputs(inputs: string): Array<InputRow> {
-    return JSON.parse(inputs) as Array<InputRow>;
+    const parsedDmnRunnerInputs = JSON.parse(inputs);
+    if (Array.isArray(parsedDmnRunnerInputs)) {
+      return parsedDmnRunnerInputs.map((e) => (e === null ? {} : e));
+    }
+    return [{}];
   }
 }
diff --git a/packages/online-editor/src/editor/DmnRunner/DmnRunnerDockToggle.tsx b/packages/online-editor/src/editor/DmnRunner/DmnRunnerDockToggle.tsx
index 232fb7c618..366b8882ae 100644
--- a/packages/online-editor/src/editor/DmnRunner/DmnRunnerDockToggle.tsx
+++ b/packages/online-editor/src/editor/DmnRunner/DmnRunnerDockToggle.tsx
@@ -40,7 +40,11 @@ export function DmnRunnerDockToggle(props: Props) {
         isDisabled={props.isDisabled}
         buttonId={PanelId.DMN_RUNNER_TABLE}
         isSelected={props.isSelected}
-        onChange={() => props.onChange(PanelId.DMN_RUNNER_TABLE)}
+        onChange={() => {
+          if (!props.isDisabled) {
+            props.onChange(PanelId.DMN_RUNNER_TABLE);
+          }
+        }}
         text={
           <div style={{ display: "flex" }}>
             <div style={{ paddingRight: "5px", width: "30px" }}>
diff --git a/packages/online-editor/src/editor/DmnRunner/DmnRunnerDrawerPanelContent.tsx b/packages/online-editor/src/editor/DmnRunner/DmnRunnerDrawerPanelContent.tsx
index 80dc2ebf16..e4d04cb587 100644
--- a/packages/online-editor/src/editor/DmnRunner/DmnRunnerDrawerPanelContent.tsx
+++ b/packages/online-editor/src/editor/DmnRunner/DmnRunnerDrawerPanelContent.tsx
@@ -65,7 +65,6 @@ interface Props {
 }
 
 const DMN_RUNNER_MIN_WIDTH_TO_ROW_DIRECTION = 711;
-const AUTO_SAVE_DELAY = 500;
 
 interface DmnRunnerStylesConfig {
   contentWidth: "50%" | "100%";
@@ -77,9 +76,10 @@ interface DmnRunnerStylesConfig {
 export function DmnRunnerDrawerPanelContent(props: Props) {
   const extendedServices = useExtendedServices();
   const { i18n, locale } = useOnlineI18n();
-  const formRef = useRef<HTMLFormElement>(null);
+  const [formRef, setFormRef] = useState<HTMLFormElement | null>();
   const dmnRunnerState = useDmnRunnerState();
-  const dmnRunnerDispatch = useDmnRunnerDispatch();
+  const { preparePayload, setError, setExpanded, setInputRows, setCurrentInputRowIndex, setMode } =
+    useDmnRunnerDispatch();
   const [drawerError, setDrawerError] = useState<boolean>(false);
   const errorBoundaryRef = useRef<ErrorBoundary>(null);
   const [dmnRunnerResults, setDmnRunnerResults] = useState<DecisionResult[]>();
@@ -91,6 +91,10 @@ export function DmnRunnerDrawerPanelContent(props: Props) {
     buttonPosition: ButtonPosition.OUTPUT,
   });
 
+  const formInputs: InputRow = useMemo(() => {
+    return dmnRunnerState.inputRows[dmnRunnerState.currentInputRowIndex];
+  }, [dmnRunnerState.inputRows, dmnRunnerState.currentInputRowIndex]);
+
   const onResize = useCallback((width: number) => {
     // FIXME: PatternFly bug. The first interaction without resizing the splitter will result in width === 0.
     if (width === 0) {
@@ -117,7 +121,7 @@ export function DmnRunnerDrawerPanelContent(props: Props) {
   const setExecutionNotifications = useCallback(
     (result: DmnResult) => {
       const decisionNameByDecisionId = result.decisionResults?.reduce(
-        (acc, decisionResult) => acc.set(decisionResult.decisionId, decisionResult.decisionName),
+        (acc: Map<string, string>, decisionResult) => acc.set(decisionResult.decisionId, decisionResult.decisionName),
         new Map<string, string>()
       );
 
@@ -154,14 +158,14 @@ export function DmnRunnerDrawerPanelContent(props: Props) {
       }
 
       try {
-        const payload = await dmnRunnerDispatch.preparePayload(formInputs);
+        const payload = await preparePayload(formInputs);
         const result = await extendedServices.client.result(payload);
         if (canceled.get()) {
           return;
         }
 
         if (Object.hasOwnProperty.call(result, "details") && Object.hasOwnProperty.call(result, "stack")) {
-          dmnRunnerDispatch.setError(true);
+          setError(true);
           return;
         }
 
@@ -180,7 +184,7 @@ export function DmnRunnerDrawerPanelContent(props: Props) {
         setDmnRunnerResults(undefined);
       }
     },
-    [extendedServices.client, dmnRunnerState.status, dmnRunnerDispatch, setExecutionNotifications]
+    [extendedServices.client, dmnRunnerState.status, preparePayload, setError, setExecutionNotifications]
   );
 
   // Update outputs column on form change
@@ -188,16 +192,10 @@ export function DmnRunnerDrawerPanelContent(props: Props) {
     useCallback(
       ({ canceled }) => {
         if (dmnRunnerState.isExpanded && dmnRunnerState.mode === DmnRunnerMode.FORM) {
-          updateDmnRunnerResults(dmnRunnerState.inputRows[dmnRunnerState.currentInputRowIndex] ?? {}, canceled);
+          updateDmnRunnerResults(formInputs ?? {}, canceled);
         }
       },
-      [
-        dmnRunnerState.inputRows,
-        dmnRunnerState.currentInputRowIndex,
-        updateDmnRunnerResults,
-        dmnRunnerState.isExpanded,
-        dmnRunnerState.mode,
-      ]
+      [formInputs, updateDmnRunnerResults, dmnRunnerState.isExpanded, dmnRunnerState.mode]
     )
   );
 
@@ -207,26 +205,17 @@ export function DmnRunnerDrawerPanelContent(props: Props) {
       ({ canceled }) => {
         if (dmnRunnerState.error) {
           // if there is an error generating the form, the last form data is submitted
-          updateDmnRunnerResults(dmnRunnerState.inputRows[dmnRunnerState.currentInputRowIndex] ?? {}, canceled);
+          updateDmnRunnerResults(formInputs ?? {}, canceled);
         } else if (previousFormError) {
           setTimeout(() => {
-            formRef.current?.submit();
-            Object.keys(dmnRunnerState.inputRows[dmnRunnerState.currentInputRowIndex] ?? {}).forEach((propertyName) => {
-              formRef.current?.change(
-                propertyName,
-                dmnRunnerState.inputRows[dmnRunnerState.currentInputRowIndex]?.[propertyName]
-              );
+            formRef?.submit();
+            Object.keys(formInputs ?? {}).forEach((propertyName) => {
+              formRef?.change(propertyName, formInputs?.[propertyName]);
             });
           }, 0);
         }
       },
-      [
-        dmnRunnerState.error,
-        dmnRunnerState.inputRows,
-        dmnRunnerState.currentInputRowIndex,
-        updateDmnRunnerResults,
-        previousFormError,
-      ]
+      [formRef, dmnRunnerState.error, formInputs, updateDmnRunnerResults, previousFormError]
     )
   );
 
@@ -277,14 +266,20 @@ export function DmnRunnerDrawerPanelContent(props: Props) {
   }, [dmnRunnerState.jsonSchema]);
 
   const setFormInputs = useCallback(
-    (newFormData) => {
-      dmnRunnerDispatch.setInputRows((previousData: Array<InputRow>) => {
-        const newData = [...previousData];
-        newData[dmnRunnerState.currentInputRowIndex] = newFormData;
+    (newFormInputs) => {
+      setInputRows((currentInputRows: Array<InputRow>) => {
+        const newData = [...currentInputRows];
+        if (typeof newFormInputs === "function") {
+          newData[dmnRunnerState.currentInputRowIndex] = newFormInputs(
+            currentInputRows[dmnRunnerState.currentInputRowIndex]
+          );
+        } else {
+          newData[dmnRunnerState.currentInputRowIndex] = newFormInputs;
+        }
         return newData;
       });
     },
-    [dmnRunnerState.currentInputRowIndex, dmnRunnerDispatch.setInputRows]
+    [dmnRunnerState.currentInputRowIndex, setInputRows]
   );
 
   const [selectedRow, selectRow] = useState<string>("");
@@ -302,32 +297,28 @@ export function DmnRunnerDrawerPanelContent(props: Props) {
           key={rowIndex}
           onClick={() => {
             selectRow(`Row ${rowIndex + 1}`);
-            dmnRunnerDispatch.setCurrentInputRowIndex(rowIndex);
+            setCurrentInputRowIndex(rowIndex);
           }}
         >
           Row {rowIndex + 1}
         </DropdownItem>
       )),
-    [dmnRunnerState.inputRows, dmnRunnerDispatch]
+    [dmnRunnerState.inputRows, setCurrentInputRowIndex]
   );
 
-  const formInputs = useMemo(() => {
-    return dmnRunnerState.inputRows[dmnRunnerState.currentInputRowIndex];
-  }, [dmnRunnerState.inputRows, dmnRunnerState.currentInputRowIndex]);
-
   const onAddNewRow = useCallback(() => {
-    dmnRunnerDispatch.setInputRows((previousData: Array<InputRow>) => {
+    setInputRows((previousData: Array<InputRow>) => {
       const newData = [...previousData, {}];
-      dmnRunnerDispatch.setCurrentInputRowIndex(newData.length - 1);
+      setCurrentInputRowIndex(newData.length - 1);
       selectRow(`Row ${newData.length}`);
       return newData;
     });
-  }, [dmnRunnerDispatch]);
+  }, [setInputRows, setCurrentInputRowIndex]);
 
   const onChangeToTableView = useCallback(() => {
-    dmnRunnerDispatch.setMode(DmnRunnerMode.TABLE);
+    setMode(DmnRunnerMode.TABLE);
     props.editorPageDock?.toggle(PanelId.DMN_RUNNER_TABLE);
-  }, [dmnRunnerDispatch, props.editorPageDock]);
+  }, [setMode, props.editorPageDock]);
 
   return (
     <DrawerPanelContent
@@ -426,7 +417,7 @@ export function DmnRunnerDrawerPanelContent(props: Props) {
                       </FlexItem>
                     </Flex>
                     {dmnRunnerStylesConfig.buttonPosition === ButtonPosition.INPUT && (
-                      <DrawerCloseButton onClick={() => dmnRunnerDispatch.setExpanded(false)} />
+                      <DrawerCloseButton onClick={() => setExpanded(false)} />
                     )}
                   </PageSection>
                   <div className={"kogito--editor__dmn-runner-drawer-content-body"}>
@@ -436,13 +427,12 @@ export function DmnRunnerDrawerPanelContent(props: Props) {
                         formInputs={formInputs}
                         setFormInputs={setFormInputs}
                         formError={dmnRunnerState.error}
-                        setFormError={dmnRunnerDispatch.setError}
+                        setFormError={setError}
                         formSchema={dmnRunnerState.jsonSchema}
                         id={"form"}
-                        formRef={formRef}
+                        setFormRef={setFormRef}
                         showInlineError={true}
                         autoSave={true}
-                        autoSaveDelay={AUTO_SAVE_DELAY}
                         placeholder={true}
                         errorsField={() => <></>}
                         submitField={() => <></>}
@@ -467,7 +457,7 @@ export function DmnRunnerDrawerPanelContent(props: Props) {
                       <Text component={"h3"}>{i18n.terms.outputs}</Text>
                     </TextContent>
                     {dmnRunnerStylesConfig.buttonPosition === ButtonPosition.OUTPUT && (
-                      <DrawerCloseButton onClick={() => dmnRunnerDispatch.setExpanded(false)} />
+                      <DrawerCloseButton onClick={() => setExpanded(false)} />
                     )}
                   </PageSection>
                   <div
diff --git a/packages/online-editor/src/editor/EditorPage.tsx b/packages/online-editor/src/editor/EditorPage.tsx
index 10fd3e26d1..60c8a43a61 100644
--- a/packages/online-editor/src/editor/EditorPage.tsx
+++ b/packages/online-editor/src/editor/EditorPage.tsx
@@ -394,7 +394,7 @@ export function EditorPage(props: Props) {
               <Page>
                 <EditorToolbar workspaceFile={file.workspaceFile} editor={editor} editorPageDock={editorPageDock} />
                 <Divider />
-                <PageSection hasOverflowScroll={true} padding={{ default: "noPadding" }}>
+                <PageSection hasOverflowScroll={true} padding={{ default: "noPadding" }} aria-label="Editor section">
                   <DmnRunnerDrawer workspaceFile={file.workspaceFile} editorPageDock={editorPageDock}>
                     <EditorPageDockDrawer ref={editorPageDockRef} workspaceFile={file.workspaceFile}>
                       {embeddedEditorFile && (
diff --git a/packages/online-editor/src/editor/EditorPageDockDrawer.tsx b/packages/online-editor/src/editor/EditorPageDockDrawer.tsx
index c6ec3682f7..c4f12684b1 100644
--- a/packages/online-editor/src/editor/EditorPageDockDrawer.tsx
+++ b/packages/online-editor/src/editor/EditorPageDockDrawer.tsx
@@ -150,6 +150,34 @@ export const EditorPageDockDrawer = React.forwardRef<
     [dmnRunnerState.mode, props.workspaceFile.extension]
   );
 
+  const toggleGroupItems = useMemo(() => {
+    const items = [];
+
+    if (isDmnTableMode) {
+      items.push(
+        <DmnRunnerDockToggle
+          key="dmn-runner-toggle-item"
+          isDisabled={dockIsDisabled}
+          disabledReason={dockIsDisabledReason}
+          isSelected={panel === PanelId.DMN_RUNNER_TABLE}
+          onChange={(id) => onToggle(id)}
+        />
+      );
+    }
+    items.push(
+      <NotificationsPanelDockToggle
+        key="notifications-toggle-item"
+        isDisabled={dockIsDisabled}
+        disabledReason={dockIsDisabledReason}
+        ref={notificationsToggleRef}
+        isSelected={panel === PanelId.NOTIFICATIONS_PANEL}
+        onChange={(id) => onToggle(id)}
+      />
+    );
+
+    return items;
+  }, [isDmnTableMode, dockIsDisabled, panel, dockIsDisabledReason, onToggle, notificationsToggleRef]);
+
   useEffect(() => {
     if (
       (extendedServices.status === KieSandboxExtendedServicesStatus.STOPPED ||
@@ -193,23 +221,7 @@ export const EditorPageDockDrawer = React.forwardRef<
           justifyContent: "flex-end",
         }}
       >
-        <ToggleGroup>
-          {isDmnTableMode && (
-            <DmnRunnerDockToggle
-              isDisabled={dockIsDisabled}
-              disabledReason={dockIsDisabledReason}
-              isSelected={panel === PanelId.DMN_RUNNER_TABLE}
-              onChange={(id) => onToggle(id)}
-            />
-          )}
-          <NotificationsPanelDockToggle
-            isDisabled={dockIsDisabled}
-            disabledReason={dockIsDisabledReason}
-            ref={notificationsToggleRef}
-            isSelected={panel === PanelId.NOTIFICATIONS_PANEL}
-            onChange={(id) => onToggle(id)}
-          />
-        </ToggleGroup>
+        <ToggleGroup>{toggleGroupItems}</ToggleGroup>
       </div>
     </>
   );
diff --git a/packages/online-editor/src/editor/KieSandboxExtendedServices/KieSandboxExtendedServicesButtons.tsx b/packages/online-editor/src/editor/KieSandboxExtendedServices/KieSandboxExtendedServicesButtons.tsx
index 6b81668ab0..68e7e4ee28 100644
--- a/packages/online-editor/src/editor/KieSandboxExtendedServices/KieSandboxExtendedServicesButtons.tsx
+++ b/packages/online-editor/src/editor/KieSandboxExtendedServices/KieSandboxExtendedServicesButtons.tsx
@@ -207,7 +207,10 @@ export function KieSandboxExtendedServicesButtons(props: Props) {
               <Divider />
               <DropdownItem component={"button"} style={{ padding: "4px" }}>
                 <DeleteDropdownWithConfirmation
-                  onDelete={() => dmnRunnerInputsDispatch.deletePersistedInputRows(props.workspaceFile)}
+                  onDelete={() => {
+                    dmnRunnerDispatch.setCurrentInputRowIndex(0);
+                    dmnRunnerInputsDispatch.deletePersistedInputRows(props.workspaceFile);
+                  }}
                   item={`Delete DMN Runner inputs`}
                   label={" Delete inputs"}
                   isHoverable={false}
diff --git a/packages/online-editor/src/home/HomePage.tsx b/packages/online-editor/src/home/HomePage.tsx
index c19782dbb0..c10e8f328e 100644
--- a/packages/online-editor/src/home/HomePage.tsx
+++ b/packages/online-editor/src/home/HomePage.tsx
@@ -123,7 +123,13 @@ export function HomePage() {
 
   return (
     <OnlineEditorPage>
-      <PageSection isFilled={false} sticky={"top"} hasOverflowScroll={false} style={{ overflowX: "scroll" }}>
+      <PageSection
+        isFilled={false}
+        sticky={"top"}
+        hasOverflowScroll={false}
+        style={{ overflowX: "scroll" }}
+        aria-label="New Models Section"
+      >
         <Grid hasGutter style={{ minWidth: "1280px", gridGap: "var(--pf-c-page__main-section--PaddingTop)" }}>
           <GridItem span={6}>
             <PageSection variant={"light"} isFilled={true} style={{ height: "100%" }}>
@@ -176,7 +182,7 @@ export function HomePage() {
           </GridItem>
         </Grid>
       </PageSection>
-      <PageSection isFilled={true} variant={"light"} hasOverflowScroll={true}>
+      <PageSection isFilled={true} variant={"light"} hasOverflowScroll={true} aria-label="Workspace Section">
         <PromiseStateWrapper
           promise={workspaceDescriptorsPromise}
           rejected={(e) => <>Error fetching workspaces: {e + ""}</>}
diff --git a/packages/online-editor/src/pageTemplate/OnlineEditorPage.tsx b/packages/online-editor/src/pageTemplate/OnlineEditorPage.tsx
index e3c93d2ae9..3c6f5d2753 100644
--- a/packages/online-editor/src/pageTemplate/OnlineEditorPage.tsx
+++ b/packages/online-editor/src/pageTemplate/OnlineEditorPage.tsx
@@ -27,7 +27,8 @@ import { DevDeploymentsDropdown } from "../devDeployments/DevDeploymentsDropdown
 import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
 import { AccountsIcon } from "../accounts/AccountsIcon";
 import { AboutButton } from "../aboutModal/AboutButton";
-import { Divider } from "@patternfly/react-core/dist/js/components/Divider";
+import { MastheadContent, Toolbar, ToolbarContent } from "@patternfly/react-core";
+import { ToolbarGroup, ToolbarItem } from "@patternfly/react-core/dist/js/components/Toolbar";
 
 export function OnlineEditorPage(props: { children?: React.ReactNode }) {
   const history = useHistory();
@@ -36,7 +37,7 @@ export function OnlineEditorPage(props: { children?: React.ReactNode }) {
   return (
     <Page
       header={
-        <Masthead aria-label={"Page header"} display={{ default: "stack" }}>
+        <Masthead aria-label={"Page header"} display={{ default: "inline" }}>
           <MastheadMain style={{ justifyContent: "space-between" }}>
             <PageHeaderToolsItem className={"kie-sandbox--logo"}>
               <MastheadBrand
@@ -48,8 +49,10 @@ export function OnlineEditorPage(props: { children?: React.ReactNode }) {
                     <Brand
                       src={routes.static.images.kieHorizontalLogoReverse.path({})}
                       alt={"Logo"}
-                      style={{ display: "inline", height: "38px" }}
-                    />
+                      heights={{ default: "38px" }}
+                    >
+                      <source srcSet={routes.static.images.kieHorizontalLogoReverse.path({})} />
+                    </Brand>
                   </FlexItem>
                   <FlexItem style={{ display: "flex", alignItems: "center" }}>
                     <TextContent>
@@ -60,30 +63,28 @@ export function OnlineEditorPage(props: { children?: React.ReactNode }) {
               </MastheadBrand>
               <AboutButton />
             </PageHeaderToolsItem>
-            <Flex justifyContent={{ default: "justifyContentFlexEnd" }} flexWrap={{ default: "nowrap" }}>
-              <FlexItem>
-                <PageHeaderToolsItem>
-                  <DevDeploymentsDropdown />
-                </PageHeaderToolsItem>
-              </FlexItem>
-              <Divider isVertical={true} inset={{ default: "insetMd" }} />
-              <FlexItem>
-                <PageHeaderToolsItem>
-                  <KieSandboxExtendedServicesIcon />
-                </PageHeaderToolsItem>
-              </FlexItem>
-              <FlexItem>
-                <PageHeaderToolsItem>
-                  <SettingsButton />
-                </PageHeaderToolsItem>
-              </FlexItem>
-              <FlexItem>
-                <PageHeaderToolsItem>
-                  <AccountsIcon />
-                </PageHeaderToolsItem>
-              </FlexItem>
-            </Flex>
           </MastheadMain>
+          <MastheadContent>
+            <Toolbar isStatic>
+              <ToolbarContent>
+                <ToolbarGroup alignment={{ default: "alignRight" }} spacer={{ default: "spacerNone", md: "spacerMd" }}>
+                  <ToolbarItem>
+                    <DevDeploymentsDropdown />
+                  </ToolbarItem>
+                  <ToolbarItem variant="separator" />
+                  <ToolbarItem>
+                    <KieSandboxExtendedServicesIcon />
+                  </ToolbarItem>
+                  <ToolbarItem>
+                    <SettingsButton />
+                  </ToolbarItem>
+                  <ToolbarItem>
+                    <AccountsIcon />
+                  </ToolbarItem>
+                </ToolbarGroup>
+              </ToolbarContent>
+            </Toolbar>
+          </MastheadContent>
         </Masthead>
       }
     >
diff --git a/packages/pmml-editor-marshaller/src/marshaller/Marshaller.ts b/packages/pmml-editor-marshaller/src/marshaller/Marshaller.ts
index efade51e36..7a4904a073 100644
--- a/packages/pmml-editor-marshaller/src/marshaller/Marshaller.ts
+++ b/packages/pmml-editor-marshaller/src/marshaller/Marshaller.ts
@@ -38,7 +38,7 @@ import { textModelFactory } from "./jsonata/json2ui/TextModel";
 import { timeSeriesModelFactory } from "./jsonata/json2ui/TimeSeriesModel";
 import { treeModelFactory } from "./jsonata/json2ui/TreeModel";
 import { UI2JSON_TRANSFORMATION as ui2json } from "./jsonata/UI2JSON";
-import { CompoundPredicate, False, FieldName, PMML, SimplePredicate, True } from "./model/pmml4_4";
+import { CompoundPredicate, False, PMML, SimplePredicate, True } from "./model/pmml4_4";
 
 export function XML2PMML(xml: string): PMML {
   const doc: XMLJS.Element = XMLJS.xml2js(xml) as XMLJS.Element;
@@ -124,7 +124,7 @@ function singletonArray(value: any): any[] {
 }
 
 function json2uiSimplePredicateFactory(): SimplePredicate {
-  return new SimplePredicate({ field: "" as FieldName, operator: "equal" });
+  return new SimplePredicate({ field: "", operator: "equal" });
 }
 
 function json2uiCompoundPredicateFactory(): CompoundPredicate {
diff --git a/packages/pmml-editor-marshaller/src/marshaller/jsonata/json2ui/BaselineModel.ts b/packages/pmml-editor-marshaller/src/marshaller/jsonata/json2ui/BaselineModel.ts
index a797cf3fc2..6043a619eb 100644
--- a/packages/pmml-editor-marshaller/src/marshaller/jsonata/json2ui/BaselineModel.ts
+++ b/packages/pmml-editor-marshaller/src/marshaller/jsonata/json2ui/BaselineModel.ts
@@ -49,7 +49,7 @@ elements.elements[(name = "BaselineModel")] ~> $map(function($v, $i) {
 export function baselineModelFactory(): BaselineModel {
   return new BaselineModel({
     MiningSchema: new MiningSchema({ MiningField: [] }),
-    TestDistributions: new TestDistributions({ Baseline: {}, field: {}, testStatistic: "CUSUM" }),
+    TestDistributions: new TestDistributions({ Baseline: {}, field: "", testStatistic: "CUSUM" }),
     functionName: "regression",
   });
 }
diff --git a/packages/pmml-editor-marshaller/src/marshaller/jsonata/json2ui/NaiveBayesModel.ts b/packages/pmml-editor-marshaller/src/marshaller/jsonata/json2ui/NaiveBayesModel.ts
index f70edb42b9..36077637d0 100644
--- a/packages/pmml-editor-marshaller/src/marshaller/jsonata/json2ui/NaiveBayesModel.ts
+++ b/packages/pmml-editor-marshaller/src/marshaller/jsonata/json2ui/NaiveBayesModel.ts
@@ -52,7 +52,7 @@ export function naiveBayesModelFactory(): NaiveBayesModel {
   return new NaiveBayesModel({
     MiningSchema: new MiningSchema({ MiningField: [] }),
     BayesInputs: { BayesInput: [] },
-    BayesOutput: { TargetValueCounts: { TargetValueCount: [] }, fieldName: {} },
+    BayesOutput: { TargetValueCounts: { TargetValueCount: [] }, fieldName: "" },
     threshold: 0,
     functionName: "regression",
   });
diff --git a/packages/pmml-editor-marshaller/src/marshaller/model/pmml4_4.ts b/packages/pmml-editor-marshaller/src/marshaller/model/pmml4_4.ts
index b1dfd2c243..267f0208cc 100644
--- a/packages/pmml-editor-marshaller/src/marshaller/model/pmml4_4.ts
+++ b/packages/pmml-editor-marshaller/src/marshaller/model/pmml4_4.ts
@@ -30,9 +30,9 @@ export class Expression extends PMMLObject {
 
 export class Aggregate extends Expression {
   Extension?: Extension[];
-  field: FieldName;
+  field: string;
   function: Function;
-  groupField?: FieldName;
+  groupField?: string;
   sqlWhere?: string;
 
   constructor(data: Aggregate) {
@@ -57,7 +57,7 @@ export class Annotation extends PMMLObject {
 export class Anova extends PMMLObject {
   Extension?: Extension[];
   AnovaRow: AnovaRow[];
-  target?: FieldName;
+  target?: string;
 
   constructor(data: Anova) {
     super(data);
@@ -197,7 +197,7 @@ export class BinarySimilarity extends Similarity {
 
 export class BlockIndicator extends PMMLObject {
   Extension?: Extension[];
-  field: FieldName;
+  field: string;
 
   constructor(data: BlockIndicator) {
     super(data);
@@ -495,7 +495,7 @@ export class DataField extends Field<DataField> {
   Extension?: Extension[];
   Interval?: Interval[];
   Value?: Value[];
-  name: FieldName;
+  name: string;
   displayName?: string;
   optype: OpType;
   dataType: DataType;
@@ -570,7 +570,7 @@ export class DerivedField extends Field<DerivedField> {
   expression?: Expression;
   Interval?: Interval[];
   Value?: Value[];
-  name?: FieldName;
+  name?: string;
   displayName?: string;
   optype: OpType;
   dataType: DataType;
@@ -610,7 +610,7 @@ export class DiscreteDistribution extends Distribution {
 export class Discretize extends Expression {
   Extension?: Extension[];
   DiscretizeBin?: DiscretizeBin[];
-  field: FieldName;
+  field: string;
   mapMissingTo?: any;
   defaultValue?: any;
   dataType?: DataType;
@@ -686,7 +686,7 @@ export class False extends Predicate {
 
 export class FieldColumnPair extends PMMLObject {
   Extension?: Extension[];
-  field: FieldName;
+  field: string;
   column: string;
 
   constructor(data: FieldColumnPair) {
@@ -696,18 +696,9 @@ export class FieldColumnPair extends PMMLObject {
     this.column = data.column;
   }
 }
-
-export class FieldName {
-  value?: string;
-
-  constructor(data: FieldName) {
-    this.value = data.value;
-  }
-}
-
 export class FieldRef extends Expression {
   Extension?: Extension[];
-  field: FieldName;
+  field: string;
   mapMissingTo?: string;
 
   constructor(data: FieldRef) {
@@ -811,7 +802,7 @@ export class Jaccard extends Similarity {
 export class Lag extends Expression {
   Extension?: Extension[];
   BlockIndicator?: BlockIndicator[];
-  field: FieldName;
+  field: string;
   n?: number;
   aggregate?: string;
 
@@ -955,7 +946,7 @@ export class MiningBuildTask extends PMMLObject {
 
 export class MiningField extends PMMLObject {
   Extension?: Extension[];
-  name: FieldName;
+  name: string;
   usageType?: UsageType;
   optype?: OpType;
   importance?: number;
@@ -1126,7 +1117,7 @@ export class NormContinuous extends Expression {
   Extension?: Extension[];
   LinearNorm: LinearNorm[];
   mapMissingTo?: number;
-  field: FieldName;
+  field: string;
   outliers?: OutlierTreatmentMethod;
 
   constructor(data: NormContinuous) {
@@ -1141,7 +1132,7 @@ export class NormContinuous extends Expression {
 
 export class NormDiscrete extends Expression {
   Extension?: Extension[];
-  field: FieldName;
+  field: string;
   method?: Method;
   value: any;
   mapMissingTo?: number;
@@ -1206,12 +1197,12 @@ export class OutputField extends Field<OutputField> {
   Decisions?: Decisions;
   expression?: Expression;
   Value?: Value[];
-  name: FieldName;
+  name: string;
   displayName?: string;
   optype?: OpType;
   dataType: DataType;
-  targetField?: FieldName;
-  "x-reportField"?: FieldName;
+  targetField?: string;
+  "x-reportField"?: string;
   feature?: ResultFeature;
   value?: any;
   ruleFeature?: RuleFeature;
@@ -1274,7 +1265,7 @@ export class PMML extends PMMLObject {
 export interface PMMLFunctions {}
 
 export class ParameterField extends Field<ParameterField> {
-  name: FieldName;
+  name: string;
   optype?: OpType;
   dataType?: DataType;
   displayName?: string;
@@ -1308,7 +1299,7 @@ export class PartitionFieldStats extends PMMLObject {
   Counts?: Counts;
   NumericInfo?: NumericInfo;
   Array?: Array[];
-  field: FieldName;
+  field: string;
   weighted?: PartitionFieldStatsWeighted;
 
   constructor(data: PartitionFieldStats) {
@@ -1338,7 +1329,7 @@ export class PredictiveModelQuality extends PMMLObject {
   ConfusionMatrix?: ConfusionMatrix;
   LiftData?: LiftData[];
   ROC?: ROC;
-  targetField: FieldName;
+  targetField: string;
   dataName?: string;
   dataUsage?: DataUsage;
   meanError?: number;
@@ -1461,7 +1452,7 @@ export class RealSparseArray extends SparseArray<number> {
 
 export class ResultField extends Field<ResultField> {
   Extension?: Extension[];
-  name: FieldName;
+  name: string;
   displayName?: string;
   optype?: OpType;
   dataType?: DataType;
@@ -1517,7 +1508,7 @@ export class SimpleMatching extends Similarity {
 
 export class SimplePredicate extends Predicate {
   Extension?: Extension[];
-  field: FieldName;
+  field: string;
   operator: SimplePredicateOperator;
   value?: any;
 
@@ -1533,7 +1524,7 @@ export class SimplePredicate extends Predicate {
 export class SimpleSetPredicate extends Predicate {
   Extension?: Extension[];
   Array: Array;
-  field: FieldName;
+  field: string;
   booleanOperator: SimpleSetPredicate$BooleanOperator;
 
   constructor(data: SimpleSetPredicate) {
@@ -1577,7 +1568,7 @@ export class Tanimoto extends Similarity {
 export class Target extends PMMLObject {
   Extension?: Extension[];
   TargetValue?: TargetValue[];
-  field?: FieldName;
+  field?: string;
   optype?: OpType;
   castInteger?: CastInteger;
   min?: number;
@@ -1646,7 +1637,7 @@ export class TextIndex extends Expression {
   Extension?: Extension[];
   TextIndexNormalization?: TextIndexNormalization[];
   expression?: Expression;
-  textField: FieldName;
+  textField: string;
   localTermWeights?: TextIndexLocalTermWeights;
   isCaseSensitive?: boolean;
   maxLevenshteinDistance?: number;
@@ -1749,7 +1740,7 @@ export class UnivariateStats extends PMMLObject {
   DiscrStats?: DiscrStats;
   ContStats?: ContStats;
   Anova?: Anova;
-  field?: FieldName;
+  field?: string;
   weighted?: UnivariateStatsWeighted;
 
   constructor(data: UnivariateStats) {
@@ -1782,7 +1773,7 @@ export class Value extends PMMLObject {
 
 export class VerificationField extends PMMLObject {
   Extension?: Extension[];
-  field: FieldName;
+  field: string;
   column?: string;
   precision?: number;
   zeroThreshold?: number;
@@ -1958,7 +1949,7 @@ export class Item extends PMMLObject {
   Extension?: Extension[];
   id: string;
   value: string;
-  field?: FieldName;
+  field?: string;
   category?: string;
   mappedValue?: string;
   weight?: number;
@@ -2081,7 +2072,7 @@ export class FieldValue extends PMMLObject {
   Extension?: Extension[];
   FieldValue?: FieldValue[];
   FieldValueCount?: FieldValueCount[];
-  field: FieldName;
+  field: string;
   value: any;
 
   constructor(data: FieldValue) {
@@ -2096,7 +2087,7 @@ export class FieldValue extends PMMLObject {
 
 export class FieldValueCount extends PMMLObject {
   Extension?: Extension[];
-  field: FieldName;
+  field: string;
   value: any;
   count: number;
 
@@ -2113,11 +2104,11 @@ export class TestDistributions extends PMMLObject {
   Extension?: Extension[];
   Baseline: Baseline;
   Alternate?: Alternate;
-  field: FieldName;
+  field: string;
   testStatistic: TestStatistic;
   resetValue?: number;
   windowSize?: number;
-  weightField?: FieldName;
+  weightField?: string;
   normalizationScheme?: string;
 
   constructor(data: TestDistributions) {
@@ -2220,7 +2211,7 @@ export class ContinuousNode extends PMMLObject {
   Extension?: Extension[];
   DerivedField?: DerivedField[];
   content?: PMMLObject[];
-  name: FieldName;
+  name: string;
   count?: number;
 
   constructor(data: ContinuousNode) {
@@ -2252,7 +2243,7 @@ export class DiscreteNode extends PMMLObject {
   Extension?: Extension[];
   DerivedField?: DerivedField[];
   content?: PMMLObject[];
-  name: FieldName;
+  name: string;
   count?: number;
 
   constructor(data: DiscreteNode) {
@@ -2315,7 +2306,7 @@ export class NormalDistribution extends PMMLObject {
 
 export class ParentValue extends PMMLObject {
   Extension?: Extension[];
-  parent: FieldName;
+  parent: string;
   value: any;
 
   constructor(data: ParentValue) {
@@ -2424,7 +2415,7 @@ export class Cluster extends Entity<string> {
 export class ClusteringField extends ComparisonField<ClusteringField> {
   Extension?: Extension[];
   Comparisons?: Comparisons;
-  field: FieldName;
+  field: string;
   isCenterField?: CenterField;
   fieldWeight?: number;
   similarityScale?: number;
@@ -2786,7 +2777,7 @@ export class GeneralRegressionModel extends Model {
   EventValues?: EventValues;
   BaseCumHazardTables?: BaseCumHazardTables;
   ModelVerification?: ModelVerification;
-  targetVariableName?: FieldName;
+  targetVariableName?: string;
   modelType: GeneralRegressionModelType;
   modelName?: string;
   functionName: MiningFunction;
@@ -2795,18 +2786,18 @@ export class GeneralRegressionModel extends Model {
   cumulativeLink?: CumulativeLinkFunction;
   linkFunction?: LinkFunction;
   linkParameter?: number;
-  trialsVariable?: FieldName;
+  trialsVariable?: string;
   trialsValue?: number;
   distribution?: GeneralRegressionModelDistribution;
   distParameter?: number;
-  offsetVariable?: FieldName;
+  offsetVariable?: string;
   offsetValue?: number;
   modelDF?: number;
-  endTimeVariable?: FieldName;
-  startTimeVariable?: FieldName;
-  subjectIDVariable?: FieldName;
-  statusVariable?: FieldName;
-  baselineStrataVariable?: FieldName;
+  endTimeVariable?: string;
+  startTimeVariable?: string;
+  subjectIDVariable?: string;
+  statusVariable?: string;
+  baselineStrataVariable?: string;
   isScorable?: boolean;
   "x-mathContext"?: MathContext;
 
@@ -2914,7 +2905,7 @@ export class PCovMatrix extends PMMLObject {
 export class PPCell extends ParameterCell {
   Extension?: Extension[];
   value: any;
-  predictorName: FieldName;
+  predictorName: string;
   parameterName: string;
   targetCategory?: any;
 
@@ -2980,7 +2971,7 @@ export class Predictor extends PMMLObject {
   Extension?: Extension[];
   Categories?: Categories;
   Matrix?: Matrix;
-  name: FieldName;
+  name: string;
   contrastMatrixType?: string;
 
   constructor(data: Predictor) {
@@ -3070,7 +3061,7 @@ export class Segmentation extends PMMLObject {
 
 export class VariableWeight extends PMMLObject {
   Extension?: Extension[];
-  field: FieldName;
+  field: string;
 
   constructor(data: VariableWeight) {
     super(data);
@@ -3084,7 +3075,7 @@ export class BayesInput extends PMMLObject {
   TargetValueStats?: TargetValueStats;
   DerivedField?: DerivedField;
   PairCounts?: PairCounts[];
-  fieldName: FieldName;
+  fieldName: string;
 
   constructor(data: BayesInput) {
     super(data);
@@ -3110,7 +3101,7 @@ export class BayesInputs extends PMMLObject {
 export class BayesOutput extends PMMLObject {
   Extension?: Extension[];
   TargetValueCounts: TargetValueCounts;
-  fieldName: FieldName;
+  fieldName: string;
 
   constructor(data: BayesOutput) {
     super(data);
@@ -3222,7 +3213,7 @@ export class TargetValueStats extends PMMLObject {
 
 export class InstanceField extends PMMLObject {
   Extension?: Extension[];
-  field: FieldName;
+  field: string;
   column?: string;
 
   constructor(data: InstanceField) {
@@ -3246,7 +3237,7 @@ export class InstanceFields extends PMMLObject {
 
 export class KNNInput extends ComparisonField<KNNInput> {
   Extension?: Extension[];
-  field: FieldName;
+  field: string;
   fieldWeight?: number;
   compareFunction?: CompareFunction;
 
@@ -3288,7 +3279,7 @@ export class NearestNeighborModel extends Model {
   numberOfNeighbors: number;
   continuousScoringMethod?: ContinuousScoringMethod;
   categoricalScoringMethod?: CategoricalScoringMethod;
-  instanceIdVariable?: FieldName;
+  instanceIdVariable?: string;
   threshold?: number;
   isScorable?: boolean;
   "x-mathContext"?: MathContext;
@@ -3512,7 +3503,7 @@ export class Term extends PMMLObject {
 
 export class CategoricalPredictor extends Term {
   Extension?: Extension[];
-  name: FieldName;
+  name: string;
   value: any;
   coefficient: number;
 
@@ -3527,7 +3518,7 @@ export class CategoricalPredictor extends Term {
 
 export class NumericPredictor extends Term {
   Extension?: Extension[];
-  name: FieldName;
+  name: string;
   exponent?: number;
   coefficient: number;
 
@@ -3543,7 +3534,7 @@ export class NumericPredictor extends Term {
 export class PredictorTerm extends Term {
   Extension?: Extension[];
   FieldRef: FieldRef[];
-  name?: FieldName;
+  name?: string;
   coefficient: number;
 
   constructor(data: PredictorTerm) {
@@ -3598,7 +3589,7 @@ export class RegressionModel extends Model {
   functionName: MiningFunction;
   algorithmName?: string;
   modelType?: RegressionModelType;
-  targetFieldName?: FieldName;
+  targetFieldName?: string;
   normalizationMethod?: RegressionModelNormalizationMethod;
   isScorable?: boolean;
   "x-mathContext"?: MathContext;
@@ -4064,7 +4055,7 @@ export class SetPredicate extends PMMLObject {
   Extension?: Extension[];
   Array?: Array;
   id: string;
-  field: FieldName;
+  field: string;
   operator?: SetPredicateOperator;
 
   constructor(data: SetPredicate) {
@@ -4536,11 +4527,11 @@ export class DynamicRegressor extends PMMLObject {
   Numerator?: Numerator;
   Denominator?: Denominator;
   RegressorValues?: RegressorValues;
-  field: FieldName;
+  field: string;
   transformation?: string;
   delay?: number;
   futureValuesMethod?: string;
-  targetField?: FieldName;
+  targetField?: string;
 
   constructor(data: DynamicRegressor) {
     super(data);
@@ -5063,7 +5054,7 @@ export class TimeSeries extends PMMLObject {
   startTime?: number;
   endTime?: number;
   interpolationMethod?: InterpolationMethod;
-  field?: FieldName;
+  field?: string;
 
   constructor(data: TimeSeries) {
     super(data);
diff --git a/packages/pmml-editor-marshaller/tests/marshaller/DataDictionary.test.ts b/packages/pmml-editor-marshaller/tests/marshaller/DataDictionary.test.ts
index 8785467c83..8311a3ff20 100644
--- a/packages/pmml-editor-marshaller/tests/marshaller/DataDictionary.test.ts
+++ b/packages/pmml-editor-marshaller/tests/marshaller/DataDictionary.test.ts
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import { DataDictionary, DataField, FieldName, PMML, PMML2XML, XML2PMML } from "@kie-tools/pmml-editor-marshaller";
+import { DataDictionary, DataField, PMML, PMML2XML, XML2PMML } from "@kie-tools/pmml-editor-marshaller";
 
 describe("DataDictionary tests", () => {
   test("Empty", () => {
@@ -46,7 +46,7 @@ describe("DataDictionary tests", () => {
 
     const dataDictionary: DataDictionary = pmml.DataDictionary;
     const dataField: DataField = new DataField({
-      name: "field1" as FieldName,
+      name: "field1",
       dataType: "string",
       optype: "categorical",
     });
@@ -77,7 +77,7 @@ describe("DataDictionary tests", () => {
     expect(dataDictionary.DataField[0].optype).toBe("categorical");
     expect(dataDictionary.DataField[0].dataType).toBe("string");
 
-    dataDictionary.DataField[0].name = "field1-changed" as FieldName;
+    dataDictionary.DataField[0].name = "field1-changed";
     dataDictionary.DataField[0].optype = "continuous";
     dataDictionary.DataField[0].dataType = "integer";
 
diff --git a/packages/pmml-editor-marshaller/tests/marshaller/Scorecard.test.ts b/packages/pmml-editor-marshaller/tests/marshaller/Scorecard.test.ts
index e134643426..cb49aae909 100644
--- a/packages/pmml-editor-marshaller/tests/marshaller/Scorecard.test.ts
+++ b/packages/pmml-editor-marshaller/tests/marshaller/Scorecard.test.ts
@@ -21,7 +21,6 @@ import {
   CompoundPredicate,
   DataDictionary,
   False,
-  FieldName,
   MiningField,
   Model,
   Output,
@@ -195,22 +194,22 @@ describe("Scorecard tests", () => {
     const characteristic1Attributes: Attribute[] = characteristics[1].Attribute as Attribute[];
 
     assertSimplePredicate(characteristic0Attributes[0].predicate, {
-      field: "input1" as FieldName,
+      field: "input1",
       operator: "lessOrEqual",
       value: "10",
     });
     assertSimplePredicate(characteristic0Attributes[1].predicate, {
-      field: "input1" as FieldName,
+      field: "input1",
       operator: "greaterThan",
       value: "10",
     });
     assertSimplePredicate(characteristic1Attributes[0].predicate, {
-      field: "input2" as FieldName,
+      field: "input2",
       operator: "lessOrEqual",
       value: "-5",
     });
     assertSimplePredicate(characteristic1Attributes[1].predicate, {
-      field: "input2" as FieldName,
+      field: "input2",
       operator: "greaterThan",
       value: "-5",
     });
@@ -224,7 +223,7 @@ describe("Scorecard tests", () => {
     const characteristic0Attributes: Attribute[] = characteristics[0].Attribute as Attribute[];
 
     assertSimplePredicate(characteristic0Attributes[0].predicate, {
-      field: "input1" as FieldName,
+      field: "input1",
       operator: "lessOrEqual",
       value: "10",
     });
@@ -277,14 +276,14 @@ describe("Scorecard tests", () => {
     assertCompoundPredicate(characteristic0Attributes[0].predicate, { booleanOperator: "and" }, [
       (predicate: Predicate) => {
         assertSimplePredicate(predicate, {
-          field: "input1" as FieldName,
+          field: "input1",
           operator: "lessOrEqual",
           value: "-5",
         });
       },
       (predicate: Predicate) => {
         assertSimplePredicate(predicate, {
-          field: "input2" as FieldName,
+          field: "input2",
           operator: "lessOrEqual",
           value: "-5",
         });
@@ -295,14 +294,14 @@ describe("Scorecard tests", () => {
     assertCompoundPredicate(characteristic0Attributes[1].predicate, { booleanOperator: "and" }, [
       (predicate: Predicate) => {
         assertSimplePredicate(predicate, {
-          field: "input1" as FieldName,
+          field: "input1",
           operator: "greaterThan",
           value: "-5",
         });
       },
       (predicate: Predicate) => {
         assertSimplePredicate(predicate, {
-          field: "input2" as FieldName,
+          field: "input2",
           operator: "greaterThan",
           value: "-5",
         });
@@ -318,14 +317,14 @@ describe("Scorecard tests", () => {
     assertCompoundPredicate(characteristic1Attributes[0].predicate, { booleanOperator: "or" }, [
       (predicate: Predicate) => {
         assertSimplePredicate(predicate, {
-          field: "input3" as FieldName,
+          field: "input3",
           operator: "equal",
           value: "classA",
         });
       },
       (predicate: Predicate) => {
         assertSimplePredicate(predicate, {
-          field: "input4" as FieldName,
+          field: "input4",
           operator: "equal",
           value: "classA",
         });
@@ -336,14 +335,14 @@ describe("Scorecard tests", () => {
     assertCompoundPredicate(characteristic1Attributes[1].predicate, { booleanOperator: "or" }, [
       (predicate: Predicate) => {
         assertSimplePredicate(predicate, {
-          field: "input3" as FieldName,
+          field: "input3",
           operator: "equal",
           value: "classB",
         });
       },
       (predicate: Predicate) => {
         assertSimplePredicate(predicate, {
-          field: "input4" as FieldName,
+          field: "input4",
           operator: "equal",
           value: "classB",
         });
@@ -358,14 +357,14 @@ describe("Scorecard tests", () => {
     assertCompoundPredicate(characteristic2Attributes[0].predicate, { booleanOperator: "xor" }, [
       (predicate: Predicate) => {
         assertSimplePredicate(predicate, {
-          field: "input3" as FieldName,
+          field: "input3",
           operator: "equal",
           value: "classA",
         });
       },
       (predicate: Predicate) => {
         assertSimplePredicate(predicate, {
-          field: "input4" as FieldName,
+          field: "input4",
           operator: "equal",
           value: "classA",
         });
@@ -412,14 +411,14 @@ describe("Scorecard tests", () => {
           },
           (cp: Predicate) => {
             assertSimplePredicate(cp, {
-              field: "input1" as FieldName,
+              field: "input1",
               operator: "greaterThan",
               value: "-15",
             });
           },
           (cp: Predicate) => {
             assertSimplePredicate(cp, {
-              field: "input1" as FieldName,
+              field: "input1",
               operator: "lessOrEqual",
               value: "25.4",
             });
@@ -428,7 +427,7 @@ describe("Scorecard tests", () => {
       },
       (predicate: Predicate) => {
         assertSimplePredicate(predicate, {
-          field: "input2" as FieldName,
+          field: "input2",
           operator: "notEqual",
           value: "classA",
         });
@@ -443,14 +442,14 @@ describe("Scorecard tests", () => {
     assertCompoundPredicate(characteristic1Attributes[0].predicate, { booleanOperator: "or" }, [
       (predicate: Predicate) => {
         assertSimplePredicate(predicate, {
-          field: "input1" as FieldName,
+          field: "input1",
           operator: "lessOrEqual",
           value: "-20",
         });
       },
       (predicate: Predicate) => {
         assertSimplePredicate(predicate, {
-          field: "input2" as FieldName,
+          field: "input2",
           operator: "equal",
           value: "classA",
         });
@@ -465,14 +464,14 @@ describe("Scorecard tests", () => {
             assertCompoundPredicate(cp, { booleanOperator: "and" }, [
               (cp2: Predicate) => {
                 assertSimplePredicate(cp2, {
-                  field: "input1" as FieldName,
+                  field: "input1",
                   operator: "greaterOrEqual",
                   value: "5",
                 });
               },
               (cp2: Predicate) => {
                 assertSimplePredicate(cp2, {
-                  field: "input1" as FieldName,
+                  field: "input1",
                   operator: "lessThan",
                   value: "12",
                 });
@@ -481,7 +480,7 @@ describe("Scorecard tests", () => {
           },
           (cp: Predicate) => {
             assertSimplePredicate(cp, {
-              field: "input2" as FieldName,
+              field: "input2",
               operator: "equal",
               value: "classB",
             });
@@ -490,7 +489,7 @@ describe("Scorecard tests", () => {
       },
       (predicate: Predicate) => {
         assertSimplePredicate(predicate, {
-          field: "input2" as FieldName,
+          field: "input2",
           operator: "equal",
           value: "classC",
         });
@@ -624,13 +623,13 @@ describe("Scorecard tests", () => {
     expect(Object.getPrototypeOf(miningSchema)).toBe(Object.prototype);
     expect(Object.getPrototypeOf(miningFields)).toBe(Array.prototype);
     expect(Object.getPrototypeOf(miningFields[0])).toBe(Object.prototype);
-    miningFields.push({ name: "mf" as FieldName });
+    miningFields.push({ name: "mf" });
     expect(Object.getPrototypeOf(miningFields[1])).toBe(Object.prototype);
 
     expect(Object.getPrototypeOf(output)).toBe(Object.prototype);
     expect(Object.getPrototypeOf(outputFields)).toBe(Array.prototype);
     expect(Object.getPrototypeOf(outputFields[0])).toBe(Object.prototype);
-    outputFields.push({ name: "mf" as FieldName, dataType: "string" });
+    outputFields.push({ name: "mf", dataType: "string" });
     expect(Object.getPrototypeOf(outputFields[1])).toBe(Object.prototype);
 
     expect(Object.getPrototypeOf(characteristics)).toBe(Object.prototype);
diff --git a/packages/pmml-editor/package.json b/packages/pmml-editor/package.json
index 5134d724fa..611bdead0c 100644
--- a/packages/pmml-editor/package.json
+++ b/packages/pmml-editor/package.json
@@ -39,9 +39,9 @@
     "@kie-tools-core/patternfly-base": "workspace:*",
     "@kie-tools-core/workspace": "workspace:*",
     "@kie-tools/pmml-editor-marshaller": "workspace:*",
-    "@patternfly/react-charts": "^6.15.23",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
+    "@patternfly/react-charts": "^6.94.18",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
     "@types/lodash": "^4.14.168",
     "@types/react-redux": "^7.1.16",
     "@types/react-transition-group": "^4.4.1",
diff --git a/packages/pmml-editor/src/editor/components/DataDictionary/DataDictionaryHandler/DataDictionaryHandler.tsx b/packages/pmml-editor/src/editor/components/DataDictionary/DataDictionaryHandler/DataDictionaryHandler.tsx
index 9eb468f1cc..0c990993ae 100644
--- a/packages/pmml-editor/src/editor/components/DataDictionary/DataDictionaryHandler/DataDictionaryHandler.tsx
+++ b/packages/pmml-editor/src/editor/components/DataDictionary/DataDictionaryHandler/DataDictionaryHandler.tsx
@@ -23,7 +23,7 @@ import { Modal, ModalVariant } from "@patternfly/react-core/dist/js/components/M
 import { Title, TitleSizes } from "@patternfly/react-core/dist/js/components/Title";
 import { CloseIcon } from "@patternfly/react-icons/dist/js/icons/close-icon";
 import { WarningTriangleIcon } from "@patternfly/react-icons/dist/js/icons/warning-triangle-icon";
-import { DataDictionary, FieldName, PMML } from "@kie-tools/pmml-editor-marshaller";
+import { DataDictionary, PMML } from "@kie-tools/pmml-editor-marshaller";
 import { Actions } from "../../../reducers";
 import DataDictionaryContainer, { DDDataField } from "../DataDictionaryContainer/DataDictionaryContainer";
 import { convertPMML2DD, convertToDataField } from "../dataDictionaryUtils";
@@ -95,7 +95,7 @@ const DataDictionaryHandler = () => {
       payload: {
         dataDictionaryIndex: index,
         dataField: convertToDataField(field),
-        originalName: originalName as FieldName,
+        originalName: originalName,
       },
     });
   };
diff --git a/packages/pmml-editor/src/editor/components/DataDictionary/dataDictionaryUtils.ts b/packages/pmml-editor/src/editor/components/DataDictionary/dataDictionaryUtils.ts
index 23d31c87e4..a5f0c2ce0f 100644
--- a/packages/pmml-editor/src/editor/components/DataDictionary/dataDictionaryUtils.ts
+++ b/packages/pmml-editor/src/editor/components/DataDictionary/dataDictionaryUtils.ts
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-import { Closure, DataDictionary, DataField, FieldName, Interval } from "@kie-tools/pmml-editor-marshaller";
+import { Closure, DataDictionary, DataField, Interval } from "@kie-tools/pmml-editor-marshaller";
 import { ConstraintType, DDDataField } from "./DataDictionaryContainer/DataDictionaryContainer";
 
 export const convertPMML2DD = (PMMLDataDictionary: DataDictionary | undefined): DDDataField[] => {
@@ -29,7 +29,7 @@ export const convertPMML2DD = (PMMLDataDictionary: DataDictionary | undefined):
 
 export const convertToDataField = (item: DDDataField): DataField => {
   const convertedField: DataField = {
-    name: item.name as FieldName,
+    name: item.name,
     dataType: item.type,
     optype: item.optype,
   };
diff --git a/packages/pmml-editor/src/editor/components/EditorCore/molecules/EditorHeader.tsx b/packages/pmml-editor/src/editor/components/EditorCore/molecules/EditorHeader.tsx
index 97a59d6ac2..7470ce24dd 100644
--- a/packages/pmml-editor/src/editor/components/EditorCore/molecules/EditorHeader.tsx
+++ b/packages/pmml-editor/src/editor/components/EditorCore/molecules/EditorHeader.tsx
@@ -18,7 +18,7 @@ import * as React from "react";
 import { Split, SplitItem } from "@patternfly/react-core/dist/js/layouts/Split";
 import DataDictionaryHandler from "../../DataDictionary/DataDictionaryHandler/DataDictionaryHandler";
 import { OutputsHandler } from "../../Outputs/organisms";
-import { FieldName, MiningSchema, Output, OutputField } from "@kie-tools/pmml-editor-marshaller";
+import { MiningSchema, Output, OutputField } from "@kie-tools/pmml-editor-marshaller";
 import MiningSchemaHandler from "../../MiningSchema/MiningSchemaHandler/MiningSchemaHandler";
 import "./EditorHeader.scss";
 
@@ -30,7 +30,7 @@ interface EditorHeaderViewerProps {
 interface EditorHeaderEditorProps extends EditorHeaderViewerProps {
   output?: Output;
   miningSchema?: MiningSchema;
-  validateOutputFieldName: (index: number | undefined, name: FieldName) => boolean;
+  validateOutputFieldName: (index: number | undefined, name: string) => boolean;
   deleteOutputField: (index: number) => void;
   commitOutputField: (index: number | undefined, outputField: OutputField) => void;
   commitModelName: (modelName: string) => void;
diff --git a/packages/pmml-editor/src/editor/components/EditorScorecard/organisms/PredicateConverter.ts b/packages/pmml-editor/src/editor/components/EditorScorecard/organisms/PredicateConverter.ts
index 51787a4c7a..e7461856f7 100644
--- a/packages/pmml-editor/src/editor/components/EditorScorecard/organisms/PredicateConverter.ts
+++ b/packages/pmml-editor/src/editor/components/EditorScorecard/organisms/PredicateConverter.ts
@@ -19,7 +19,6 @@ import {
   DataField,
   DataType,
   False,
-  FieldName,
   Predicate,
   SimplePredicate,
   SimplePredicateOperator,
@@ -39,15 +38,11 @@ const SimplePredicateOperatorMap: Map<SimplePredicateOperator, string> = new Map
 ]);
 
 export const toText = (predicate: Predicate | undefined, fields: DataField[]): string => {
-  const fieldToDataType: Map<FieldName, DataType> = new Map(fields.map((field) => [field.name, field.dataType]));
+  const fieldToDataType: Map<string, DataType> = new Map(fields.map((field) => [field.name, field.dataType]));
   return _toText(predicate, fieldToDataType, 0);
 };
 
-const _toText = (
-  predicate: Predicate | undefined,
-  fieldToDataType: Map<FieldName, DataType>,
-  nesting: number
-): string => {
+const _toText = (predicate: Predicate | undefined, fieldToDataType: Map<string, DataType>, nesting: number): string => {
   if (predicate instanceof True) {
     return "True";
   } else if (predicate instanceof False) {
@@ -87,13 +82,13 @@ const FalsePredicate = () => {
   return predicate;
 };
 
-const UnarySimplePredicate = (field: FieldName, operator: SimplePredicateOperator) => {
+const UnarySimplePredicate = (field: string, operator: SimplePredicateOperator) => {
   const predicate: SimplePredicate = new SimplePredicate({ field: field, operator: operator });
   (predicate as any)._type = "SimplePredicate";
   return predicate;
 };
 
-const BinarySimplePredicate = (field: FieldName, operator: SimplePredicateOperator, value: any) => {
+const BinarySimplePredicate = (field: string, operator: SimplePredicateOperator, value: any) => {
   const predicate: SimplePredicate = new SimplePredicate({ field: field, operator: operator, value: value });
   (predicate as any)._type = "SimplePredicate";
   return predicate;
@@ -109,7 +104,7 @@ const SimpleCompoundPredicate = (
   return predicate;
 };
 
-const _value = (field: FieldName, value: any, fieldToDataType: Map<FieldName, DataType>): string => {
+const _value = (field: string, value: any, fieldToDataType: Map<string, DataType>): string => {
   if (value === undefined) {
     return "";
   }
@@ -156,13 +151,13 @@ export const fromText = (text: string | undefined): Predicate | undefined => {
 
   const unaryMatches = regUnaryOperator.exec(text);
   if (unaryMatches !== null) {
-    return UnarySimplePredicate(unaryMatches[1] as FieldName, unaryMatches[2] as SimplePredicateOperator);
+    return UnarySimplePredicate(unaryMatches[1], unaryMatches[2] as SimplePredicateOperator);
   }
 
   const binaryMatches = regBinaryOperator.exec(text);
   if (binaryMatches !== null) {
     return BinarySimplePredicate(
-      binaryMatches[1] as FieldName,
+      binaryMatches[1],
       _operator(binaryMatches[2]) as SimplePredicateOperator,
       binaryMatches[3]
     );
diff --git a/packages/pmml-editor/src/editor/components/EditorScorecard/templates/ScorecardEditorPage.tsx b/packages/pmml-editor/src/editor/components/EditorScorecard/templates/ScorecardEditorPage.tsx
index e80682dc03..da9cdb6b37 100644
--- a/packages/pmml-editor/src/editor/components/EditorScorecard/templates/ScorecardEditorPage.tsx
+++ b/packages/pmml-editor/src/editor/components/EditorScorecard/templates/ScorecardEditorPage.tsx
@@ -19,7 +19,6 @@ import { PageSection, PageSectionVariants } from "@patternfly/react-core/dist/js
 import { EditorHeader } from "../../EditorCore/molecules";
 import {
   Characteristics,
-  FieldName,
   MiningSchema,
   Model,
   Output,
@@ -61,7 +60,7 @@ export const ScorecardEditorPage = (props: ScorecardEditorPageProps) => {
   const output: Output | undefined = useMemo(() => model?.Output, [model]);
 
   const validateOutputName = useCallback(
-    (index: number | undefined, name: FieldName): boolean => {
+    (index: number | undefined, name: string): boolean => {
       if (name.toString().trim().length === 0) {
         return false;
       }
diff --git a/packages/pmml-editor/src/editor/components/LinearRegressionViewer/molecules/LinearRegressionViewAdaptor.tsx b/packages/pmml-editor/src/editor/components/LinearRegressionViewer/molecules/LinearRegressionViewAdaptor.tsx
index 402da87db2..6fe66b9a6f 100644
--- a/packages/pmml-editor/src/editor/components/LinearRegressionViewer/molecules/LinearRegressionViewAdaptor.tsx
+++ b/packages/pmml-editor/src/editor/components/LinearRegressionViewer/molecules/LinearRegressionViewAdaptor.tsx
@@ -18,7 +18,6 @@ import {
   CategoricalPredictor,
   DataDictionary,
   DataField,
-  FieldName,
   Interval,
   MiningField,
   MiningSchema,
@@ -137,7 +136,7 @@ const getXRange = (dataDictionary: DataDictionary, numericPredictor: NumericPred
   return getIntervalsMaximumRange(predictorFieldIntervals);
 };
 
-const getMiningFieldIntervals = (dataDictionary: DataDictionary, fieldName: FieldName): Interval[] => {
+const getMiningFieldIntervals = (dataDictionary: DataDictionary, fieldName: string): Interval[] => {
   const dataFields: DataField[] = dataDictionary.DataField.filter(
     (df) => df.name === fieldName && df.optype === "continuous"
   );
diff --git a/packages/pmml-editor/src/editor/components/MiningSchema/MiningSchemaContainer/MiningSchemaContainer.tsx b/packages/pmml-editor/src/editor/components/MiningSchema/MiningSchemaContainer/MiningSchemaContainer.tsx
index f1803a273c..f3fc1cfc9d 100644
--- a/packages/pmml-editor/src/editor/components/MiningSchema/MiningSchemaContainer/MiningSchemaContainer.tsx
+++ b/packages/pmml-editor/src/editor/components/MiningSchema/MiningSchemaContainer/MiningSchemaContainer.tsx
@@ -28,7 +28,7 @@ import MiningSchemaAddFields from "../MiningSchemaAddFields/MiningSchemaAddField
 import MiningSchemaPropertiesEdit from "../MiningSchemaPropertiesEdit/MiningSchemaPropertiesEdit";
 import "./MiningSchemaContainer.scss";
 
-import { DataDictionary, FieldName, MiningField, MiningSchema } from "@kie-tools/pmml-editor-marshaller";
+import { DataDictionary, MiningField, MiningSchema } from "@kie-tools/pmml-editor-marshaller";
 import { useValidationRegistry } from "../../../validation";
 import { Builder } from "../../../paths";
 import { Interaction } from "../../../types";
@@ -40,7 +40,7 @@ interface MiningSchemaContainerProps {
   miningSchema?: MiningSchema;
   onAddField: (name: string[]) => void;
   onDeleteField: (index: number) => void;
-  onUpdateField: (index: number, originalName: FieldName | undefined, field: MiningField) => void;
+  onUpdateField: (index: number, originalName: string | undefined, field: MiningField) => void;
 }
 
 const MiningSchemaContainer = (props: MiningSchemaContainerProps) => {
diff --git a/packages/pmml-editor/src/editor/components/MiningSchema/MiningSchemaFields/MiningSchemaFields.tsx b/packages/pmml-editor/src/editor/components/MiningSchema/MiningSchemaFields/MiningSchemaFields.tsx
index 9cc193798a..1eaf32dbb2 100644
--- a/packages/pmml-editor/src/editor/components/MiningSchema/MiningSchemaFields/MiningSchemaFields.tsx
+++ b/packages/pmml-editor/src/editor/components/MiningSchema/MiningSchemaFields/MiningSchemaFields.tsx
@@ -140,7 +140,7 @@ const MiningSchemaItem: React.FC<MiningSchemaFieldProps> = (props) => {
           data-ouia-component-id={field.name}
           data-ouia-component-type="edit-mining-field-row-"
           className={`editable-item ${editing === index ? "editable-item--editing" : ""}`}
-          key={field.name.value}
+          key={field.name}
           ref={ref}
           tabIndex={0}
           onKeyDown={(event) => {
@@ -175,7 +175,7 @@ const MiningSchemaItem: React.FC<MiningSchemaFieldProps> = (props) => {
           data-ouia-component-id={field.name}
           data-ouia-component-type="mining-field-row"
           className={`editable-item ${editing === index ? "editable-item--editing" : ""}`}
-          key={field.name.value}
+          key={field.name}
           onClick={(event) => handleEdit(event)}
           ref={ref}
           tabIndex={0}
diff --git a/packages/pmml-editor/src/editor/components/MiningSchema/MiningSchemaHandler/MiningSchemaHandler.tsx b/packages/pmml-editor/src/editor/components/MiningSchema/MiningSchemaHandler/MiningSchemaHandler.tsx
index b9dcea0934..60c9ffa945 100644
--- a/packages/pmml-editor/src/editor/components/MiningSchema/MiningSchemaHandler/MiningSchemaHandler.tsx
+++ b/packages/pmml-editor/src/editor/components/MiningSchema/MiningSchemaHandler/MiningSchemaHandler.tsx
@@ -23,7 +23,7 @@ import { Title, TitleSizes } from "@patternfly/react-core/dist/js/components/Tit
 import { CloseIcon } from "@patternfly/react-icons/dist/js/icons/close-icon";
 import { WarningTriangleIcon } from "@patternfly/react-icons/dist/js/icons/warning-triangle-icon";
 import MiningSchemaContainer from "../MiningSchemaContainer/MiningSchemaContainer";
-import { DataDictionary, FieldName, MiningField, MiningSchema, PMML } from "@kie-tools/pmml-editor-marshaller";
+import { DataDictionary, MiningField, MiningSchema, PMML } from "@kie-tools/pmml-editor-marshaller";
 import { useSelector } from "react-redux";
 import { Actions } from "../../../reducers";
 import { useBatchDispatch, useHistoryService } from "../../../history";
@@ -68,7 +68,7 @@ const MiningSchemaHandler = (props: MiningSchemaHandlerProps) => {
     // }
   };
 
-  const updateField = (index: number, originalName: FieldName | undefined, field: MiningField) => {
+  const updateField = (index: number, originalName: string | undefined, field: MiningField) => {
     dispatch({
       type: Actions.UpdateMiningSchemaField,
       payload: {
diff --git a/packages/pmml-editor/src/editor/components/Outputs/atoms/OutputLabels.tsx b/packages/pmml-editor/src/editor/components/Outputs/atoms/OutputLabels.tsx
index bb719b48a9..8febf72f6a 100644
--- a/packages/pmml-editor/src/editor/components/Outputs/atoms/OutputLabels.tsx
+++ b/packages/pmml-editor/src/editor/components/Outputs/atoms/OutputLabels.tsx
@@ -14,14 +14,14 @@
  * limitations under the License.
  */
 import * as React from "react";
-import { FieldName, OpType, RankOrder, ResultFeature } from "@kie-tools/pmml-editor-marshaller";
+import { OpType, RankOrder, ResultFeature } from "@kie-tools/pmml-editor-marshaller";
 import { OutputFieldLabel } from "./OutputFieldLabel";
 import { ValidationEntry } from "../../../validation";
 import { ValidationIndicatorLabel } from "../../EditorCore/atoms";
 
 interface OutputLabelsProps {
   optype: OpType | undefined;
-  targetField: FieldName | undefined;
+  targetField: string | undefined;
   targetFieldValidation: ValidationEntry[];
   feature: ResultFeature | undefined;
   value: any | undefined;
diff --git a/packages/pmml-editor/src/editor/components/Outputs/atoms/OutputLabelsEditMode.tsx b/packages/pmml-editor/src/editor/components/Outputs/atoms/OutputLabelsEditMode.tsx
index 65bafe553d..5451bf6a08 100644
--- a/packages/pmml-editor/src/editor/components/Outputs/atoms/OutputLabelsEditMode.tsx
+++ b/packages/pmml-editor/src/editor/components/Outputs/atoms/OutputLabelsEditMode.tsx
@@ -16,7 +16,7 @@
 import * as React from "react";
 import { CSSProperties } from "react";
 import { Label } from "@patternfly/react-core/dist/js/components/Label";
-import { FieldName, OpType, OutputField, RankOrder, ResultFeature } from "@kie-tools/pmml-editor-marshaller";
+import { OpType, OutputField, RankOrder, ResultFeature } from "@kie-tools/pmml-editor-marshaller";
 import { ArrowAltCircleRightIcon } from "@patternfly/react-icons/dist/js/icons/arrow-alt-circle-right-icon";
 import { OutputFieldLabel } from "./OutputFieldLabel";
 import { ValidationEntry } from "../../../validation";
@@ -25,8 +25,8 @@ import { ValidationIndicatorLabel } from "../../EditorCore/atoms";
 interface OutputLabelsEditModeProps {
   optype: OpType | undefined;
   setOptype: (optype: OpType | undefined) => void;
-  targetField: FieldName | undefined;
-  setTargetField: (targetField: FieldName | undefined) => void;
+  targetField: string | undefined;
+  setTargetField: (targetField: string | undefined) => void;
   targetFieldValidation: ValidationEntry[];
   feature: ResultFeature | undefined;
   setFeature: (feature: ResultFeature | undefined) => void;
diff --git a/packages/pmml-editor/src/editor/components/Outputs/molecules/OutputFieldEditRow.tsx b/packages/pmml-editor/src/editor/components/Outputs/molecules/OutputFieldEditRow.tsx
index 0d248d6cf9..176b5c0750 100644
--- a/packages/pmml-editor/src/editor/components/Outputs/molecules/OutputFieldEditRow.tsx
+++ b/packages/pmml-editor/src/editor/components/Outputs/molecules/OutputFieldEditRow.tsx
@@ -21,7 +21,7 @@ import { Split, SplitItem } from "@patternfly/react-core/dist/js/layouts/Split";
 import { FormGroup } from "@patternfly/react-core/dist/js/components/Form";
 import { Select, SelectOption, SelectVariant } from "@patternfly/react-core/dist/js/components/Select";
 import "./OutputFieldRow.scss";
-import { DataType, FieldName, OpType, OutputField, RankOrder, ResultFeature } from "@kie-tools/pmml-editor-marshaller";
+import { DataType, OpType, OutputField, RankOrder, ResultFeature } from "@kie-tools/pmml-editor-marshaller";
 import { OutputLabelsEditMode } from "../atoms";
 import { ExclamationCircleIcon } from "@patternfly/react-icons/dist/js/icons/exclamation-circle-icon";
 import { ValidatedType } from "../../../types";
@@ -34,7 +34,7 @@ interface OutputFieldEditRowProps {
   modelIndex: number;
   outputField: OutputField;
   outputFieldIndex: number;
-  validateOutputName: (name: FieldName) => boolean;
+  validateOutputName: (name: string) => boolean;
   viewExtendedProperties: () => void;
   onCommitAndClose: () => void;
   onCommit: (partial: Partial<OutputField>) => void;
@@ -75,10 +75,10 @@ const OutputFieldEditRow = (props: OutputFieldEditRowProps) => {
 
   const { activeOperation } = useOperation();
 
-  const [name, setName] = useState<ValidatedType<FieldName>>({ value: "" as FieldName, valid: false });
+  const [name, setName] = useState<ValidatedType<string>>({ value: "", valid: false });
   const [dataType, setDataType] = useState<DataType>("boolean");
   const [optype, setOptype] = useState<OpType | undefined>();
-  const [targetField, setTargetField] = useState<FieldName | undefined>();
+  const [targetField, setTargetField] = useState<string | undefined>();
   const [feature, setFeature] = useState<ResultFeature | undefined>();
   const [value, setValue] = useState<any | undefined>();
   const [rank, setRank] = useState<number | undefined>();
@@ -166,14 +166,14 @@ const OutputFieldEditRow = (props: OutputFieldEditRowProps) => {
                   autoFocus={true}
                   onChange={(e) => {
                     setName({
-                      value: e as FieldName,
-                      valid: validateOutputName(e as FieldName),
+                      value: e,
+                      valid: validateOutputName(e),
                     });
                   }}
                   onBlur={(e) => {
                     if (name?.valid) {
                       onCommit({
-                        name: name.value as FieldName,
+                        name: name.value,
                       });
                     } else {
                       setName({
diff --git a/packages/pmml-editor/src/editor/components/Outputs/molecules/OutputFieldRow.tsx b/packages/pmml-editor/src/editor/components/Outputs/molecules/OutputFieldRow.tsx
index 4bd204907c..2242bec10e 100644
--- a/packages/pmml-editor/src/editor/components/Outputs/molecules/OutputFieldRow.tsx
+++ b/packages/pmml-editor/src/editor/components/Outputs/molecules/OutputFieldRow.tsx
@@ -18,7 +18,7 @@ import { BaseSyntheticEvent, useMemo } from "react";
 import { Flex, FlexItem } from "@patternfly/react-core/dist/js/layouts/Flex";
 import { Split, SplitItem } from "@patternfly/react-core/dist/js/layouts/Split";
 import { Label } from "@patternfly/react-core/dist/js/components/Label";
-import { DataType, FieldName, OpType, OutputField, RankOrder, ResultFeature } from "@kie-tools/pmml-editor-marshaller";
+import { DataType, OpType, OutputField, RankOrder, ResultFeature } from "@kie-tools/pmml-editor-marshaller";
 import { OutputFieldRowAction, OutputLabels } from "../atoms";
 import "./OutputFieldRow.scss";
 import { ValidationIndicator } from "../../EditorCore/atoms";
@@ -35,10 +35,10 @@ interface OutputFieldRowProps {
 }
 
 interface Values {
-  name: FieldName | undefined;
+  name: string | undefined;
   dataType: DataType | undefined;
   optype?: OpType;
-  targetField?: FieldName;
+  targetField?: string;
   feature?: ResultFeature;
   value?: any;
   rank?: number;
diff --git a/packages/pmml-editor/src/editor/components/Outputs/organisms/OutputFieldExtendedProperties.tsx b/packages/pmml-editor/src/editor/components/Outputs/organisms/OutputFieldExtendedProperties.tsx
index 6c94cb22ea..a814768466 100644
--- a/packages/pmml-editor/src/editor/components/Outputs/organisms/OutputFieldExtendedProperties.tsx
+++ b/packages/pmml-editor/src/editor/components/Outputs/organisms/OutputFieldExtendedProperties.tsx
@@ -20,7 +20,7 @@ import { TextInput } from "@patternfly/react-core/dist/js/components/TextInput";
 import { Form, FormGroup } from "@patternfly/react-core/dist/js/components/Form";
 import { FormSelect, FormSelectOption } from "@patternfly/react-core/dist/js/components/FormSelect";
 import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
-import { FieldName, OpType, OutputField, RankOrder, ResultFeature } from "@kie-tools/pmml-editor-marshaller";
+import { OpType, OutputField, RankOrder, ResultFeature } from "@kie-tools/pmml-editor-marshaller";
 import { GenericSelector, GenericSelectorOption } from "../../EditorScorecard/atoms";
 import { HelpIcon } from "@patternfly/react-icons/dist/js/icons/help-icon";
 import { useValidationRegistry } from "../../../validation";
@@ -38,7 +38,7 @@ export const OutputFieldExtendedProperties = (props: OutputFieldExtendedProperti
   const { activeOutputField, activeOutputFieldIndex, modelIndex, targetFields, commit } = props;
 
   const [optype, setOptype] = useState<OpType | undefined>();
-  const [targetField, setTargetField] = useState<FieldName | undefined>();
+  const [targetField, setTargetField] = useState<string | undefined>();
   const [feature, setFeature] = useState<ResultFeature | undefined>();
   const [value, setValue] = useState<any | undefined>();
   const [rank, setRank] = useState<number | undefined>();
@@ -181,9 +181,9 @@ export const OutputFieldExtendedProperties = (props: OutputFieldExtendedProperti
           id="output-targetField"
           value={(targetField ?? "").toString()}
           onChange={(selection) => {
-            if (selection !== targetField?.value) {
-              setTargetField(selection === "" ? undefined : (selection as FieldName));
-              commit({ targetField: selection === "" ? undefined : (selection as FieldName) });
+            if (selection !== targetField) {
+              setTargetField(selection === "" ? undefined : selection);
+              commit({ targetField: selection === "" ? undefined : selection });
             }
           }}
           isDisabled={!targetFieldsOptions.length}
diff --git a/packages/pmml-editor/src/editor/components/Outputs/organisms/OutputFieldsTable.tsx b/packages/pmml-editor/src/editor/components/Outputs/organisms/OutputFieldsTable.tsx
index 586135a1d7..4d5781ff81 100644
--- a/packages/pmml-editor/src/editor/components/Outputs/organisms/OutputFieldsTable.tsx
+++ b/packages/pmml-editor/src/editor/components/Outputs/organisms/OutputFieldsTable.tsx
@@ -17,7 +17,7 @@ import * as React from "react";
 import { useEffect, useRef, useState } from "react";
 import { Form } from "@patternfly/react-core/dist/js/components/Form";
 import { Bullseye } from "@patternfly/react-core/dist/js/layouts/Bullseye";
-import { FieldName, OutputField } from "@kie-tools/pmml-editor-marshaller";
+import { OutputField } from "@kie-tools/pmml-editor-marshaller";
 import { Operation, useOperation } from "../../EditorScorecard";
 import { EmptyStateNoOutput } from "./EmptyStateNoOutput";
 import OutputFieldRow from "../molecules/OutputFieldRow";
@@ -30,7 +30,7 @@ interface OutputFieldsTableProps {
   outputs: OutputField[];
   selectedOutputIndex: number | undefined;
   setSelectedOutputIndex: (index: number | undefined) => void;
-  validateOutputFieldName: (index: number | undefined, name: FieldName) => boolean;
+  validateOutputFieldName: (index: number | undefined, name: string) => boolean;
   viewExtendedProperties: () => void;
   onAddOutputField: () => void;
   onDeleteOutputField: (index: number) => void;
@@ -110,7 +110,7 @@ const OutputFieldsTable = (props: OutputFieldsTableProps) => {
     }
   };
 
-  const onValidateOutputFieldName = (index: number | undefined, nameToValidate: FieldName): boolean => {
+  const onValidateOutputFieldName = (index: number | undefined, nameToValidate: string): boolean => {
     return validateOutputFieldName(index, nameToValidate);
   };
 
diff --git a/packages/pmml-editor/src/editor/components/Outputs/organisms/OutputsContainer.tsx b/packages/pmml-editor/src/editor/components/Outputs/organisms/OutputsContainer.tsx
index 6a00c42c00..7510b50b5a 100644
--- a/packages/pmml-editor/src/editor/components/Outputs/organisms/OutputsContainer.tsx
+++ b/packages/pmml-editor/src/editor/components/Outputs/organisms/OutputsContainer.tsx
@@ -26,7 +26,7 @@ import { Title } from "@patternfly/react-core/dist/js/components/Title";
 import { ArrowAltCircleLeftIcon } from "@patternfly/react-icons/dist/js/icons/arrow-alt-circle-left-icon";
 import { BoltIcon } from "@patternfly/react-icons/dist/js/icons/bolt-icon";
 import { PlusIcon } from "@patternfly/react-icons/dist/js/icons/plus-icon";
-import { FieldName, MiningSchema, Output, OutputField } from "@kie-tools/pmml-editor-marshaller";
+import { MiningSchema, Output, OutputField } from "@kie-tools/pmml-editor-marshaller";
 import { Actions } from "../../../reducers";
 import OutputFieldsTable from "./OutputFieldsTable";
 import OutputsBatchAdd from "./OutputsBatchAdd";
@@ -44,7 +44,7 @@ interface OutputsContainerProps {
   modelIndex: number;
   output?: Output;
   miningSchema?: MiningSchema;
-  validateOutputFieldName: (index: number | undefined, name: FieldName) => boolean;
+  validateOutputFieldName: (index: number | undefined, name: string) => boolean;
   deleteOutputField: (index: number) => void;
   commitOutputField: (index: number | undefined, outputField: OutputField) => void;
 }
@@ -94,7 +94,7 @@ export const OutputsContainer = (props: OutputsContainerProps) => {
     const numberOfOutputFields = output?.OutputField.length;
     if (numberOfOutputFields !== undefined) {
       const existingNames: string[] = output?.OutputField.map((of) => of.name.toString()) ?? [];
-      const newOutputFieldName: FieldName = findIncrementalName("New output", existingNames, 1) as FieldName;
+      const newOutputFieldName: string = findIncrementalName("New output", existingNames, 1);
       const newOutputField: OutputField = {
         name: newOutputFieldName,
         dataType: "string",
diff --git a/packages/pmml-editor/src/editor/components/Outputs/organisms/OutputsHandler.tsx b/packages/pmml-editor/src/editor/components/Outputs/organisms/OutputsHandler.tsx
index b219254a1f..9aeb6f0e44 100644
--- a/packages/pmml-editor/src/editor/components/Outputs/organisms/OutputsHandler.tsx
+++ b/packages/pmml-editor/src/editor/components/Outputs/organisms/OutputsHandler.tsx
@@ -21,7 +21,7 @@ import { Modal, ModalVariant } from "@patternfly/react-core/dist/js/components/M
 import { Title, TitleSizes } from "@patternfly/react-core/dist/js/components/Title";
 import { CloseIcon } from "@patternfly/react-icons/dist/js/icons/close-icon";
 import { WarningTriangleIcon } from "@patternfly/react-icons/dist/js/icons/warning-triangle-icon";
-import { FieldName, MiningSchema, Output, OutputField } from "@kie-tools/pmml-editor-marshaller";
+import { MiningSchema, Output, OutputField } from "@kie-tools/pmml-editor-marshaller";
 import { OutputsContainer } from "./OutputsContainer";
 import { Operation, useOperation } from "../../EditorScorecard";
 import { useValidationRegistry } from "../../../validation";
@@ -32,7 +32,7 @@ interface OutputsHandlerProps {
   modelIndex: number;
   output?: Output;
   miningSchema?: MiningSchema;
-  validateOutputFieldName: (index: number | undefined, name: FieldName) => boolean;
+  validateOutputFieldName: (index: number | undefined, name: string) => boolean;
   deleteOutputField: (index: number) => void;
   commitOutputField: (index: number | undefined, outputField: OutputField) => void;
 }
diff --git a/packages/pmml-editor/src/editor/reducers/DataDictionaryFieldReducer.ts b/packages/pmml-editor/src/editor/reducers/DataDictionaryFieldReducer.ts
index 555347e3be..5a9e4bb0e9 100644
--- a/packages/pmml-editor/src/editor/reducers/DataDictionaryFieldReducer.ts
+++ b/packages/pmml-editor/src/editor/reducers/DataDictionaryFieldReducer.ts
@@ -15,7 +15,7 @@
  */
 import { ActionMap, Actions, AllActions } from "./Actions";
 import { HistoryAwareValidatingReducer, HistoryService } from "../history";
-import { DataField, FieldName } from "@kie-tools/pmml-editor-marshaller";
+import { DataField } from "@kie-tools/pmml-editor-marshaller";
 import { Reducer } from "react";
 import {
   hasIntervals,
@@ -32,7 +32,7 @@ interface DataDictionaryFieldPayload {
     readonly modelIndex?: number;
     readonly dataDictionaryIndex: number;
     readonly dataField: DataField;
-    readonly originalName: FieldName;
+    readonly originalName: string;
   };
 }
 
diff --git a/packages/pmml-editor/src/editor/reducers/DataDictionaryReducer.ts b/packages/pmml-editor/src/editor/reducers/DataDictionaryReducer.ts
index 17faa51fd8..1bd56b142b 100644
--- a/packages/pmml-editor/src/editor/reducers/DataDictionaryReducer.ts
+++ b/packages/pmml-editor/src/editor/reducers/DataDictionaryReducer.ts
@@ -15,7 +15,7 @@
  */
 import { ActionMap, Actions, AllActions } from "./Actions";
 import { HistoryAwareValidatingReducer, HistoryService } from "../history";
-import { DataDictionary, DataType, FieldName, OpType } from "@kie-tools/pmml-editor-marshaller";
+import { DataDictionary, DataType, OpType } from "@kie-tools/pmml-editor-marshaller";
 import { Reducer } from "react";
 import { validateDataFields, ValidationRegistry } from "../validation";
 import { Builder } from "../paths";
@@ -33,7 +33,7 @@ interface DataDictionaryPayload {
   };
   [Actions.AddBatchDataDictionaryFields]: {
     readonly modelIndex?: number;
-    readonly dataDictionaryFields: FieldName[];
+    readonly dataDictionaryFields: string[];
   };
   [Actions.ReorderDataDictionaryFields]: {
     readonly oldIndex: number;
@@ -52,7 +52,7 @@ export const DataDictionaryReducer: HistoryAwareValidatingReducer<DataDictionary
       case Actions.AddDataDictionaryField:
         historyService.batch(state, Builder().forDataDictionary().build(), (draft) => {
           draft.DataField.push({
-            name: action.payload.name as FieldName,
+            name: action.payload.name as string,
             dataType: action.payload.type,
             optype: action.payload.optype,
           });
diff --git a/packages/pmml-editor/src/editor/reducers/MiningSchemaFieldReducer.ts b/packages/pmml-editor/src/editor/reducers/MiningSchemaFieldReducer.ts
index be3d82d2ae..262c11136f 100644
--- a/packages/pmml-editor/src/editor/reducers/MiningSchemaFieldReducer.ts
+++ b/packages/pmml-editor/src/editor/reducers/MiningSchemaFieldReducer.ts
@@ -17,7 +17,6 @@ import { Reducer } from "react";
 import { ActionMap, Actions, AllActions } from "./Actions";
 import { HistoryAwareValidatingReducer, HistoryService } from "../history";
 import {
-  FieldName,
   InvalidValueTreatmentMethod,
   MiningField,
   MissingValueTreatmentMethod,
@@ -42,8 +41,8 @@ interface MiningSchemaFieldPayload {
   [Actions.UpdateMiningSchemaField]: {
     readonly modelIndex: number;
     readonly miningSchemaIndex: number;
-    readonly name: FieldName;
-    readonly originalName: FieldName | undefined;
+    readonly name: string;
+    readonly originalName: string | undefined;
     readonly usageType: UsageType | undefined;
     readonly optype: OpType | undefined;
     readonly importance: number | undefined;
diff --git a/packages/pmml-editor/src/editor/reducers/MiningSchemaReducer.ts b/packages/pmml-editor/src/editor/reducers/MiningSchemaReducer.ts
index c4e0c619ca..4007da4cb7 100644
--- a/packages/pmml-editor/src/editor/reducers/MiningSchemaReducer.ts
+++ b/packages/pmml-editor/src/editor/reducers/MiningSchemaReducer.ts
@@ -16,7 +16,7 @@
 import { Reducer } from "react";
 import { ActionMap, Actions, AllActions } from "./Actions";
 import { HistoryAwareValidatingReducer, HistoryService } from "../history";
-import { FieldName, MiningSchema } from "@kie-tools/pmml-editor-marshaller";
+import { MiningSchema } from "@kie-tools/pmml-editor-marshaller";
 import { ValidationRegistry } from "../validation";
 import { Builder } from "../paths";
 import { validateMiningFields } from "../validation/MiningSchema";
@@ -25,12 +25,12 @@ import { getMiningSchema } from "../PMMLModelHelper";
 interface MiningSchemaPayload {
   [Actions.AddMiningSchemaFields]: {
     readonly modelIndex: number;
-    readonly names: FieldName[];
+    readonly names: string[];
   };
   [Actions.DeleteMiningSchemaField]: {
     readonly modelIndex: number;
     readonly miningSchemaIndex: number;
-    readonly name?: FieldName;
+    readonly name?: string;
   };
 }
 
diff --git a/packages/pmml-editor/src/editor/reducers/OutputReducer.ts b/packages/pmml-editor/src/editor/reducers/OutputReducer.ts
index dfa9ba5436..5770e07741 100644
--- a/packages/pmml-editor/src/editor/reducers/OutputReducer.ts
+++ b/packages/pmml-editor/src/editor/reducers/OutputReducer.ts
@@ -15,7 +15,7 @@
  */
 import { ActionMap, Actions, AllActions } from "./Actions";
 import { HistoryAwareValidatingReducer, HistoryService } from "../history";
-import { FieldName, Output, OutputField } from "@kie-tools/pmml-editor-marshaller";
+import { Output, OutputField } from "@kie-tools/pmml-editor-marshaller";
 import { Reducer } from "react";
 import { Builder } from "../paths";
 import { getCharacteristics, getMiningSchema, getOutputs } from "../PMMLModelHelper";
@@ -33,7 +33,7 @@ interface OutputPayload {
   };
   [Actions.AddBatchOutputs]: {
     readonly modelIndex: number;
-    readonly outputFields: FieldName[];
+    readonly outputFields: string[];
   };
 }
 
diff --git a/packages/pmml-editor/src/editor/reducers/ScorecardReducer.ts b/packages/pmml-editor/src/editor/reducers/ScorecardReducer.ts
index 5572c85354..2032b4225b 100644
--- a/packages/pmml-editor/src/editor/reducers/ScorecardReducer.ts
+++ b/packages/pmml-editor/src/editor/reducers/ScorecardReducer.ts
@@ -19,7 +19,6 @@ import {
   BaselineMethod,
   CompoundPredicate,
   False,
-  FieldName,
   MiningFunction,
   Predicate,
   ReasonCodeAlgorithm,
@@ -381,8 +380,8 @@ export const ScorecardReducer: HistoryAwareValidatingReducer<Scorecard, AllActio
 const updatePredicateFieldName = (
   pathBuilder: PredicateBuilder,
   predicate: Predicate | undefined,
-  name: FieldName,
-  originalName: FieldName | undefined,
+  name: string,
+  originalName: string | undefined,
   service: HistoryService
 ) => {
   if (predicate === undefined) {
diff --git a/packages/pmml-editor/src/editor/validation/Attributes.ts b/packages/pmml-editor/src/editor/validation/Attributes.ts
index f075df183d..97530cdcc6 100644
--- a/packages/pmml-editor/src/editor/validation/Attributes.ts
+++ b/packages/pmml-editor/src/editor/validation/Attributes.ts
@@ -18,7 +18,6 @@ import {
   Characteristic,
   CompoundPredicate,
   False,
-  FieldName,
   MiningField,
   Predicate,
   SimplePredicate,
@@ -120,7 +119,7 @@ export const validateAttributes = (
 const validatePredicate = (
   pathBuilder: PredicateBuilder,
   predicate: Predicate | undefined,
-  fieldNames: FieldName[],
+  fieldNames: string[],
   validationRegistry: ValidationRegistry
 ) => {
   if (predicate === undefined) {
diff --git a/packages/pmml-editor/tests/editor/components/EditorScorecard/organisms/__snapshots__/AttributesTable.test.tsx.snap b/packages/pmml-editor/tests/editor/components/EditorScorecard/organisms/__snapshots__/AttributesTable.test.tsx.snap
index 6b733a52a5..7999923dad 100644
--- a/packages/pmml-editor/tests/editor/components/EditorScorecard/organisms/__snapshots__/AttributesTable.test.tsx.snap
+++ b/packages/pmml-editor/tests/editor/components/EditorScorecard/organisms/__snapshots__/AttributesTable.test.tsx.snap
@@ -168,7 +168,7 @@ exports[`AttributesTable Attribute:Render 1`] = `
               aria-disabled="false"
               aria-label="Close [object Object]"
               class="pf-c-button pf-m-plain"
-              data-ouia-component-id="OUIA-Generated-Button-plain-3"
+              data-ouia-component-id="OUIA-Generated-Button-plain-4"
               data-ouia-component-type="PF4/Button"
               data-ouia-safe="true"
               type="button"
@@ -211,7 +211,7 @@ exports[`AttributesTable Attribute:Render 1`] = `
               aria-disabled="false"
               aria-label="Close [object Object], ,[object Object]"
               class="pf-c-button pf-m-plain"
-              data-ouia-component-id="OUIA-Generated-Button-plain-4"
+              data-ouia-component-id="OUIA-Generated-Button-plain-5"
               data-ouia-component-type="PF4/Button"
               data-ouia-safe="true"
               type="button"
diff --git a/packages/pmml-editor/tests/editor/components/LandingPage/molecules/__snapshots__/ModelCard.test.tsx.snap b/packages/pmml-editor/tests/editor/components/LandingPage/molecules/__snapshots__/ModelCard.test.tsx.snap
index fe43b91640..e06cfcfa91 100644
--- a/packages/pmml-editor/tests/editor/components/LandingPage/molecules/__snapshots__/ModelCard.test.tsx.snap
+++ b/packages/pmml-editor/tests/editor/components/LandingPage/molecules/__snapshots__/ModelCard.test.tsx.snap
@@ -2,7 +2,7 @@
 
 exports[`ModelCard render::Basics 1`] = `
 <article
-  class="pf-c-card pf-m-hoverable model-card"
+  class="pf-c-card pf-m-selectable model-card"
   data-ouia-component-id="OUIA-Generated-Card-1"
   data-ouia-component-type="PF4/Card"
   data-ouia-safe="true"
diff --git a/packages/pmml-editor/tests/editor/components/LandingPage/templates/__snapshots__/LandingPage.test.tsx.snap b/packages/pmml-editor/tests/editor/components/LandingPage/templates/__snapshots__/LandingPage.test.tsx.snap
index d023a14cb8..d3ab901486 100644
--- a/packages/pmml-editor/tests/editor/components/LandingPage/templates/__snapshots__/LandingPage.test.tsx.snap
+++ b/packages/pmml-editor/tests/editor/components/LandingPage/templates/__snapshots__/LandingPage.test.tsx.snap
@@ -325,7 +325,7 @@ exports[`LandingPage render::With Supported Model 1`] = `
           data-testid="landing-page__model-card"
         >
           <article
-            class="pf-c-card pf-m-hoverable model-card"
+            class="pf-c-card pf-m-selectable model-card"
             data-ouia-component-id="OUIA-Generated-Card-1"
             data-ouia-component-type="PF4/Card"
             data-ouia-safe="true"
diff --git a/packages/pmml-editor/tests/editor/components/MiningSchema/MiningSchemaContainer/MiningSchemaContainer.test.tsx b/packages/pmml-editor/tests/editor/components/MiningSchema/MiningSchemaContainer/MiningSchemaContainer.test.tsx
index 90f6bd06f2..d461fe2140 100644
--- a/packages/pmml-editor/tests/editor/components/MiningSchema/MiningSchemaContainer/MiningSchemaContainer.test.tsx
+++ b/packages/pmml-editor/tests/editor/components/MiningSchema/MiningSchemaContainer/MiningSchemaContainer.test.tsx
@@ -15,11 +15,10 @@
  */
 import { fireEvent, render } from "@testing-library/react";
 import * as React from "react";
-import { DataField, DataType, FieldName, MiningField } from "@kie-tools/pmml-editor-marshaller";
+import { DataField, MiningField } from "@kie-tools/pmml-editor-marshaller";
 import MiningSchemaContainer, {
   MiningSchemaContext,
 } from "../../../../../src/editor/components/MiningSchema/MiningSchemaContainer/MiningSchemaContainer";
-import { DDDataField } from "../../../../../src/editor/components/DataDictionary/DataDictionaryContainer/DataDictionaryContainer";
 
 const onAddField = jest.fn((name) => {});
 const onDeleteField = jest.fn((index) => {});
@@ -27,12 +26,12 @@ const onUpdateField = jest.fn((index, originalName, field) => {});
 
 const dataFields: DataField[] = [
   {
-    name: "field1" as FieldName,
+    name: "field1",
     optype: "categorical",
     dataType: "string",
   },
   {
-    name: "field2" as FieldName,
+    name: "field2",
     optype: "categorical",
     dataType: "string",
   },
@@ -47,10 +46,10 @@ beforeEach(() => {
 
   miningFields = [
     {
-      name: "field1" as FieldName,
+      name: "field1",
     },
     {
-      name: "field2" as FieldName,
+      name: "field2",
     },
   ];
 });
diff --git a/packages/pmml-editor/tests/editor/components/Outputs/organisms/OutputFieldsTable/OutputFieldsTable.test.tsx b/packages/pmml-editor/tests/editor/components/Outputs/organisms/OutputFieldsTable/OutputFieldsTable.test.tsx
index 03bde0056a..2f1fa30dcd 100644
--- a/packages/pmml-editor/tests/editor/components/Outputs/organisms/OutputFieldsTable/OutputFieldsTable.test.tsx
+++ b/packages/pmml-editor/tests/editor/components/Outputs/organisms/OutputFieldsTable/OutputFieldsTable.test.tsx
@@ -17,7 +17,7 @@ import { fireEvent, render } from "@testing-library/react";
 import * as React from "react";
 import { Operation, OperationContext } from "../../../../../../src/editor/components/EditorScorecard";
 import OutputFieldsTable from "../../../../../../src/editor/components/Outputs/organisms/OutputFieldsTable";
-import { FieldName, OutputField } from "@kie-tools/pmml-editor-marshaller";
+import { OutputField } from "@kie-tools/pmml-editor-marshaller";
 import { DataType } from "@kie-tools/pmml-editor-marshaller/src";
 
 const setSelectedOutputIndex = jest.fn((index) => {});
@@ -43,11 +43,11 @@ beforeEach(() => {
 
   outputs = [
     {
-      name: "output1" as FieldName,
+      name: "output1",
       dataType: "string" as DataType,
     },
     {
-      name: "output2" as FieldName,
+      name: "output2",
       dataType: "string" as DataType,
     },
   ];
diff --git a/packages/pmml-editor/tests/editor/reducers/DataDictionaryFieldReducer.test.ts b/packages/pmml-editor/tests/editor/reducers/DataDictionaryFieldReducer.test.ts
index ca24bd9ca5..9385f4f964 100644
--- a/packages/pmml-editor/tests/editor/reducers/DataDictionaryFieldReducer.test.ts
+++ b/packages/pmml-editor/tests/editor/reducers/DataDictionaryFieldReducer.test.ts
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import { DataField, FieldName } from "@kie-tools/pmml-editor-marshaller";
+import { DataField } from "@kie-tools/pmml-editor-marshaller";
 import { Actions, AllActions, DataDictionaryFieldReducer } from "@kie-tools/pmml-editor/dist/editor/reducers";
 import { Reducer } from "react";
 import { HistoryService } from "@kie-tools/pmml-editor/dist/editor/history";
@@ -21,7 +21,7 @@ import { ValidationRegistry } from "@kie-tools/pmml-editor/dist/editor/validatio
 
 const historyService = new HistoryService([]);
 const validationRegistry = new ValidationRegistry();
-const dataFields: DataField[] = [{ name: "field1" as FieldName, dataType: "boolean", optype: "categorical" }];
+const dataFields: DataField[] = [{ name: "field1", dataType: "boolean", optype: "categorical" }];
 const pmml = { version: "1.0", DataDictionary: { DataField: dataFields }, Header: {} };
 const reducer: Reducer<DataField[], AllActions> = DataDictionaryFieldReducer(historyService, validationRegistry);
 
@@ -31,8 +31,8 @@ describe("DataDictionaryFieldReducer::Valid actions", () => {
       type: Actions.UpdateDataDictionaryField,
       payload: {
         dataDictionaryIndex: 0,
-        dataField: { name: "updated" as FieldName, dataType: "string", optype: "ordinal" },
-        originalName: "field1" as FieldName,
+        dataField: { name: "updated", dataType: "string", optype: "ordinal" },
+        originalName: "field1",
       },
     });
     const updated = historyService.commit(pmml)?.DataDictionary.DataField as DataField[];
@@ -49,8 +49,8 @@ describe("DataDictionaryFieldReducer::Valid actions", () => {
       type: Actions.UpdateDataDictionaryField,
       payload: {
         dataDictionaryIndex: -1,
-        dataField: { name: "updated" as FieldName, dataType: "boolean", optype: "categorical" },
-        originalName: "field1" as FieldName,
+        dataField: { name: "updated", dataType: "boolean", optype: "categorical" },
+        originalName: "field1",
       },
     });
     const updated = historyService.commit(pmml)?.DataDictionary.DataField as DataField[];
@@ -63,8 +63,8 @@ describe("DataDictionaryFieldReducer::Valid actions", () => {
       type: Actions.UpdateDataDictionaryField,
       payload: {
         dataDictionaryIndex: 1,
-        dataField: { name: "updated" as FieldName, dataType: "boolean", optype: "categorical" },
-        originalName: "field1" as FieldName,
+        dataField: { name: "updated", dataType: "boolean", optype: "categorical" },
+        originalName: "field1",
       },
     });
     const updated = historyService.commit(pmml)?.DataDictionary.DataField as DataField[];
diff --git a/packages/pmml-editor/tests/editor/reducers/DataDictionaryReducer.test.ts b/packages/pmml-editor/tests/editor/reducers/DataDictionaryReducer.test.ts
index 91836efdf0..b2d67ee62d 100644
--- a/packages/pmml-editor/tests/editor/reducers/DataDictionaryReducer.test.ts
+++ b/packages/pmml-editor/tests/editor/reducers/DataDictionaryReducer.test.ts
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import { DataDictionary, FieldName } from "@kie-tools/pmml-editor-marshaller";
+import { DataDictionary } from "@kie-tools/pmml-editor-marshaller";
 import { Actions, AllActions, DataDictionaryReducer } from "@kie-tools/pmml-editor/dist/editor/reducers";
 import { Reducer } from "react";
 import { HistoryService } from "@kie-tools/pmml-editor/dist/editor/history";
@@ -50,7 +50,7 @@ describe("DataDictionaryReducer::Valid actions", () => {
       {
         DataField: [
           {
-            name: "field1" as FieldName,
+            name: "field1",
             dataType: "string",
             optype: "categorical",
           },
diff --git a/packages/pmml-editor/tests/editor/reducers/DelegatingModelReducer.test.ts b/packages/pmml-editor/tests/editor/reducers/DelegatingModelReducer.test.ts
index c03047023e..48d65ffecd 100644
--- a/packages/pmml-editor/tests/editor/reducers/DelegatingModelReducer.test.ts
+++ b/packages/pmml-editor/tests/editor/reducers/DelegatingModelReducer.test.ts
@@ -13,14 +13,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import { FieldName, MiningField, Model, PMML, Scorecard } from "@kie-tools/pmml-editor-marshaller";
+import { MiningField, Model, PMML, Scorecard } from "@kie-tools/pmml-editor-marshaller";
 import { Actions, AllActions } from "@kie-tools/pmml-editor/dist/editor/reducers";
 import { Reducer } from "react";
 import { HistoryService } from "@kie-tools/pmml-editor/dist/editor/history";
 import { DelegatingModelReducer } from "@kie-tools/pmml-editor/dist/editor/reducers/DelegatingModelReducer";
 
 const service = new HistoryService([]);
-const miningFields: MiningField[] = [{ name: "field1" as FieldName }];
+const miningFields: MiningField[] = [{ name: "field1" }];
 const models: Model[] = [
   new Scorecard({
     MiningSchema: { MiningField: miningFields },
@@ -35,7 +35,7 @@ const models: Model[] = [
 ];
 const pmml: PMML = {
   version: "1.0",
-  DataDictionary: { DataField: [{ name: "field1" as FieldName, dataType: "boolean", optype: "categorical" }] },
+  DataDictionary: { DataField: [{ name: "field1", dataType: "boolean", optype: "categorical" }] },
   Header: {},
   models: models,
 };
@@ -63,8 +63,8 @@ describe("DelegatingModelReducer::Valid actions", () => {
       type: Actions.UpdateDataDictionaryField,
       payload: {
         dataDictionaryIndex: 0,
-        dataField: { name: "updated" as FieldName, dataType: "string", optype: "ordinal" },
-        originalName: "field1" as FieldName,
+        dataField: { name: "updated", dataType: "string", optype: "ordinal" },
+        originalName: "field1",
       },
     });
     service.commit(pmml);
@@ -82,8 +82,8 @@ describe("DelegatingModelReducer::Valid actions", () => {
       payload: {
         modelIndex: 1,
         miningSchemaIndex: 0,
-        name: "updated" as FieldName,
-        originalName: "field1" as FieldName,
+        name: "updated",
+        originalName: "field1",
         usageType: undefined,
         optype: undefined,
         importance: undefined,
diff --git a/packages/pmml-editor/tests/editor/reducers/MiningSchemaFieldReducer.test.ts b/packages/pmml-editor/tests/editor/reducers/MiningSchemaFieldReducer.test.ts
index 35ea3a0f27..feaa93a6c7 100644
--- a/packages/pmml-editor/tests/editor/reducers/MiningSchemaFieldReducer.test.ts
+++ b/packages/pmml-editor/tests/editor/reducers/MiningSchemaFieldReducer.test.ts
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import { FieldName, MiningField, Model, PMML, Scorecard } from "@kie-tools/pmml-editor-marshaller";
+import { MiningField, Model, PMML, Scorecard } from "@kie-tools/pmml-editor-marshaller";
 import { Actions, AllActions } from "@kie-tools/pmml-editor/dist/editor/reducers";
 import { Reducer } from "react";
 import { HistoryService } from "@kie-tools/pmml-editor/dist/editor/history";
@@ -22,7 +22,7 @@ import { ValidationRegistry } from "@kie-tools/pmml-editor/dist/editor/validatio
 
 const historyService = new HistoryService([]);
 const validationRegistry = new ValidationRegistry();
-const miningFields: MiningField[] = [{ name: "field1" as FieldName }];
+const miningFields: MiningField[] = [{ name: "field1" }];
 const models: Model[] = [
   new Scorecard({
     MiningSchema: { MiningField: miningFields },
@@ -32,7 +32,7 @@ const models: Model[] = [
 ];
 const pmml: PMML = {
   version: "1.0",
-  DataDictionary: { DataField: [{ name: "field1" as FieldName, dataType: "boolean", optype: "categorical" }] },
+  DataDictionary: { DataField: [{ name: "field1", dataType: "boolean", optype: "categorical" }] },
   Header: {},
   models: models,
 };
@@ -45,8 +45,8 @@ describe("MiningSchemaFieldReducer::Valid actions", () => {
       payload: {
         modelIndex: 0,
         dataDictionaryIndex: 0,
-        dataField: { name: "updated" as FieldName, dataType: "string", optype: "ordinal" },
-        originalName: "field1" as FieldName,
+        dataField: { name: "updated", dataType: "string", optype: "ordinal" },
+        originalName: "field1",
       },
     });
     const updated = historyService.commit(pmml)?.models as Model[];
@@ -63,8 +63,8 @@ describe("MiningSchemaFieldReducer::Valid actions", () => {
       payload: {
         modelIndex: 0,
         miningSchemaIndex: 0,
-        name: "updated" as FieldName,
-        originalName: "field1" as FieldName,
+        name: "updated",
+        originalName: "field1",
         usageType: "active",
         optype: "ordinal",
         importance: 5,
diff --git a/packages/pmml-editor/tests/editor/reducers/ScorecardReducer.test.ts b/packages/pmml-editor/tests/editor/reducers/ScorecardReducer.test.ts
index 6b4a9754b6..a6a59bea0b 100644
--- a/packages/pmml-editor/tests/editor/reducers/ScorecardReducer.test.ts
+++ b/packages/pmml-editor/tests/editor/reducers/ScorecardReducer.test.ts
@@ -15,7 +15,6 @@
  */
 import {
   CompoundPredicate,
-  FieldName,
   Model,
   PMML,
   Predicate,
@@ -356,7 +355,7 @@ describe("ScorecardReducer::Valid actions", () => {
       type: Actions.AddMiningSchemaFields,
       payload: {
         modelIndex: 0,
-        names: ["miningSchemaField1" as FieldName],
+        names: ["miningSchemaField1"],
       },
     });
 
@@ -371,7 +370,7 @@ describe("ScorecardReducer::Valid actions", () => {
 
   test("Actions.DeleteMiningSchemaField", () => {
     const scorecard: Scorecard = {
-      MiningSchema: { MiningField: [{ name: "miningSchemaField" as FieldName }] },
+      MiningSchema: { MiningField: [{ name: "miningSchemaField" }] },
       Characteristics: {
         Characteristic: [],
       },
@@ -420,7 +419,7 @@ describe("ScorecardReducer::Valid actions", () => {
         attributeIndex: 0,
         reasonCode: "updatedAttributeReasonCode",
         partialScore: 2.0,
-        predicate: new SimplePredicate({ field: "field" as FieldName, operator: "equal", value: 100 }),
+        predicate: new SimplePredicate({ field: "field", operator: "equal", value: 100 }),
       },
     });
 
@@ -447,7 +446,7 @@ describe("ScorecardReducer::Valid actions", () => {
                 reasonCode: "attributeReasonCode",
                 partialScore: 1.0,
                 predicate: new SimplePredicate({
-                  field: "dataField" as FieldName,
+                  field: "dataField",
                   operator: "equal",
                   value: 100,
                 }),
@@ -460,7 +459,7 @@ describe("ScorecardReducer::Valid actions", () => {
     };
     const pmml: PMML = {
       version: "1.0",
-      DataDictionary: { DataField: [{ name: "dataField" as FieldName, dataType: "string", optype: "categorical" }] },
+      DataDictionary: { DataField: [{ name: "dataField", dataType: "string", optype: "categorical" }] },
       Header: {},
       models: [scorecard],
     };
@@ -469,8 +468,8 @@ describe("ScorecardReducer::Valid actions", () => {
       type: Actions.UpdateDataDictionaryField,
       payload: {
         modelIndex: 0,
-        dataField: { name: "updatedDataField" as FieldName, dataType: "string", optype: "categorical" },
-        originalName: "dataField" as FieldName,
+        dataField: { name: "updatedDataField", dataType: "string", optype: "categorical" },
+        originalName: "dataField",
         dataDictionaryIndex: 0,
       },
     });
@@ -504,12 +503,12 @@ describe("ScorecardReducer::Valid actions", () => {
                 predicate: new CompoundPredicate({
                   predicates: [
                     new SimplePredicate({
-                      field: "dataField" as FieldName,
+                      field: "dataField",
                       operator: "greaterThan",
                       value: 100,
                     }),
                     new SimplePredicate({
-                      field: "dataField" as FieldName,
+                      field: "dataField",
                       operator: "lessOrEqual",
                       value: 200,
                     }),
@@ -525,7 +524,7 @@ describe("ScorecardReducer::Valid actions", () => {
     };
     const pmml: PMML = {
       version: "1.0",
-      DataDictionary: { DataField: [{ name: "dataField" as FieldName, dataType: "string", optype: "categorical" }] },
+      DataDictionary: { DataField: [{ name: "dataField", dataType: "string", optype: "categorical" }] },
       Header: {},
       models: [scorecard],
     };
@@ -534,8 +533,8 @@ describe("ScorecardReducer::Valid actions", () => {
       type: Actions.UpdateDataDictionaryField,
       payload: {
         modelIndex: 0,
-        dataField: { name: "updatedDataField" as FieldName, dataType: "string", optype: "categorical" },
-        originalName: "dataField" as FieldName,
+        dataField: { name: "updatedDataField", dataType: "string", optype: "categorical" },
+        originalName: "dataField",
         dataDictionaryIndex: 0,
       },
     });
diff --git a/packages/pmml-editor/tests/editor/validation/Attributes.test.ts b/packages/pmml-editor/tests/editor/validation/Attributes.test.ts
index 777fe15e85..e81c36a397 100644
--- a/packages/pmml-editor/tests/editor/validation/Attributes.test.ts
+++ b/packages/pmml-editor/tests/editor/validation/Attributes.test.ts
@@ -16,7 +16,7 @@
 
 import { ValidationEntry, ValidationRegistry } from "@kie-tools/pmml-editor/dist/editor/validation";
 import { validateAttribute, validateAttributes } from "@kie-tools/pmml-editor/dist/editor/validation/Attributes";
-import { CompoundPredicate, FieldName, SimplePredicate } from "@kie-tools/pmml-editor-marshaller";
+import { CompoundPredicate, SimplePredicate } from "@kie-tools/pmml-editor-marshaller";
 
 let registry: ValidationRegistry;
 beforeEach(() => {
@@ -44,8 +44,8 @@ describe("ValidateAttribute", () => {
       },
       false,
       2,
-      { predicate: new SimplePredicate({ field: "field1" as FieldName, operator: "equal", value: 100 }) },
-      [{ name: "field1" as FieldName }],
+      { predicate: new SimplePredicate({ field: "field1", operator: "equal", value: 100 }) },
+      [{ name: "field1" }],
       registry
     );
 
@@ -67,8 +67,8 @@ describe("ValidateAttribute", () => {
       },
       false,
       2,
-      { predicate: new SimplePredicate({ field: "field1" as FieldName, operator: "equal", value: 100 }) },
-      [{ name: "field1" as FieldName }],
+      { predicate: new SimplePredicate({ field: "field1", operator: "equal", value: 100 }) },
+      [{ name: "field1" }],
       registry
     );
 
@@ -87,9 +87,9 @@ describe("ValidateAttribute", () => {
       2,
       {
         reasonCode: "reasonCode",
-        predicate: new SimplePredicate({ field: "field1" as FieldName, operator: "equal", value: 100 }),
+        predicate: new SimplePredicate({ field: "field1", operator: "equal", value: 100 }),
       },
-      [{ name: "field1" as FieldName }],
+      [{ name: "field1" }],
       registry
     );
 
@@ -107,9 +107,9 @@ describe("ValidateAttribute", () => {
       true,
       2,
       {
-        predicate: new SimplePredicate({ field: "field1" as FieldName, operator: "equal", value: 100 }),
+        predicate: new SimplePredicate({ field: "field1", operator: "equal", value: 100 }),
       },
-      [{ name: "field1" as FieldName }],
+      [{ name: "field1" }],
       registry
     );
 
@@ -132,9 +132,9 @@ describe("ValidateAttribute", () => {
       2,
       {
         partialScore: 2.0,
-        predicate: new SimplePredicate({ field: "field1" as FieldName, operator: "equal", value: 100 }),
+        predicate: new SimplePredicate({ field: "field1", operator: "equal", value: 100 }),
       },
-      [{ name: "field1" as FieldName }],
+      [{ name: "field1" }],
       registry
     );
 
@@ -170,7 +170,7 @@ describe("ValidateAttribute", () => {
       },
       false,
       2,
-      { predicate: new SimplePredicate({ field: "field1" as FieldName, operator: "equal", value: 100 }) },
+      { predicate: new SimplePredicate({ field: "field1", operator: "equal", value: 100 }) },
       [],
       registry
     );
@@ -196,12 +196,12 @@ describe("ValidateAttribute", () => {
         predicate: new CompoundPredicate({
           predicates: [
             new SimplePredicate({
-              field: "field1" as FieldName,
+              field: "field1",
               operator: "greaterThan",
               value: 100,
             }),
             new SimplePredicate({
-              field: "field1" as FieldName,
+              field: "field1",
               operator: "lessOrEqual",
               value: 200,
             }),
@@ -234,8 +234,8 @@ describe("ValidateAttribute", () => {
       },
       false,
       2,
-      { predicate: new SimplePredicate({ field: "field1" as FieldName, operator: "equal", value: 100 }) },
-      [{ name: "field1" as FieldName }],
+      { predicate: new SimplePredicate({ field: "field1", operator: "equal", value: 100 }) },
+      [{ name: "field1" }],
       registry
     );
 
@@ -256,12 +256,12 @@ describe("ValidateAttribute", () => {
         predicate: new CompoundPredicate({
           predicates: [
             new SimplePredicate({
-              field: "field1" as FieldName,
+              field: "field1",
               operator: "greaterThan",
               value: 100,
             }),
             new SimplePredicate({
-              field: "field1" as FieldName,
+              field: "field1",
               operator: "lessOrEqual",
               value: 200,
             }),
@@ -269,7 +269,7 @@ describe("ValidateAttribute", () => {
           booleanOperator: "and",
         }),
       },
-      [{ name: "field1" as FieldName }],
+      [{ name: "field1" }],
       registry
     );
 
@@ -286,12 +286,12 @@ describe("ValidateAttributes", () => {
       {
         Attribute: [
           {
-            predicate: new SimplePredicate({ field: "field1" as FieldName, operator: "equal", value: 100 }),
+            predicate: new SimplePredicate({ field: "field1", operator: "equal", value: 100 }),
           },
-          { predicate: new SimplePredicate({ field: "field1" as FieldName, operator: "equal", value: 100 }) },
+          { predicate: new SimplePredicate({ field: "field1", operator: "equal", value: 100 }) },
         ],
       },
-      [{ name: "field1" as FieldName }],
+      [{ name: "field1" }],
       registry
     );
 
@@ -307,12 +307,12 @@ describe("ValidateAttributes", () => {
         Attribute: [
           {
             partialScore: 1.0,
-            predicate: new SimplePredicate({ field: "field1" as FieldName, operator: "equal", value: 100 }),
+            predicate: new SimplePredicate({ field: "field1", operator: "equal", value: 100 }),
           },
-          { predicate: new SimplePredicate({ field: "field1" as FieldName, operator: "equal", value: 100 }) },
+          { predicate: new SimplePredicate({ field: "field1", operator: "equal", value: 100 }) },
         ],
       },
-      [{ name: "field1" as FieldName }],
+      [{ name: "field1" }],
       registry
     );
 
@@ -332,15 +332,15 @@ describe("ValidateAttributes", () => {
         Attribute: [
           {
             partialScore: 1.0,
-            predicate: new SimplePredicate({ field: "field1" as FieldName, operator: "equal", value: 100 }),
+            predicate: new SimplePredicate({ field: "field1", operator: "equal", value: 100 }),
           },
           {
             partialScore: 2.0,
-            predicate: new SimplePredicate({ field: "field1" as FieldName, operator: "equal", value: 100 }),
+            predicate: new SimplePredicate({ field: "field1", operator: "equal", value: 100 }),
           },
         ],
       },
-      [{ name: "field1" as FieldName }],
+      [{ name: "field1" }],
       registry
     );
 
diff --git a/packages/serverless-logic-web-tools-swf-deployment-webapp/package.json b/packages/serverless-logic-web-tools-swf-deployment-webapp/package.json
index c6e3482ba3..1504fbc9f2 100644
--- a/packages/serverless-logic-web-tools-swf-deployment-webapp/package.json
+++ b/packages/serverless-logic-web-tools-swf-deployment-webapp/package.json
@@ -25,8 +25,8 @@
     "@kie-tools-core/i18n": "workspace:*",
     "@kie-tools-core/patternfly-base": "workspace:*",
     "@kie-tools/i18n-common-dictionary": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
     "react": "^17.0.2",
     "react-dom": "^17.0.2",
     "react-router": "^5.2.1",
diff --git a/packages/serverless-logic-web-tools/package.json b/packages/serverless-logic-web-tools/package.json
index f4be1a6cf8..2f7ca1bc22 100644
--- a/packages/serverless-logic-web-tools/package.json
+++ b/packages/serverless-logic-web-tools/package.json
@@ -52,9 +52,9 @@
     "@octokit/plugin-rest-endpoint-methods": "^5.0.1",
     "@octokit/rest": "^18.5.3",
     "@patternfly/quickstarts": "^2.3.2",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
-    "@patternfly/react-tokens": "^4.33.1",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
+    "@patternfly/react-tokens": "^4.94.6",
     "@rhoas/registry-instance-sdk": "^0.34.1",
     "axios": "^0.27.2",
     "bowser": "^2.10.0",
diff --git a/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx b/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx
index fab131e3ac..2f6c6e3e28 100644
--- a/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx
@@ -435,7 +435,7 @@ export function EditorPage(props: Props) {
               workspaceFile={file.workspaceFile}
               onNotificationClick={onNotificationClick}
             >
-              <PageSection hasOverflowScroll={true} padding={{ default: "noPadding" }}>
+              <PageSection hasOverflowScroll={true} padding={{ default: "noPadding" }} aria-label="Editor Section">
                 <div style={{ height: "100%" }}>
                   {!isEditorReady && <LoadingSpinner />}
                   <div style={{ display: isEditorReady ? "inline" : "none" }}>
diff --git a/packages/serverless-logic-web-tools/webpack.config.js b/packages/serverless-logic-web-tools/webpack.config.js
index a6f407557e..49635c4475 100644
--- a/packages/serverless-logic-web-tools/webpack.config.js
+++ b/packages/serverless-logic-web-tools/webpack.config.js
@@ -143,7 +143,7 @@ module.exports = async (env) => {
               globOptions: { ignore: ["**/WEB-INF/**/*", "**/*.html"] },
             },
             {
-              from: "../dashbuilder-client/dist/",
+              from: "../dashbuilder-editor/dist/dashbuilder-client/",
               to: "./dashbuilder-client",
               globOptions: { ignore: ["**/WEB-INF/**/*"] }, // "**/*.html" omitted because dashbuilder-client/index.html is needed
             },
diff --git a/packages/serverless-workflow-combined-editor/package.json b/packages/serverless-workflow-combined-editor/package.json
index f856207232..c750a2ae0a 100644
--- a/packages/serverless-workflow-combined-editor/package.json
+++ b/packages/serverless-workflow-combined-editor/package.json
@@ -41,8 +41,8 @@
     "@kie-tools/serverless-workflow-mermaid-viewer": "workspace:*",
     "@kie-tools/serverless-workflow-service-catalog": "workspace:*",
     "@kie-tools/serverless-workflow-text-editor": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
     "json-schema": "^0.4.0",
     "monaco-editor": "^0.33.0",
     "monaco-yaml": "^4.0.0",
diff --git a/packages/serverless-workflow-diagram-editor/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/main/java/org/kie/workbench/common/stunner/client/lienzo/shape/view/wires/ext/WiresConnectorViewExt.java b/packages/serverless-workflow-diagram-editor/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/main/java/org/kie/workbench/common/stunner/client/lienzo/shape/view/wires/ext/WiresConnectorViewExt.java
index 558615c81f..cfbf324287 100644
--- a/packages/serverless-workflow-diagram-editor/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/main/java/org/kie/workbench/common/stunner/client/lienzo/shape/view/wires/ext/WiresConnectorViewExt.java
+++ b/packages/serverless-workflow-diagram-editor/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/main/java/org/kie/workbench/common/stunner/client/lienzo/shape/view/wires/ext/WiresConnectorViewExt.java
@@ -76,6 +76,10 @@ public class WiresConnectorViewExt<T>
                                                                supportedEventTypes);
     }
 
+    public WiresConnectorLabel getLabel() {
+        return label.orElse(null);
+    }
+
     @Override
     public boolean supports(final ViewEventType type) {
         return eventHandlerManager.supports(type);
diff --git a/packages/serverless-workflow-diagram-editor/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/test/java/org/kie/workbench/common/stunner/client/lienzo/shape/view/wires/ext/WiresConnectorViewExtTest.java b/packages/serverless-workflow-diagram-editor/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/test/java/org/kie/workbench/common/stunner/client/lienzo/shape/view/wires/ext/WiresConnectorViewExtTest.java
index 442ec80380..3d432853a9 100644
--- a/packages/serverless-workflow-diagram-editor/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/test/java/org/kie/workbench/common/stunner/client/lienzo/shape/view/wires/ext/WiresConnectorViewExtTest.java
+++ b/packages/serverless-workflow-diagram-editor/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/test/java/org/kie/workbench/common/stunner/client/lienzo/shape/view/wires/ext/WiresConnectorViewExtTest.java
@@ -137,7 +137,7 @@ public class WiresConnectorViewExtTest {
         assertEquals(0.0, tested.getTitleFontSize(), 0.0001);
         assertNull(tested.getFontPosition());
         assertNull(tested.getFontAlignment());
-
+        assertEquals(tested.getLabel(), label);
         tested.destroy();
         verify(label, times(1)).destroy();
         assertFalse(tested.label.isPresent());
@@ -158,6 +158,7 @@ public class WiresConnectorViewExtTest {
 
         assertNotNull(tested.label);
         assertFalse(tested.label.isPresent());
+        assertNull(tested.getLabel());
         tested.batch();
         verify(labelText, never()).batch();
     }
diff --git a/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/event/OrthogonalPolylinePointsChangedEvent.java b/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/event/OrthogonalPolylinePointsChangedEvent.java
new file mode 100644
index 0000000000..61375954af
--- /dev/null
+++ b/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/event/OrthogonalPolylinePointsChangedEvent.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.ait.lienzo.client.core.event;
+
+import com.ait.lienzo.client.core.shape.Node;
+import com.ait.lienzo.client.core.types.Point2DArray;
+import elemental2.dom.Event;
+import elemental2.dom.HTMLElement;
+
+public class OrthogonalPolylinePointsChangedEvent extends AbstractNodeEvent<OrthogonalPolylinePointsChangedHandler, Node> {
+
+    private static final Type<OrthogonalPolylinePointsChangedHandler> TYPE = new Type<>();
+    private Point2DArray orthogonalPoints;
+
+    public OrthogonalPolylinePointsChangedEvent(HTMLElement relativeElement) {
+        super(relativeElement);
+    }
+
+    @Override
+    public void dispatch(OrthogonalPolylinePointsChangedHandler handler) {
+        handler.onOrthogonalPointsChanged(this);
+    }
+
+    @Override
+    public Event getNativeEvent() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public Type<OrthogonalPolylinePointsChangedHandler> getAssociatedType() {
+        return TYPE;
+    }
+
+    public static final Type<OrthogonalPolylinePointsChangedHandler> getType() {
+        return TYPE;
+    }
+
+    public Point2DArray getOrthogonalPoints() {
+        return orthogonalPoints;
+    }
+
+    public void override(final Point2DArray orthogonalPoints) {
+        this.orthogonalPoints = orthogonalPoints;
+    }
+}
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/IconPath.java b/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/event/OrthogonalPolylinePointsChangedHandler.java
similarity index 50%
copy from packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/IconPath.java
copy to packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/event/OrthogonalPolylinePointsChangedHandler.java
index 7a5ad766a0..b9c33f0a21 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/IconPath.java
+++ b/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/event/OrthogonalPolylinePointsChangedHandler.java
@@ -13,9 +13,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.kie.workbench.common.stunner.sw.client.shapes.icons;
 
-public interface IconPath {
+package com.ait.lienzo.client.core.event;
 
-    String CLOCK = "M 4.531 2.344 C 4.531 2.084 4.74 1.875 5 1.875 C 5.26 1.875 5.469 2.084 5.469 2.344 L 5.469 4.75 L 7.135 5.859 C 7.35 6.004 7.408 6.295 7.248 6.51 C 7.121 6.725 6.83 6.783 6.615 6.623 L 4.74 5.373 C 4.609 5.303 4.531 5.156 4.531 4.982 L 4.531 2.344 Z M 5 0 C 7.762 0 10 2.238 10 5 C 10 7.762 7.762 10 5 10 C 2.238 10 0 7.762 0 5 C 0 2.238 2.238 0 5 0 Z M 0.938 5 C 0.938 7.244 2.756 9.063 5 9.063 C 7.244 9.063 9.063 7.244 9.063 5 C 9.063 2.756 7.244 0.938 5 0.938 C 2.756 [...]
+import com.ait.lienzo.gwtlienzo.event.shared.EventHandler;
+
+public interface OrthogonalPolylinePointsChangedHandler extends EventHandler {
+
+    Object getType();
+
+    void onOrthogonalPointsChanged(OrthogonalPolylinePointsChangedEvent event);
 }
diff --git a/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/IDrawable.java b/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/IDrawable.java
index 288367e257..243bffbf35 100755
--- a/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/IDrawable.java
+++ b/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/IDrawable.java
@@ -45,6 +45,7 @@ import com.ait.lienzo.client.core.event.NodeTouchCancelHandler;
 import com.ait.lienzo.client.core.event.NodeTouchEndHandler;
 import com.ait.lienzo.client.core.event.NodeTouchMoveHandler;
 import com.ait.lienzo.client.core.event.NodeTouchStartHandler;
+import com.ait.lienzo.client.core.event.OrthogonalPolylinePointsChangedHandler;
 import com.ait.lienzo.client.core.shape.guides.IGuidePrimitive;
 import com.ait.lienzo.client.core.types.BoundingBox;
 import com.ait.lienzo.client.core.types.BoundingPoints;
@@ -135,6 +136,8 @@ public interface IDrawable<T extends IDrawable<T>> extends EventReceiver {
 
     HandlerRegistration addNodeDragStartHandler(NodeDragStartHandler handler);
 
+    HandlerRegistration addOrthogonalPolylinePointsChangedHandler(OrthogonalPolylinePointsChangedHandler handler);
+
     /**
      * Gets the object's {@link Layer}
      *
diff --git a/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/Node.java b/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/Node.java
index 29e9bd6947..809e27262e 100755
--- a/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/Node.java
+++ b/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/Node.java
@@ -71,6 +71,8 @@ import com.ait.lienzo.client.core.event.NodeTouchMoveEvent;
 import com.ait.lienzo.client.core.event.NodeTouchMoveHandler;
 import com.ait.lienzo.client.core.event.NodeTouchStartEvent;
 import com.ait.lienzo.client.core.event.NodeTouchStartHandler;
+import com.ait.lienzo.client.core.event.OrthogonalPolylinePointsChangedEvent;
+import com.ait.lienzo.client.core.event.OrthogonalPolylinePointsChangedHandler;
 import com.ait.lienzo.client.core.shape.guides.IGuidePrimitive;
 import com.ait.lienzo.client.core.types.BoundingBox;
 import com.ait.lienzo.client.core.types.BoundingPoints;
@@ -1097,6 +1099,11 @@ public abstract class Node<T extends Node<T>> implements IDrawable<T> {
         return addEnsureHandler(NodeDragStartEvent.getType(), handler);
     }
 
+    @Override
+    public HandlerRegistration addOrthogonalPolylinePointsChangedHandler(OrthogonalPolylinePointsChangedHandler handler) {
+        return addEnsureHandler(OrthogonalPolylinePointsChangedEvent.getType(), handler);
+    }
+
     @Override
     public IAnimationHandle animate(final AnimationTweener tweener, final AnimationProperties properties, final double duration /* milliseconds */) {
         return new TweeningAnimation(this, tweener, properties, duration, null).run();
diff --git a/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/OrthogonalPolyLine.java b/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/OrthogonalPolyLine.java
index da7d8dc9f0..750a34efab 100644
--- a/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/OrthogonalPolyLine.java
+++ b/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/OrthogonalPolyLine.java
@@ -20,6 +20,7 @@ import java.util.List;
 
 import com.ait.lienzo.client.core.Attribute;
 import com.ait.lienzo.client.core.Context2D;
+import com.ait.lienzo.client.core.event.OrthogonalPolylinePointsChangedEvent;
 import com.ait.lienzo.client.core.types.BoundingBox;
 import com.ait.lienzo.client.core.types.PathPartList;
 import com.ait.lienzo.client.core.types.Point2D;
@@ -114,13 +115,22 @@ public class OrthogonalPolyLine extends AbstractDirectionalMultiPointShape<Ortho
                 }
             }
 
+            firePointsChangedEvent();
+
             return true;
         }
 
         m_computedPoint2DArray = null;
+
         return false;
     }
 
+    public void firePointsChangedEvent() {
+        OrthogonalPolylinePointsChangedEvent event = new OrthogonalPolylinePointsChangedEvent(getLayer().getElement());
+        event.override(m_computedPoint2DArray);
+        fireEvent(event);
+    }
+
     public final Point2DArray correctBreakDistance(Point2DArray points, double breakDistance) {
         Point2DArray cPoints = points.copy();
 
@@ -502,6 +512,9 @@ public class OrthogonalPolyLine extends AbstractDirectionalMultiPointShape<Ortho
 
         double y = p0y;
 
+        double break_distance_ratio = (Math.abs(dx) / Math.abs(dy)) * 2;
+        break_distance_ratio = Math.max(break_distance_ratio, 1.5d);
+
         if (behind) {
             // means p0 is behind.
             switch (tailDirection) {
@@ -512,7 +525,7 @@ public class OrthogonalPolyLine extends AbstractDirectionalMultiPointShape<Ortho
                             (dx > 0 && lastDirection == EAST) ||
                             (dx < 0 && lastDirection == WEST)) {
                         // A mid point is needed to ensure an attractive line is drawn.
-                        x = p0x + (dx / 2);
+                        x = p0x + (dx / break_distance_ratio);
                         addPoint(buffer, x, y, write);
 
                         if (lastDirection == NORTH || lastDirection == SOUTH) {
@@ -541,7 +554,7 @@ public class OrthogonalPolyLine extends AbstractDirectionalMultiPointShape<Ortho
                             (dy > 0 && lastDirection == SOUTH) ||
                             (dy < 0 && lastDirection == NORTH)) {
                         // A mid point is needed to ensure an attrictive line is drawn.
-                        y = p0y + (dy / 2);
+                        y = p0y + (dy / break_distance_ratio);
                         addPoint(buffer, x, y, write);
 
                         if (lastDirection == EAST || lastDirection == WEST) {
@@ -576,7 +589,7 @@ public class OrthogonalPolyLine extends AbstractDirectionalMultiPointShape<Ortho
                             (dx > 0 && lastDirection == WEST) ||
                             (dx < 0 && lastDirection == EAST)) {
                         // A mid point is needed to ensure an attrictive line is drawn.
-                        y = p0y + (dy / 2);
+                        y = p0y + (dy / break_distance_ratio);
                         addPoint(buffer, x, y, write);
 
                         if (lastDirection == EAST || lastDirection == WEST) {
@@ -602,7 +615,7 @@ public class OrthogonalPolyLine extends AbstractDirectionalMultiPointShape<Ortho
                             (dy > 0 && lastDirection == NORTH) ||
                             (dy < 0 && lastDirection == SOUTH)) {
                         // A mid point is needed to ensure an attrictive line is drawn.
-                        x = p0x + (dx / 2);
+                        x = p0x + (dx / break_distance_ratio);
                         addPoint(buffer, x, y, write);
 
                         if (lastDirection == NORTH || lastDirection == SOUTH) {
diff --git a/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/wires/types/JsWiresConnector.java b/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/wires/types/JsWiresConnector.java
index a96fa23759..5122aa1950 100644
--- a/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/wires/types/JsWiresConnector.java
+++ b/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/wires/types/JsWiresConnector.java
@@ -16,7 +16,11 @@
 
 package com.ait.lienzo.client.core.shape.wires.types;
 
+import com.ait.lienzo.client.core.shape.IDirectionalMultiPointShape;
+import com.ait.lienzo.client.core.shape.OrthogonalPolyLine;
 import com.ait.lienzo.client.core.shape.wires.WiresConnector;
+import com.ait.lienzo.client.core.types.Point2D;
+import com.ait.lienzo.tools.client.collection.NFastArrayList;
 import jsinterop.annotations.JsType;
 
 @JsType
@@ -35,4 +39,23 @@ public class JsWiresConnector {
     public JsWiresConnection getTailConnection() {
         return new JsWiresConnection(connector.getTailConnection());
     }
+
+    public NFastArrayList<Point2D> getConnectorPoints() {
+        final IDirectionalMultiPointShape<?> line = connector.getLine();
+        if (line instanceof OrthogonalPolyLine) {
+            return ((OrthogonalPolyLine) line).getComputedPoint2DArray().toNFastArrayList();
+        }
+        return connector.getLine().getPoint2DArray().toNFastArrayList();
+    }
+
+    public Double[] getConnectorPointsAsArray() {
+        NFastArrayList<Point2D> points = getConnectorPoints();
+        Double[] pointsArray = new Double[points.size() * 2];
+        int i = 0;
+        for (Point2D point : points.toList()) {
+            pointsArray[i++] = point.getX();
+            pointsArray[i++] = point.getY();
+        }
+        return pointsArray;
+    }
 }
diff --git a/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/wires/util/WiresConnectorLabel.java b/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/wires/util/WiresConnectorLabel.java
index 79307e3667..7a05f93742 100644
--- a/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/wires/util/WiresConnectorLabel.java
+++ b/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/wires/util/WiresConnectorLabel.java
@@ -1,5 +1,7 @@
 package com.ait.lienzo.client.core.shape.wires.util;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 
@@ -36,6 +38,7 @@ public class WiresConnectorLabel implements IDestroyable {
     private int maxChars = 15;
     private HandlerRegistration rectangleMouseEnterHandler;
     private HandlerRegistration rectangleMouseExitHandler;
+    private List<Point2D> orthogonalPoints;
     private static final String THREE_DOTS = "...";
 
     private final WiresConnectorPointsChangedHandler pointsUpdatedHandler = event -> {
@@ -69,6 +72,11 @@ public class WiresConnectorLabel implements IDestroyable {
         return this;
     }
 
+    public void setOrthogonalPoints(List<Point2D> orthogonalPoints) {
+        this.orthogonalPoints = orthogonalPoints;
+        batch();
+    }
+
     public void setRectangleColor(String color) {
         this.rectangleColor = color;
         paintRectangle(color);
@@ -159,8 +167,10 @@ public class WiresConnectorLabel implements IDestroyable {
                     text.setText(minText);
                 }
 
-                WiresConnectorLabelFactory.Segment segment = getLargestSegment(connector);
-                Point2D point = new Point2D((segment.getStart().getX() + segment.getEnd().getX()) / 2, (segment.getStart().getY() + segment.getEnd().getY()) / 2);
+                WiresConnectorLabelFactory.Segment segment = null != orthogonalPoints ?
+                        getLargestSegment(orthogonalPoints) : getLargestSegment(connector);
+                Point2D point = new Point2D((segment.getStart().getX() + segment.getEnd().getX()) / 2,
+                                            (segment.getStart().getY() + segment.getEnd().getY()) / 2);
 
                 double relativeWidth = text.getBoundingBox().getWidth();
                 double relativeHeight = text.getBoundingBox().getHeight();
@@ -228,16 +238,25 @@ public class WiresConnectorLabel implements IDestroyable {
     }
 
     protected static WiresConnectorLabelFactory.Segment getLargestSegment(WiresConnector connector) {
-        double maxLength = 0;
-
-        WiresConnectorLabelFactory.Segment segment = null;
-
+        List<Point2D> points = new ArrayList<>();
         for (int i = 0; i < connector.getPointHandles().size() - 1; i++) {
             IControlHandle control1 = connector.getPointHandles().getHandle(i);
             IControlHandle control2 = connector.getPointHandles().getHandle(i + 1);
+            points.add(new Point2D(control1.getControl().getX(), control1.getControl().getY()));
+            points.add(new Point2D(control2.getControl().getX(), control2.getControl().getY()));
+        }
+
+        return getLargestSegment(points);
+    }
+
+    protected static WiresConnectorLabelFactory.Segment getLargestSegment(final List<Point2D> points) {
+        double maxLength = 0;
+
+        WiresConnectorLabelFactory.Segment segment = null;
+        for (int i = 0; i < points.size() - 1; i++) {
 
-            Point2D point1 = new Point2D(control1.getControl().getX(), control1.getControl().getY());
-            Point2D point2 = new Point2D(control2.getControl().getX(), control2.getControl().getY());
+            Point2D point1 = points.get(i);
+            Point2D point2 = points.get(i + 1);
 
             double distance = point1.distance(point2);
             if (distance > maxLength) {
diff --git a/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/types/Point2DArray.java b/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/types/Point2DArray.java
index 78b3854391..914f09a167 100755
--- a/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/types/Point2DArray.java
+++ b/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/types/Point2DArray.java
@@ -21,6 +21,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 
+import com.ait.lienzo.tools.client.collection.NFastArrayList;
 import com.ait.lienzo.tools.client.collection.NFastDoubleArray;
 import elemental2.core.Global;
 import elemental2.core.JsIterable;
@@ -95,6 +96,15 @@ public class Point2DArray implements JsIterable<Point2D>,
         return points;
     }
 
+    @JsOverlay
+    public final NFastArrayList<Point2D> toNFastArrayList() {
+        NFastArrayList<Point2D> points = new NFastArrayList<>();
+        for (Point2D point : this.getPoints()) {
+            points.add(point);
+        }
+        return points;
+    }
+
 //    public Point2DArray(final double x, final double y)
 //    {
 //        this();
diff --git a/packages/serverless-workflow-diagram-editor/lienzo-tests/src/test/java/com/ait/lienzo/client/core/shape/OrthogonalPolyLineTest.java b/packages/serverless-workflow-diagram-editor/lienzo-tests/src/test/java/com/ait/lienzo/client/core/shape/OrthogonalPolyLineTest.java
index d95f05cabc..b999ca1438 100644
--- a/packages/serverless-workflow-diagram-editor/lienzo-tests/src/test/java/com/ait/lienzo/client/core/shape/OrthogonalPolyLineTest.java
+++ b/packages/serverless-workflow-diagram-editor/lienzo-tests/src/test/java/com/ait/lienzo/client/core/shape/OrthogonalPolyLineTest.java
@@ -5,6 +5,7 @@ import com.ait.lienzo.client.core.types.Point2D;
 import com.ait.lienzo.client.core.types.Point2DArray;
 import com.ait.lienzo.shared.core.types.Direction;
 import com.ait.lienzo.test.LienzoMockitoTestRunner;
+import elemental2.dom.HTMLDivElement;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -17,7 +18,10 @@ import static com.ait.lienzo.shared.core.types.Direction.SOUTH;
 import static com.ait.lienzo.shared.core.types.Direction.WEST;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 @RunWith(LienzoMockitoTestRunner.class)
@@ -36,16 +40,22 @@ public class OrthogonalPolyLineTest {
 
     @Test
     public void testParse() {
+        Layer layer = mock(Layer.class);
+        HTMLDivElement element = mock(HTMLDivElement.class);
         Point2DArray points = new Point2DArray();
         OrthogonalPolyLine polyLine = spy(new OrthogonalPolyLine(points));
 
+        when(polyLine.getLayer()).thenReturn(layer);
+        when(layer.getElement()).thenReturn(element);
         when(polyLine.getControlPoints()).thenReturn(points);
         when(polyLine.getHeadDirection()).thenReturn(NONE);
         when(polyLine.getTailDirection()).thenReturn(NONE);
 
         points.push(new Point2D(0, 0));
         points.push(new Point2D(5, 5));
+
         assertTrue(polyLine.parse());
+        verify(polyLine, times(1)).firePointsChangedEvent();
     }
 
     @Test
diff --git a/packages/serverless-workflow-diagram-editor/lienzo-tests/src/test/java/com/ait/lienzo/client/core/shape/wires/WiresConnectionTest.java b/packages/serverless-workflow-diagram-editor/lienzo-tests/src/test/java/com/ait/lienzo/client/core/shape/wires/WiresConnectionTest.java
index db32cf1c16..a359471486 100644
--- a/packages/serverless-workflow-diagram-editor/lienzo-tests/src/test/java/com/ait/lienzo/client/core/shape/wires/WiresConnectionTest.java
+++ b/packages/serverless-workflow-diagram-editor/lienzo-tests/src/test/java/com/ait/lienzo/client/core/shape/wires/WiresConnectionTest.java
@@ -36,6 +36,8 @@ import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+// TODO: Merge last changes from Kirill in this test class.
+
 @RunWith(LienzoMockitoTestRunner.class)
 public class WiresConnectionTest {
 
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/autolayout/AutoLayout.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/autolayout/AutoLayout.java
index 7fdb215863..4b5f516480 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/autolayout/AutoLayout.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/autolayout/AutoLayout.java
@@ -28,7 +28,6 @@ import com.ait.lienzo.client.core.layout.VertexPosition;
 import com.ait.lienzo.client.core.layout.graph.OutgoingEdge;
 import com.ait.lienzo.client.core.layout.graph.Vertex;
 import com.ait.lienzo.client.core.types.Point2D;
-import elemental2.dom.DomGlobal;
 import elemental2.promise.Promise;
 import org.kie.workbench.common.stunner.core.command.CommandResult;
 import org.kie.workbench.common.stunner.core.command.impl.CompositeCommand;
@@ -46,6 +45,7 @@ import org.kie.workbench.common.stunner.core.graph.content.relationship.Child;
 import org.kie.workbench.common.stunner.core.graph.content.view.ControlPoint;
 import org.kie.workbench.common.stunner.core.graph.content.view.MagnetConnection;
 import org.kie.workbench.common.stunner.core.graph.content.view.View;
+import org.kie.workbench.common.stunner.core.graph.content.view.ViewConnector;
 import org.kie.workbench.common.stunner.core.graph.processing.traverse.content.ChildrenTraverseCallback;
 import org.kie.workbench.common.stunner.core.graph.processing.traverse.content.ChildrenTraverseProcessorImpl;
 import org.kie.workbench.common.stunner.core.graph.processing.traverse.content.ContentTraverseCallback;
@@ -53,10 +53,13 @@ import org.kie.workbench.common.stunner.core.graph.processing.traverse.content.V
 import org.kie.workbench.common.stunner.core.graph.processing.traverse.tree.TreeWalkTraverseProcessorImpl;
 import org.kie.workbench.common.stunner.core.rule.RuleViolation;
 import org.kie.workbench.common.stunner.sw.autolayout.lienzo.LienzoAutoLayout;
+import org.kie.workbench.common.stunner.sw.definition.End;
 import org.uberfire.client.promise.Promises;
 
 public class AutoLayout {
 
+    public static final double X_DEVIATION = 102d;
+
     private AutoLayout() {
         // Private constructor to prevent instantiation
     }
@@ -87,17 +90,246 @@ public class AutoLayout {
                             new CompositeCommand.Builder<>()
                                     .addCommand(layoutCommands.build())
                                     .build();
-
                     all.execute(context);
+
+                    moveEndNodesX(graph, X_DEVIATION);
+
+                    applyOrthogonalLinesBehaviour(graph);
+
                     resolve.onInvoke(parentNode);
                     return null;
                 }, error -> {
-                    DomGlobal.console.error("Error while performing layout: " + error);
                     resolve.onInvoke(parentNode);
                     return null;
                 }));
     }
 
+    @SuppressWarnings("all")
+    static void moveEndNodesX(Graph graph, final double x) {
+        Iterable<Node> nodes = graph.nodes();
+        nodes.forEach(node -> {
+            if (node.getContent() instanceof View) {
+                final View content = (View) node.getContent();
+                if (content.getDefinition() instanceof End) {
+                    final Bounds bounds = content.getBounds();
+                    final Bounds newBounds = Bounds.create(bounds.getUpperLeft().getX() + x,
+                                                           bounds.getUpperLeft().getY(),
+                                                           bounds.getLowerRight().getX() + x,
+                                                           bounds.getLowerRight().getY());
+                    content.setBounds(newBounds);
+                }
+            }
+        });
+    }
+
+    @SuppressWarnings("all")
+    static void applyOrthogonalLinesBehaviour(Graph graph) {
+        Iterable<Node> nodes = graph.nodes();
+        nodes.forEach(node -> {
+            if (node.getContent() instanceof View) {
+                final List<Edge> inEdges = (List<Edge>) node.getInEdges().stream()
+                        .filter(e -> ((Edge) e).getContent() instanceof ViewConnector)
+                        .collect(Collectors.toList());
+                final List<Edge> outEdges = (List<Edge>) node.getOutEdges().stream()
+                        .filter(e -> ((Edge) e).getContent() instanceof ViewConnector)
+                        .collect(Collectors.toList());
+
+                // Incoming connections
+                adjustIncomingConnections(node, inEdges);
+
+                // Outgoing connections
+                adjustOutgoingConnections(node, inEdges, outEdges);
+            }
+        });
+    }
+
+    @SuppressWarnings("all")
+    static void adjustIncomingConnections(final Node node, final List<Edge> inEdges) {
+        if (inEdges.size() >= 1) {
+            for (int i = 0; i < inEdges.size(); i++) {
+                Edge edge = inEdges.get(i);
+                ViewConnector content = (ViewConnector) edge.getContent();
+                MagnetConnection sourceConnection = (MagnetConnection) content.getSourceConnection().get();
+                MagnetConnection targetConnection = (MagnetConnection) content.getTargetConnection().get();
+                org.kie.workbench.common.stunner.core.graph.content.view.Point2D sourceLocation = sourceConnection.getLocation();
+                org.kie.workbench.common.stunner.core.graph.content.view.Point2D targetLocation = targetConnection.getLocation();
+                ControlPoint[] controlPoints = content.getControlPoints();
+                Node sourceNode = edge.getSourceNode();
+                View sourceContent = (View) sourceNode.getContent();
+                Bounds sourceBounds = sourceContent.getBounds();
+                Node targetNode = edge.getTargetNode();
+                View targetContent = (View) targetNode.getContent();
+                Bounds targetBounds = targetContent.getBounds();
+
+                if (isBackwards(sourceBounds.getY(), targetBounds.getY())) {
+                    adjustBackwardConnections(sourceConnection,
+                                              targetConnection,
+                                              controlPoints.length,
+                                              inEdges.size());
+                } else if (controlPoints.length == 0) {
+                    adjustConnectionWithoutControlPoints(i,
+                                                         sourceNode,
+                                                         targetConnection,
+                                                         inEdges);
+                }
+            }
+        }
+    }
+
+    @SuppressWarnings("all")
+    static void adjustOutgoingConnections(final Node node,
+                                          final List<Edge> inEdges,
+                                          final List<Edge> outEdges) {
+        if (node.getContent() instanceof View) {
+            if (outEdges.size() >= 1) {
+                for (int i = 0; i < outEdges.size(); i++) {
+                    Edge edge = outEdges.get(i);
+                    ViewConnector content = (ViewConnector) edge.getContent();
+                    MagnetConnection sourceConnection = (MagnetConnection) content.getSourceConnection().get();
+                    MagnetConnection targetConnection = (MagnetConnection) content.getTargetConnection().get();
+                    org.kie.workbench.common.stunner.core.graph.content.view.Point2D sourceLocation = sourceConnection.getLocation();
+                    org.kie.workbench.common.stunner.core.graph.content.view.Point2D targetLocation = targetConnection.getLocation();
+                    ControlPoint[] controlPoints = content.getControlPoints();
+                    Node sourceNode = edge.getSourceNode();
+                    View sourceContent = (View) sourceNode.getContent();
+                    Bounds sourceBounds = sourceContent.getBounds();
+                    Node targetNode = edge.getTargetNode();
+                    View targetContent = (View) targetNode.getContent();
+                    Bounds targetBounds = targetContent.getBounds();
+
+                    // Handle connection / magnet default settings.
+                    if (outEdges.size() == 1) {
+                        sourceConnection.setAuto(false);
+                        sourceConnection.setIndex(MagnetConnection.MAGNET_BOTTOM);
+                    } else {
+                        sourceConnection.setAuto(false);
+                        sourceConnection.setIndex(MagnetConnection.MAGNET_CENTER);
+                    }
+
+                    // Handle backward connections to upper layer
+                    if (isBackwards(sourceBounds.getY(), targetBounds.getY())) {
+                        adjustBackwardConnections(sourceConnection,
+                                                  targetConnection,
+                                                  controlPoints.length,
+                                                  outEdges.size());
+                    } else if (controlPoints.length == 0) {
+                        // handle connections without CPs
+                        adjustConnectionWithoutControlPoints(i,
+                                                             sourceNode,
+                                                             targetConnection,
+                                                             inEdges);
+                    }
+
+                    // Handle connections crossing several (>1) layers.
+                    adjustConnectionsCrossingMultipleLayers(i,
+                                                            content,
+                                                            controlPoints,
+                                                            sourceBounds,
+                                                            targetBounds,
+                                                            sourceConnection,
+                                                            targetConnection);
+                }
+            }
+        }
+    }
+
+    // Handle connectors crossing several (>1) layers.
+    static void adjustConnectionsCrossingMultipleLayers(final int edgeIndex,
+                                                        final ViewConnector content,
+                                                        final ControlPoint[] controlPoints,
+                                                        final Bounds sourceBounds,
+                                                        final Bounds targetBounds,
+                                                        MagnetConnection sourceConnection,
+                                                        MagnetConnection targetConnection) {
+        if (controlPoints.length > 0) {
+            double padding = 40d;
+            double maxx = 0;
+            for (int j = 0; j < controlPoints.length; j++) {
+                if (j == 0) {
+                    boolean isTopBottom = sourceBounds.getY() < controlPoints[j].getLocation().getY();
+                    double ty = sourceBounds.getY() +
+                            ((padding / 2) * edgeIndex) +
+                            (isTopBottom ? sourceBounds.getHeight() + padding : -padding);
+                    controlPoints[j].getLocation().setY(ty);
+                    sourceConnection.setIndex(MagnetConnection.MAGNET_BOTTOM);
+                    sourceConnection.setAuto(false);
+                } else if (j == controlPoints.length - 1) {
+                    boolean isTopBottom = targetBounds.getY() < controlPoints[j].getLocation().getY();
+                    double ty = targetBounds.getY() +
+                            -(padding * edgeIndex) +
+                            (isTopBottom ? targetBounds.getHeight() + padding : -padding);
+                    controlPoints[j].getLocation().setY(ty);
+                    targetConnection.setIndex(MagnetConnection.MAGNET_CENTER);
+                    targetConnection.setAuto(false);
+                }
+
+                ControlPoint cp = controlPoints[j];
+                if (cp.getLocation().getX() > maxx) {
+                    maxx = cp.getLocation().getX();
+                    for (int k = j; k >= 0; k--) {
+                        controlPoints[k].getLocation().setX(maxx);
+                    }
+                }
+                cp.getLocation().setX(maxx);
+            }
+
+            content.setControlPoints(new ControlPoint[]{
+                    controlPoints[0].copy(),
+                    controlPoints[controlPoints.length - 1].copy()
+            });
+        }
+    }
+
+    // check if the connector points up
+    static boolean isBackwards(final double sourceY, final double targetY) {
+        return sourceY > targetY;
+    }
+
+    // Handle backward connections to upper layer (may overlap with incoming connectors, if any).
+    static void adjustBackwardConnections(final MagnetConnection sourceConnection,
+                                          final MagnetConnection targetConnection,
+                                          final int controlPointsCount,
+                                          final int edgesCount) {
+        if (edgesCount > 0) {
+            if (controlPointsCount == 0) {
+                sourceConnection.setAuto(false);
+                sourceConnection.setIndex(MagnetConnection.MAGNET_LEFT);
+            }
+            targetConnection.setAuto(false);
+            targetConnection.setIndex(MagnetConnection.MAGNET_CENTER);
+        }
+    }
+
+    static void adjustConnectionWithoutControlPoints(final int edgeIndex,
+                                                     final Node sourceNode,
+                                                     final MagnetConnection targetConnection,
+                                                     final List<Edge> inEdges) {
+        if (inEdges.size() == 1) {
+            targetConnection.setAuto(false);
+            targetConnection.setIndex(MagnetConnection.MAGNET_TOP);
+        } else if (isSameSource(sourceNode, inEdges, edgeIndex)) {
+            // Node with more than one connector with same target
+            targetConnection.setAuto(false);
+            targetConnection.setIndex(MagnetConnection.MAGNET_TOP);
+        } else {
+            targetConnection.setAuto(false);
+            targetConnection.setIndex(MagnetConnection.MAGNET_CENTER);
+        }
+    }
+
+    @SuppressWarnings("all")
+    static boolean isSameSource(final Node sourceNode, final List<Edge> inEdges, final int currentIndex) {
+        for (int k = currentIndex; k < inEdges.size(); k++) {
+            if (k != currentIndex) {
+                Node tempNode = inEdges.get(k).getSourceNode();
+                if (sourceNode == tempNode) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
     static void hideNodeIfIsNotConnected(final Layout layout,
                                          final String nodeId,
                                          final Graph graph,
@@ -114,6 +346,7 @@ public class AutoLayout {
         }
     }
 
+    @SuppressWarnings("all")
     private static void deleteNode(Node parentNode, String nodeId, Graph graph) {
         final Optional outParent = parentNode.getOutEdges().stream()
                 .filter(outEdge -> Objects.equals(((Edge) outEdge).getTargetNode().getUUID(), nodeId))
@@ -166,6 +399,7 @@ public class AutoLayout {
         }
     }
 
+    @SuppressWarnings("all")
     private static void updateTargetMagnet(final CompositeCommand.Builder layoutCommands,
                                            final com.ait.lienzo.client.core.layout.Edge outgoingEdge,
                                            final String edgeIUd,
@@ -187,6 +421,7 @@ public class AutoLayout {
         });
     }
 
+    @SuppressWarnings("all")
     private static void updateSourceMagnet(final CompositeCommand.Builder layoutCommands,
                                            final com.ait.lienzo.client.core.layout.Edge outgoingEdge,
                                            final String edgeIUd,
@@ -231,6 +466,7 @@ public class AutoLayout {
         return Position.BELOW;
     }
 
+    @SuppressWarnings("all")
     public static void createControlPoints(final Layout layout,
                                            final CompositeCommand.Builder layoutCommands) {
 
@@ -239,7 +475,9 @@ public class AutoLayout {
                 int index = -1;
                 for (final Point2D bendingPoint : outgoingEdge.getBendingPoints()) {
                     final org.kie.workbench.common.stunner.core.graph.content.view.Point2D point = new org.kie.workbench.common.stunner.core.graph.content.view.Point2D(bendingPoint.getX(), bendingPoint.getY());
-                    layoutCommands.addCommand(new AddControlPointCommand(outgoingEdge.getId(), new ControlPoint(point), ++index));
+                    ControlPoint cp = new ControlPoint(point);
+                    AddControlPointCommand command = new AddControlPointCommand(outgoingEdge.getId(), cp, ++index);
+                    layoutCommands.addCommand(command);
                 }
             }
         }
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/BuilderContext.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/BuilderContext.java
index d44ec6aabf..97a51bbcf1 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/BuilderContext.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/BuilderContext.java
@@ -221,7 +221,7 @@ public class BuilderContext {
         if (Start.class.equals(type)) {
             return new double[]{54d, 54d};
         } else if (End.class.equals(type)) {
-            return new double[]{50d, 50d};
+            return new double[]{254d, 92d};
         } else if (EventRef.class.equals(type)) {
             return new double[]{56d, 56d};
         } else if (EventState.class.equals(type)) {
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/Marshaller.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/Marshaller.java
index 2d8e9a6226..a7a2e73a29 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/Marshaller.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/Marshaller.java
@@ -116,7 +116,6 @@ public class Marshaller {
 
     private final Workflow_JsonMapperImpl mapper = Workflow_JsonMapperImpl.INSTANCE;
 
-
     @Inject
     public Marshaller(DefinitionManager definitionManager,
                       FactoryManager factoryManager,
@@ -238,7 +237,7 @@ public class Marshaller {
         }
     }
 
-    private String getEndNodeUuid(final GraphImpl<Object> graph) {
+    public static String getEndNodeUuid(final GraphImpl<Object> graph) {
 
         final Optional<Node> endNode = StreamSupport.stream(graph.nodes().spliterator(), false)
                 .filter(Marshaller::isEndState)
@@ -251,7 +250,7 @@ public class Marshaller {
         return null;
     }
 
-    private String getStartNodeUuid(final GraphImpl<Object> graph) {
+    public static String getStartNodeUuid(final GraphImpl<Object> graph) {
 
         final Optional<Node> startNode = StreamSupport.stream(graph.nodes().spliterator(), false)
                 .filter(Marshaller::isStartState)
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/StateMarshalling.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/StateMarshalling.java
index 42241df6f3..67db16f418 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/StateMarshalling.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/StateMarshalling.java
@@ -23,6 +23,7 @@ import org.kie.workbench.common.stunner.core.graph.Edge;
 import org.kie.workbench.common.stunner.core.graph.Node;
 import org.kie.workbench.common.stunner.core.graph.content.relationship.Dock;
 import org.kie.workbench.common.stunner.core.graph.content.view.ViewConnector;
+import org.kie.workbench.common.stunner.core.util.UUID;
 import org.kie.workbench.common.stunner.sw.definition.ActionNode;
 import org.kie.workbench.common.stunner.sw.definition.ActionTransition;
 import org.kie.workbench.common.stunner.sw.definition.ActionsContainer;
@@ -30,6 +31,7 @@ import org.kie.workbench.common.stunner.sw.definition.CallbackState;
 import org.kie.workbench.common.stunner.sw.definition.CompensationTransition;
 import org.kie.workbench.common.stunner.sw.definition.DataConditionTransition;
 import org.kie.workbench.common.stunner.sw.definition.DefaultConditionTransition;
+import org.kie.workbench.common.stunner.sw.definition.End;
 import org.kie.workbench.common.stunner.sw.definition.ErrorTransition;
 import org.kie.workbench.common.stunner.sw.definition.EventConditionTransition;
 import org.kie.workbench.common.stunner.sw.definition.EventRef;
@@ -45,7 +47,6 @@ import org.kie.workbench.common.stunner.sw.marshall.Marshaller.NodeUnmarshaller;
 
 import static org.kie.workbench.common.stunner.sw.marshall.DefinitionTypeUtils.getEnd;
 import static org.kie.workbench.common.stunner.sw.marshall.DefinitionTypeUtils.getTransition;
-import static org.kie.workbench.common.stunner.sw.marshall.Marshaller.STATE_END;
 import static org.kie.workbench.common.stunner.sw.marshall.Marshaller.marshallEdge;
 import static org.kie.workbench.common.stunner.sw.marshall.Marshaller.unmarshallEdge;
 import static org.kie.workbench.common.stunner.sw.marshall.MarshallerUtils.getElementDefinition;
@@ -71,8 +72,12 @@ public interface StateMarshalling {
                 // Parse end.
                 boolean end = getEnd(state.getEnd());
                 if (end) {
+                    final End endBean = new End();
+                    String endName = UUID.uuid();
+                    Node endNode = context.addNode(endName, endBean);
+
                     final Transition tend = new Transition();
-                    tend.setTo(STATE_END);
+                    tend.setTo(endName);
                     Edge tendEdge = unmarshallEdge(context, tend);
                 }
 
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/TransitionMarshalling.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/TransitionMarshalling.java
index c3b93c71f1..e673f0aeff 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/TransitionMarshalling.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/TransitionMarshalling.java
@@ -18,6 +18,7 @@ package org.kie.workbench.common.stunner.sw.marshall;
 
 import org.kie.workbench.common.stunner.core.graph.Edge;
 import org.kie.workbench.common.stunner.core.graph.Node;
+import org.kie.workbench.common.stunner.core.util.UUID;
 import org.kie.workbench.common.stunner.sw.definition.CompensationTransition;
 import org.kie.workbench.common.stunner.sw.definition.DataConditionTransition;
 import org.kie.workbench.common.stunner.sw.definition.DefaultConditionTransition;
@@ -36,7 +37,6 @@ import org.kie.workbench.common.stunner.sw.marshall.Marshaller.EdgeUnmarshaller;
 import static org.kie.workbench.common.stunner.sw.marshall.DefinitionTypeUtils.getEnd;
 import static org.kie.workbench.common.stunner.sw.marshall.DefinitionTypeUtils.getTransition;
 import static org.kie.workbench.common.stunner.sw.marshall.Marshaller.EDGE_START;
-import static org.kie.workbench.common.stunner.sw.marshall.Marshaller.STATE_END;
 import static org.kie.workbench.common.stunner.sw.marshall.MarshallerUtils.getElementDefinition;
 import static org.kie.workbench.common.stunner.sw.marshall.MarshallerUtils.getStateNodeName;
 import static org.kie.workbench.common.stunner.sw.marshall.MarshallerUtils.isValidString;
@@ -124,7 +124,10 @@ public interface TransitionMarshalling {
 
                 Edge edge = null;
                 if (end) {
-                    edge = context.addEdgeToTargetName(dataConditionTransition, context.sourceNode, STATE_END);
+                    final End endBean = new End();
+                    String endName = UUID.uuid();
+                    Node endNode = context.addNode(endName, endBean);
+                    edge = context.addEdgeToTargetName(dataConditionTransition, context.sourceNode, endName);
                 } else if (isValidString(transition)) {
                     edge = context.addEdgeToTargetName(dataConditionTransition, context.sourceNode, transition);
                 }
@@ -169,7 +172,10 @@ public interface TransitionMarshalling {
 
                 Edge edge = null;
                 if (end) {
-                    edge = context.addEdgeToTargetName(defaultConditionTransition, context.sourceNode, STATE_END);
+                    final End endBean = new End();
+                    String endName = UUID.uuid();
+                    Node endNode = context.addNode(endName, endBean);
+                    edge = context.addEdgeToTargetName(defaultConditionTransition, context.sourceNode, endName);
                 } else if (isValidString(transition)) {
                     edge = context.addEdgeToTargetName(defaultConditionTransition, context.sourceNode, transition);
                 }
@@ -215,7 +221,10 @@ public interface TransitionMarshalling {
 
                 Edge edge = null;
                 if (end) {
-                    edge = context.addEdgeToTargetName(errorTransition, context.sourceNode, STATE_END);
+                    final End endBean = new End();
+                    String endName = UUID.uuid();
+                    Node endNode = context.addNode(endName, endBean);
+                    edge = context.addEdgeToTargetName(errorTransition, context.sourceNode, endName);
                 } else if (isValidString(transition)) {
                     edge = context.addEdgeToTargetName(errorTransition, context.sourceNode, transition);
                 }
@@ -241,7 +250,7 @@ public interface TransitionMarshalling {
                             if (errorTransition.getTransition() instanceof String) {
                                 errorTransition.setTransition(getStateNodeName(targetNode));
                             } else {
-                                ((StateTransition)errorTransition.getTransition())
+                                ((StateTransition) errorTransition.getTransition())
                                         .setNextState(getStateNodeName(targetNode));
                             }
 
@@ -261,7 +270,10 @@ public interface TransitionMarshalling {
 
                 Edge edge = null;
                 if (end) {
-                    edge = context.addEdgeToTargetName(eventConditionTransition, context.sourceNode, STATE_END);
+                    final End endBean = new End();
+                    String endName = UUID.uuid();
+                    Node endNode = context.addNode(endName, endBean);
+                    edge = context.addEdgeToTargetName(eventConditionTransition, context.sourceNode, endName);
                 } else if (isValidString(transition)) {
                     edge = context.addEdgeToTargetName(eventConditionTransition, context.sourceNode, transition);
                 }
@@ -269,7 +281,6 @@ public interface TransitionMarshalling {
                 return edge;
             };
 
-
     EdgeMarshaller<EventConditionTransition> EVENT_CONDITION_TRANSITION_MARSHALLER =
             (context, edge) -> {
                 Node sourceNode = edge.getSourceNode();
@@ -336,5 +347,4 @@ public interface TransitionMarshalling {
 
                 return edge;
             };
-
 }
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/WorkflowMarshalling.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/WorkflowMarshalling.java
index e83cf63b26..441dfc7d4f 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/WorkflowMarshalling.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/WorkflowMarshalling.java
@@ -25,7 +25,6 @@ import org.kie.workbench.common.stunner.core.graph.content.Bounds;
 import org.kie.workbench.common.stunner.core.graph.content.view.View;
 import org.kie.workbench.common.stunner.core.util.StringUtils;
 import org.kie.workbench.common.stunner.core.util.UUID;
-import org.kie.workbench.common.stunner.sw.definition.End;
 import org.kie.workbench.common.stunner.sw.definition.Start;
 import org.kie.workbench.common.stunner.sw.definition.StartTransition;
 import org.kie.workbench.common.stunner.sw.definition.State;
@@ -34,7 +33,6 @@ import org.kie.workbench.common.stunner.sw.marshall.Marshaller.NodeMarshaller;
 import org.kie.workbench.common.stunner.sw.marshall.Marshaller.NodeUnmarshaller;
 
 import static org.kie.workbench.common.stunner.core.graph.util.GraphUtils.getChildNodes;
-import static org.kie.workbench.common.stunner.sw.marshall.Marshaller.STATE_END;
 import static org.kie.workbench.common.stunner.sw.marshall.Marshaller.STATE_START;
 import static org.kie.workbench.common.stunner.sw.marshall.Marshaller.hasNodeMarshaller;
 import static org.kie.workbench.common.stunner.sw.marshall.Marshaller.isEndState;
@@ -77,13 +75,6 @@ public interface WorkflowMarshalling {
                 return workflow;
             };
 
-    NodeUnmarshaller<Workflow> END_NODE_UNMARSHALLER =
-            (context, workflow) -> {
-                final End endBean = new End();
-                Node endNode = context.addNode(STATE_END, endBean);
-                return endNode;
-            };
-
     NodeUnmarshaller<Workflow> WORKFLOW_UNMARSHALLER =
             (context, workflow) -> {
                 String workflowId = workflow.getId() != null ? workflow.getId() : workflow.getKey();
@@ -100,9 +91,6 @@ public interface WorkflowMarshalling {
                 // Start state.
                 START_NODE_UNMARSHALLER.unmarshall(context, workflow);
 
-                // End state.
-                END_NODE_UNMARSHALLER.unmarshall(context, workflow);
-
                 // States.
                 final State[] states = workflow.getStates();
                 for (int i = 0; i < states.length; i++) {
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/autolayout/AutoLayoutTest.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/autolayout/AutoLayoutTest.java
new file mode 100644
index 0000000000..3e060e999b
--- /dev/null
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/autolayout/AutoLayoutTest.java
@@ -0,0 +1,390 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.kie.workbench.common.stunner.sw.autolayout;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import com.ait.lienzo.client.core.layout.Layout;
+import com.ait.lienzo.client.core.layout.graph.Vertex;
+import org.junit.Test;
+import org.kie.workbench.common.stunner.core.command.impl.CompositeCommand;
+import org.kie.workbench.common.stunner.core.graph.Edge;
+import org.kie.workbench.common.stunner.core.graph.Node;
+import org.kie.workbench.common.stunner.core.graph.command.DirectGraphCommandExecutionContext;
+import org.kie.workbench.common.stunner.core.graph.command.GraphCommandExecutionContext;
+import org.kie.workbench.common.stunner.core.graph.content.Bounds;
+import org.kie.workbench.common.stunner.core.graph.content.view.ControlPoint;
+import org.kie.workbench.common.stunner.core.graph.content.view.MagnetConnection;
+import org.kie.workbench.common.stunner.core.graph.content.view.View;
+import org.kie.workbench.common.stunner.core.graph.content.view.ViewConnector;
+import org.kie.workbench.common.stunner.core.graph.impl.GraphImpl;
+import org.kie.workbench.common.stunner.core.rule.RuleViolation;
+import org.kie.workbench.common.stunner.sw.autolayout.lienzo.LienzoAutoLayout;
+import org.kie.workbench.common.stunner.sw.definition.DataConditionTransition;
+import org.kie.workbench.common.stunner.sw.definition.DefaultConditionTransition;
+import org.kie.workbench.common.stunner.sw.definition.End;
+import org.kie.workbench.common.stunner.sw.definition.InjectState;
+import org.kie.workbench.common.stunner.sw.definition.OperationState;
+import org.kie.workbench.common.stunner.sw.definition.State;
+import org.kie.workbench.common.stunner.sw.definition.SwitchState;
+import org.kie.workbench.common.stunner.sw.definition.Workflow;
+import org.kie.workbench.common.stunner.sw.marshall.BaseMarshallingTest;
+import org.kie.workbench.common.stunner.sw.marshall.Marshaller;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotSame;
+
+public class AutoLayoutTest extends BaseMarshallingTest {
+
+    private static final String WORKFLOW_ID = "workflow1";
+    private static final String WORKFLOW_NAME = "Workflow1";
+
+    @Override
+    protected Workflow createWorkflow() {
+        // States
+        SwitchState chooseOnLanguage = new SwitchState();
+        chooseOnLanguage.setName("ChooseOnLanguage");
+
+        InjectState greetInEnglish = new InjectState();
+        greetInEnglish.setName("GreetInEnglish");
+
+        InjectState greetInSpanish = new InjectState();
+        greetInSpanish.setName("GreetInSpanish");
+
+        InjectState greetInGerman = new InjectState();
+        greetInGerman.setName("GreetInGerman");
+        greetInGerman.setEnd(true);
+
+        InjectState greetUnknown = new InjectState();
+        greetUnknown.setName("GreetUnknown");
+
+        InjectState figureOut = new InjectState();
+        figureOut.setName("FigureOut");
+
+        OperationState greetPerson = new OperationState();
+        greetPerson.setName("GreetPerson");
+        greetInGerman.setEnd(true);
+
+        // Switch state transitions
+        DefaultConditionTransition ChooseOnLanguageDefaultTransition = new DefaultConditionTransition();
+        ChooseOnLanguageDefaultTransition.setTransition("GreetInEnglish");
+        DataConditionTransition chooseOnLanguageEnglishTransition = new DataConditionTransition();
+        chooseOnLanguageEnglishTransition.setTransition("GreetInEnglish");
+        chooseOnLanguageEnglishTransition.setCondition("${ .language == \\\"English\\\" }\"");
+        DataConditionTransition chooseOnLanguageSpanishTransition = new DataConditionTransition();
+        chooseOnLanguageSpanishTransition.setTransition("GreetInSpanish");
+        chooseOnLanguageSpanishTransition.setCondition("${ .language == \"Spanish\" }");
+        DataConditionTransition chooseOnLanguageGermanTransition = new DataConditionTransition();
+        chooseOnLanguageGermanTransition.setTransition("GreetInGerman");
+        chooseOnLanguageGermanTransition.setCondition("${ .language == \"German\" }");
+        DataConditionTransition chooseOnLanguageInformalTransition = new DataConditionTransition();
+        chooseOnLanguageInformalTransition.setTransition("GreetPerson");
+        chooseOnLanguageInformalTransition.setCondition("${ .language == \"Informal\" }");
+        DataConditionTransition chooseOnLanguageUnknownTransition = new DataConditionTransition();
+        chooseOnLanguageUnknownTransition.setTransition("GreetUnknown");
+        chooseOnLanguageUnknownTransition.setCondition("${ .language == \"Unknown\" }");
+        DataConditionTransition[] ChooseOnLanguageDataConditionTransitions = new DataConditionTransition[]{
+                chooseOnLanguageEnglishTransition,
+                chooseOnLanguageSpanishTransition,
+                chooseOnLanguageGermanTransition,
+                chooseOnLanguageInformalTransition,
+                chooseOnLanguageUnknownTransition
+        };
+
+        // Set transitions
+        chooseOnLanguage.setDefaultCondition(ChooseOnLanguageDefaultTransition);
+        chooseOnLanguage.setDataConditions(ChooseOnLanguageDataConditionTransitions);
+        greetInEnglish.setTransition("GreetPerson");
+        greetInSpanish.setTransition("GreetPerson");
+        greetUnknown.setTransition("FigureOut");
+        // Backward connection
+        figureOut.setTransition("ChooseOnLanguage");
+
+        return new Workflow()
+                .setId(WORKFLOW_ID)
+                .setName(WORKFLOW_NAME)
+                .setStart("ChooseOnLanguage")
+                .setStates(new State[]{
+                        chooseOnLanguage,
+                        greetInEnglish,
+                        greetInSpanish,
+                        greetInGerman,
+                        greetUnknown,
+                        figureOut,
+                        greetPerson
+                });
+    }
+
+    @SuppressWarnings("all")
+    @Override
+    public void setUp() {
+        super.setUp();
+
+        unmarshallWorkflow();
+
+        // Apply auto-layout post processing
+        final String startNodeUuid = Marshaller.getStartNodeUuid((GraphImpl) getGraph());
+        final String endNodeUuid = Marshaller.getEndNodeUuid((GraphImpl) getGraph());
+        final Map<String, Vertex> vertices = AutoLayout.loadVertices(getGraph(),
+                                                                     context.getWorkflowRootNode(),
+                                                                     false);
+        final LienzoAutoLayout autoLayout = new LienzoAutoLayout();
+        final Layout layout = autoLayout.processGraph(getGraph(), vertices, startNodeUuid, endNodeUuid);
+        final CompositeCommand.Builder layoutCommands = new CompositeCommand.Builder();
+        AutoLayout.updateEdgesDirection(layout, layoutCommands);
+        AutoLayout.createControlPoints(layout, layoutCommands);
+        AutoLayout.hideNodeIfIsNotConnected(layout, startNodeUuid, getGraph(), context.getWorkflowRootNode());
+        AutoLayout.hideNodeIfIsNotConnected(layout, endNodeUuid, getGraph(), context.getWorkflowRootNode());
+        final CompositeCommand<GraphCommandExecutionContext, RuleViolation> all =
+                new CompositeCommand.Builder<>()
+                        .addCommand(layoutCommands.build())
+                        .build();
+
+        final DirectGraphCommandExecutionContext graphContext = builderContext.buildExecutionContext();
+        all.execute(graphContext);
+    }
+
+    @Test
+    public void testMoveEndNodesX() {
+        Iterable<Node> nodes = (Iterable<Node>) getGraph().nodes();
+        Map<String, Bounds> endBoundsBefore = new HashMap<>();
+        nodes.forEach(node -> {
+            if (node.getContent() instanceof View) {
+                final View content = (View) node.getContent();
+                if (content.getDefinition() instanceof End) {
+                    End end = (End) content.getDefinition();
+                    endBoundsBefore.put(end.getName(), content.getBounds());
+                }
+            }
+        });
+
+        // Move End nodes X
+        AutoLayout.moveEndNodesX(getGraph(), AutoLayout.X_DEVIATION);
+
+        nodes.forEach(node -> {
+            if (node.getContent() instanceof View) {
+                final View content = (View) node.getContent();
+                if (content.getDefinition() instanceof End) {
+                    End end = (End) content.getDefinition();
+                    final Bounds bounds = content.getBounds();
+                    final Bounds boundsBefore = endBoundsBefore.get(end.getName());
+
+                    assertNotSame(boundsBefore, bounds);
+                    assertNotEquals(boundsBefore.getX(), bounds.getX());
+                }
+            }
+        });
+    }
+
+    @SuppressWarnings("all")
+    @Test
+    public void testAdjustIncomingConnectionsNonBackwardsNoControlPoints() {
+        Iterable<Node> nodes = ((GraphImpl) getGraph()).nodes();
+        nodes.forEach(node -> {
+            if (node.getContent() instanceof View) {
+                final List<Edge> inEdges = (List<Edge>) node.getInEdges().stream()
+                        .filter(e -> ((Edge) e).getContent() instanceof ViewConnector)
+                        .collect(Collectors.toList());
+
+                // fix Incoming connections
+                AutoLayout.adjustIncomingConnections(node, inEdges);
+
+                for (int i = 0; i < inEdges.size(); i++) {
+                    Edge edge = inEdges.get(i);
+                    ViewConnector content = (ViewConnector) edge.getContent();
+                    MagnetConnection targetConnection = (MagnetConnection) content.getTargetConnection().get();
+                    ControlPoint[] controlPoints = content.getControlPoints();
+                    Node sourceNode = edge.getSourceNode();
+                    View sourceContent = (View) sourceNode.getContent();
+                    Bounds sourceBounds = sourceContent.getBounds();
+                    Node targetNode = edge.getTargetNode();
+                    View targetContent = (View) targetNode.getContent();
+                    Bounds targetBounds = targetContent.getBounds();
+
+                    if (!AutoLayout.isBackwards(sourceBounds.getY(), targetBounds.getY())
+                            && controlPoints.length == 0) {
+                        checkAdjustConnectionWithoutControlPoints(i,
+                                                                  sourceNode,
+                                                                  targetConnection,
+                                                                  inEdges);
+                    }
+                }
+            }
+        });
+    }
+
+    @SuppressWarnings("all")
+    @Test
+    public void testAdjustIncomingConnectionsBackwards() {
+        Iterable<Node> nodes = ((GraphImpl) getGraph()).nodes();
+        nodes.forEach(node -> {
+            if (node.getContent() instanceof View) {
+                final List<Edge> inEdges = (List<Edge>) node.getInEdges().stream()
+                        .filter(e -> ((Edge) e).getContent() instanceof ViewConnector)
+                        .collect(Collectors.toList());
+
+                // fix Incoming connections
+                AutoLayout.adjustIncomingConnections(node, inEdges);
+
+                for (int i = 0; i < inEdges.size(); i++) {
+                    Edge edge = inEdges.get(i);
+                    ViewConnector content = (ViewConnector) edge.getContent();
+                    MagnetConnection sourceConnection = (MagnetConnection) content.getSourceConnection().get();
+                    MagnetConnection targetConnection = (MagnetConnection) content.getTargetConnection().get();
+                    ControlPoint[] controlPoints = content.getControlPoints();
+                    Node sourceNode = edge.getSourceNode();
+                    View sourceContent = (View) sourceNode.getContent();
+                    Bounds sourceBounds = sourceContent.getBounds();
+                    Node targetNode = edge.getTargetNode();
+                    View targetContent = (View) targetNode.getContent();
+                    Bounds targetBounds = targetContent.getBounds();
+
+                    if (AutoLayout.isBackwards(sourceBounds.getY(), targetBounds.getY())) {
+                        if (inEdges.size() > 0) {
+                            if (controlPoints.length == 0) {
+                                assertFalse(sourceConnection.isAuto());
+                                assertEquals(MagnetConnection.MAGNET_LEFT, sourceConnection.getMagnetIndex().getAsInt(), 0);
+                            }
+                            assertFalse(targetConnection.isAuto());
+                            assertEquals(MagnetConnection.MAGNET_CENTER, targetConnection.getMagnetIndex().getAsInt(), 0);
+                        }
+                    }
+                }
+            }
+        });
+    }
+
+    @SuppressWarnings("all")
+    @Test
+    public void testAdjustOutgoingConnectionsNonBackwardsNoControlPoints() {
+        Iterable<Node> nodes = ((GraphImpl) getGraph()).nodes();
+        nodes.forEach(node -> {
+            if (node.getContent() instanceof View) {
+                final List<Edge> inEdges = (List<Edge>) node.getInEdges().stream()
+                        .filter(e -> ((Edge) e).getContent() instanceof ViewConnector)
+                        .collect(Collectors.toList());
+                final List<Edge> outEdges = (List<Edge>) node.getOutEdges().stream()
+                        .filter(e -> ((Edge) e).getContent() instanceof ViewConnector)
+                        .collect(Collectors.toList());
+
+                // fix Incoming connections
+                AutoLayout.adjustIncomingConnections(node, inEdges);
+
+                // fix Outgoing connections
+                AutoLayout.adjustOutgoingConnections(node, inEdges, outEdges);
+
+                if (node.getContent() instanceof View) {
+                    if (outEdges.size() >= 1) {
+                        for (int i = 0; i < outEdges.size(); i++) {
+                            Edge edge = outEdges.get(i);
+                            ViewConnector content = (ViewConnector) edge.getContent();
+                            MagnetConnection targetConnection = (MagnetConnection) content.getTargetConnection().get();
+                            ControlPoint[] controlPoints = content.getControlPoints();
+                            Node sourceNode = edge.getSourceNode();
+                            View sourceContent = (View) sourceNode.getContent();
+                            Bounds sourceBounds = sourceContent.getBounds();
+                            Node targetNode = edge.getTargetNode();
+                            View targetContent = (View) targetNode.getContent();
+                            Bounds targetBounds = targetContent.getBounds();
+
+                            if (AutoLayout.isBackwards(sourceBounds.getY(), targetBounds.getY()) &&
+                                    controlPoints.length == 0) {
+                                checkAdjustConnectionWithoutControlPoints(i,
+                                                                          sourceNode,
+                                                                          targetConnection,
+                                                                          inEdges);
+                            }
+                        }
+                    }
+                }
+            }
+        });
+    }
+
+    @SuppressWarnings("all")
+    @Test
+    public void testAdjustOutgoingConnectionsBackwards() {
+        Iterable<Node> nodes = ((GraphImpl) getGraph()).nodes();
+        nodes.forEach(node -> {
+            if (node.getContent() instanceof View) {
+                final List<Edge> inEdges = (List<Edge>) node.getInEdges().stream()
+                        .filter(e -> ((Edge) e).getContent() instanceof ViewConnector)
+                        .collect(Collectors.toList());
+                final List<Edge> outEdges = (List<Edge>) node.getOutEdges().stream()
+                        .filter(e -> ((Edge) e).getContent() instanceof ViewConnector)
+                        .collect(Collectors.toList());
+
+                // fix Incoming connections
+                AutoLayout.adjustIncomingConnections(node, inEdges);
+
+                // fix Outgoing connections
+                AutoLayout.adjustOutgoingConnections(node, inEdges, outEdges);
+
+                if (node.getContent() instanceof View) {
+                    if (outEdges.size() >= 1) {
+                        for (int i = 0; i < outEdges.size(); i++) {
+                            Edge edge = outEdges.get(i);
+                            ViewConnector content = (ViewConnector) edge.getContent();
+                            MagnetConnection sourceConnection = (MagnetConnection) content.getSourceConnection().get();
+                            MagnetConnection targetConnection = (MagnetConnection) content.getTargetConnection().get();
+                            ControlPoint[] controlPoints = content.getControlPoints();
+                            Node sourceNode = edge.getSourceNode();
+                            View sourceContent = (View) sourceNode.getContent();
+                            Bounds sourceBounds = sourceContent.getBounds();
+                            Node targetNode = edge.getTargetNode();
+                            View targetContent = (View) targetNode.getContent();
+                            Bounds targetBounds = targetContent.getBounds();
+
+                            if (AutoLayout.isBackwards(sourceBounds.getY(), targetBounds.getY())) {
+                                if (outEdges.size() > 0) {
+                                    if (controlPoints.length == 0) {
+                                        assertFalse(sourceConnection.isAuto());
+                                        assertEquals(MagnetConnection.MAGNET_LEFT, sourceConnection.getMagnetIndex().getAsInt(), 0);
+                                    }
+                                    assertFalse(targetConnection.isAuto());
+                                    assertEquals(MagnetConnection.MAGNET_CENTER, targetConnection.getMagnetIndex().getAsInt(), 0);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        });
+    }
+
+    @SuppressWarnings("all")
+    private void checkAdjustConnectionWithoutControlPoints(final int edgeIndex,
+                                                           final Node sourceNode,
+                                                           final MagnetConnection targetConnection,
+                                                           final List<Edge> inEdges) {
+        if (inEdges.size() == 1) {
+            assertFalse(targetConnection.isAuto());
+            assertEquals(MagnetConnection.MAGNET_TOP, targetConnection.getMagnetIndex().getAsInt(), 0);
+        } else if (AutoLayout.isSameSource(sourceNode, inEdges, edgeIndex)) {
+            assertFalse(targetConnection.isAuto());
+            assertEquals(MagnetConnection.MAGNET_TOP, targetConnection.getMagnetIndex().getAsInt(), 0);
+        } else {
+            assertFalse(targetConnection.isAuto());
+            assertEquals(MagnetConnection.MAGNET_CENTER, targetConnection.getMagnetIndex().getAsInt(), 0);
+        }
+    }
+}
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/BaseMarshallingTest.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/BaseMarshallingTest.java
index 942d466a4d..f43c00eea6 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/BaseMarshallingTest.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/BaseMarshallingTest.java
@@ -16,13 +16,18 @@
 
 package org.kie.workbench.common.stunner.sw.marshall;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 import org.junit.Before;
 import org.kie.workbench.common.stunner.core.TestingGraphMockHandler;
 import org.kie.workbench.common.stunner.core.graph.Edge;
 import org.kie.workbench.common.stunner.core.graph.Graph;
 import org.kie.workbench.common.stunner.core.graph.Node;
 import org.kie.workbench.common.stunner.core.graph.content.view.View;
+import org.kie.workbench.common.stunner.core.graph.content.view.ViewConnector;
 import org.kie.workbench.common.stunner.core.graph.util.GraphUtils;
+import org.kie.workbench.common.stunner.sw.definition.End;
 import org.kie.workbench.common.stunner.sw.definition.Workflow;
 
 import static org.junit.Assert.assertTrue;
@@ -86,6 +91,24 @@ public abstract class BaseMarshallingTest {
                 .isPresent();
     }
 
+    public boolean isConnectedToEnd(final String name) {
+        final Node state1 = getNodeByName(name);
+        final List<Edge> outEdges = (List<Edge>) state1.getOutEdges().stream()
+                .filter(e -> ((Edge) e).getContent() instanceof ViewConnector)
+                .collect(Collectors.toList());
+
+        if (outEdges.size() == 1) {
+            Edge edge = outEdges.get(0);
+            Node targetNode = edge.getTargetNode();
+            View targetContent = (View) targetNode.getContent();
+            System.out.println(targetContent.getDefinition().toString());
+            if (targetContent.getDefinition() instanceof End) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     public void assertDefinitionReferencedInNode(Object def, String nodeName) {
         assertTrue(isDefinitionReferencedInNode(def, nodeName));
     }
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/EmptyWorkflowNameTest.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/EmptyWorkflowNameTest.java
index 44b9e7e957..2b83672974 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/EmptyWorkflowNameTest.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/EmptyWorkflowNameTest.java
@@ -33,6 +33,6 @@ public class EmptyWorkflowNameTest extends BaseMarshallingTest {
         assertTrue(hasIncomingEdges("State1"));
         assertTrue(hasOutgoingEdges("State1"));
         assertTrue(hasIncomingEdgeFrom("State1", Marshaller.STATE_START));
-        assertTrue(hasOutgoingEdgeTo("State1", Marshaller.STATE_END));
+        assertTrue(isConnectedToEnd("State1"));
     }
 }
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/FilledKeyNullIdWorkflowTest.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/FilledKeyNullIdWorkflowTest.java
index 80b504ec33..f61a0ee0fd 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/FilledKeyNullIdWorkflowTest.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/FilledKeyNullIdWorkflowTest.java
@@ -33,6 +33,6 @@ public class FilledKeyNullIdWorkflowTest extends BaseMarshallingTest {
         assertTrue(hasIncomingEdges("State1"));
         assertTrue(hasOutgoingEdges("State1"));
         assertTrue(hasIncomingEdgeFrom("State1", Marshaller.STATE_START));
-        assertTrue(hasOutgoingEdgeTo("State1", Marshaller.STATE_END));
+        assertTrue(isConnectedToEnd("State1"));
     }
 }
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/NullKeyNullIdWorkflowTest.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/NullKeyNullIdWorkflowTest.java
index 127ddd34b5..240a3b116b 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/NullKeyNullIdWorkflowTest.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/NullKeyNullIdWorkflowTest.java
@@ -28,6 +28,6 @@ public class NullKeyNullIdWorkflowTest extends BaseMarshallingTest {
         assertTrue(hasIncomingEdges("State1"));
         assertTrue(hasOutgoingEdges("State1"));
         assertTrue(hasIncomingEdgeFrom("State1", Marshaller.STATE_START));
-        assertTrue(hasOutgoingEdgeTo("State1", Marshaller.STATE_END));
+        assertTrue(isConnectedToEnd("State1"));
     }
 }
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/OperationStateMarshallingTest.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/OperationStateMarshallingTest.java
index 24dd01eeed..9acfb68b15 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/OperationStateMarshallingTest.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/OperationStateMarshallingTest.java
@@ -30,6 +30,7 @@ public class OperationStateMarshallingTest extends BaseMarshallingTest {
 
     private static final String WORKFLOW_ID = "workflow1";
     private static final String WORKFLOW_NAME = "Workflow1";
+
     @Override
     protected Workflow createWorkflow() {
         return new Workflow()
@@ -60,7 +61,7 @@ public class OperationStateMarshallingTest extends BaseMarshallingTest {
         assertTrue(hasIncomingEdges("State1"));
         assertTrue(hasOutgoingEdges("State1"));
         assertTrue(hasIncomingEdgeFrom("State1", Marshaller.STATE_START));
-        assertTrue(hasOutgoingEdgeTo("State1", Marshaller.STATE_END));
+        assertTrue(isConnectedToEnd("State1"));
         assertDefinitionReferencedInNode(state.getActions()[0], "Call Function 1");
     }
 }
\ No newline at end of file
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/StateMarshallingTest.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/StateMarshallingTest.java
index 7eeb7b5a40..b5b532f6ef 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/StateMarshallingTest.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/StateMarshallingTest.java
@@ -59,7 +59,7 @@ public class StateMarshallingTest extends BaseMarshallingTest {
         workflow.getStates()[0].setEnd(endObject);
         unmarshallWorkflow();
         assertTrue(hasOutgoingEdges("State1"));
-        assertTrue(hasOutgoingEdgeTo("State1", Marshaller.STATE_END));
+        assertTrue(isConnectedToEnd("State1"));
         assertTrue(workflow.getStates()[0].getEnd() instanceof StateEnd);
         final StateEnd end = (StateEnd) workflow.getStates()[0].getEnd();
         assertTrue(end.getTerminate());
@@ -91,7 +91,7 @@ public class StateMarshallingTest extends BaseMarshallingTest {
         unmarshallWorkflow();
         assertDefinitionReferencedInNode(workflow, WORKFLOW_ID);
         assertDefinitionReferencedInNode(workflow.getStates()[0], "State1");
-        assertEquals(2, countChildren(WORKFLOW_ID));
+        assertEquals(1, countChildren(WORKFLOW_ID));
         assertParentOf(WORKFLOW_ID, "State1");
         assertTrue(hasIncomingEdges("State1"));
         assertFalse(hasOutgoingEdges("State1"));
@@ -101,7 +101,7 @@ public class StateMarshallingTest extends BaseMarshallingTest {
     public void testUnmarshallStartState() {
         workflow.setStart("State1");
         unmarshallWorkflow();
-        assertEquals(3, countChildren(WORKFLOW_ID));
+        assertEquals(2, countChildren(WORKFLOW_ID));
         assertTrue(hasIncomingEdgeFrom("State1", Marshaller.STATE_START));
     }
 
@@ -110,7 +110,7 @@ public class StateMarshallingTest extends BaseMarshallingTest {
         workflow.getStates()[0].setEnd(true);
         unmarshallWorkflow();
         assertTrue(hasOutgoingEdges("State1"));
-        assertTrue(hasOutgoingEdgeTo("State1", Marshaller.STATE_END));
+        assertTrue(isConnectedToEnd("State1"));
     }
 
     @Test
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/StatesFlowMarshallingTest.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/StatesFlowMarshallingTest.java
index 986140f618..e2e1a3d645 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/StatesFlowMarshallingTest.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/StatesFlowMarshallingTest.java
@@ -67,6 +67,6 @@ public class StatesFlowMarshallingTest extends BaseMarshallingTest {
         assertTrue(hasIncomingEdges("State3"));
         assertTrue(hasIncomingEdgeFrom("State3", "State2"));
         assertTrue(hasOutgoingEdges("State3"));
-        assertTrue(hasOutgoingEdgeTo("State3", Marshaller.STATE_END));
+        assertTrue(isConnectedToEnd("State3"));
     }
 }
\ No newline at end of file
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/CallbackStateShape.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/CallbackStateShape.java
index 9f4f21b87f..556e36a0a5 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/CallbackStateShape.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/CallbackStateShape.java
@@ -22,6 +22,7 @@ import org.kie.workbench.common.stunner.core.graph.Node;
 import org.kie.workbench.common.stunner.core.graph.content.view.View;
 import org.kie.workbench.common.stunner.sw.client.shapes.icons.CornerIcon;
 import org.kie.workbench.common.stunner.sw.client.shapes.icons.IconPath;
+import org.kie.workbench.common.stunner.sw.client.shapes.icons.IconPosition;
 import org.kie.workbench.common.stunner.sw.definition.CallbackState;
 import org.kie.workbench.common.stunner.sw.definition.State;
 
@@ -40,10 +41,15 @@ public class CallbackStateShape extends StateShape {
         CallbackState state = (CallbackState) element.getContent().getDefinition();
         if (state.getTimeouts() != null) {
             getView().addChild(new CornerIcon(IconPath.CLOCK,
+                                              IconPosition.LEFT_FROM_RIGHT_TOP_CORNER,
                                               "EventTimeout: " + state.getTimeouts().getEventTimeout() + "\r\n"
                                                       + "StateExecTimeout: " + state.getTimeouts().getStateExecTimeout() + "\r\n"
                                                       + "ActionExecTimeout: " + state.getTimeouts().getActionExecTimeout()));
         }
+
+        getView().addChild(new CornerIcon(IconPath.SERVICE,
+                                          IconPosition.RIGHT_TOP_CORNER,
+                                          HasAction.getActionString(state.getAction())));
     }
 
     @Override
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/EventStateShape.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/EventStateShape.java
index 6a23a4ad98..0781a61808 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/EventStateShape.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/EventStateShape.java
@@ -22,6 +22,7 @@ import org.kie.workbench.common.stunner.core.graph.Node;
 import org.kie.workbench.common.stunner.core.graph.content.view.View;
 import org.kie.workbench.common.stunner.sw.client.shapes.icons.CornerIcon;
 import org.kie.workbench.common.stunner.sw.client.shapes.icons.IconPath;
+import org.kie.workbench.common.stunner.sw.client.shapes.icons.IconPosition;
 import org.kie.workbench.common.stunner.sw.definition.EventState;
 import org.kie.workbench.common.stunner.sw.definition.State;
 
@@ -40,6 +41,7 @@ public class EventStateShape extends StateShape {
         EventState state = (EventState) element.getContent().getDefinition();
         if (state.getTimeouts() != null) {
             getView().addChild(new CornerIcon(IconPath.CLOCK,
+                                              IconPosition.RIGHT_TOP_CORNER,
                                               "EventTimeout: " + state.getTimeouts().getEventTimeout() + "\r\n"
                                                       + "StateExecTimeout: " + state.getTimeouts().getStateExecTimeout() + "\r\n"
                                                       + "ActionExecTimeout: " + state.getTimeouts().getActionExecTimeout()));
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ForEachStateShape.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ForEachStateShape.java
index 05b0f81d14..d065a2610a 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ForEachStateShape.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ForEachStateShape.java
@@ -22,6 +22,7 @@ import org.kie.workbench.common.stunner.core.graph.Node;
 import org.kie.workbench.common.stunner.core.graph.content.view.View;
 import org.kie.workbench.common.stunner.sw.client.shapes.icons.CornerIcon;
 import org.kie.workbench.common.stunner.sw.client.shapes.icons.IconPath;
+import org.kie.workbench.common.stunner.sw.client.shapes.icons.IconPosition;
 import org.kie.workbench.common.stunner.sw.definition.ForEachState;
 import org.kie.workbench.common.stunner.sw.definition.State;
 
@@ -40,9 +41,14 @@ public class ForEachStateShape extends StateShape {
         ForEachState state = (ForEachState) element.getContent().getDefinition();
         if (state.getTimeouts() != null) {
             getView().addChild(new CornerIcon(IconPath.CLOCK,
+                                              IconPosition.LEFT_FROM_RIGHT_TOP_CORNER,
                                               "StateExecTimeout: " + state.getTimeouts().getStateExecTimeout() + "\r\n"
                                                       + "ActionExecTimeout: " + state.getTimeouts().getActionExecTimeout()));
         }
+
+        getView().addChild(new CornerIcon(IconPath.SERVICE,
+                                          IconPosition.RIGHT_TOP_CORNER,
+                                          HasAction.getActionStringFromArray(state.getActions())));
     }
 
     @Override
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/HasAction.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/HasAction.java
new file mode 100644
index 0000000000..6246541052
--- /dev/null
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/HasAction.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kie.workbench.common.stunner.sw.client.shapes;
+
+import org.kie.workbench.common.stunner.core.util.StringUtils;
+import org.kie.workbench.common.stunner.sw.definition.ActionNode;
+import org.kie.workbench.common.stunner.sw.definition.FunctionRef;
+import org.kie.workbench.common.stunner.sw.definition.SubFlowRef;
+
+public interface HasAction {
+
+    String ACTION_IS_NULL = "Action is not defined";
+    String ACTIONS_ARE_NULL = "No actions provided";
+    String ACTION_NAME = "Action: ";
+    String ACTION_IS_FUNC = "Action functionRef: ";
+    String ACTION_IS_EVENT = "Action eventRef: ";
+    String ACTION_IS_SUBFLOW = "Action subFlowRef: ";
+
+    static String getActionStringFromArray(ActionNode[] actions) {
+        if (actions == null || actions.length == 0) {
+            return ACTIONS_ARE_NULL;
+        }
+
+        StringBuilder actionString = new StringBuilder();
+        for (ActionNode action : actions) {
+            actionString.append(getActionString(action));
+            actionString.append("\r\n");
+        }
+
+        return actionString.toString();
+    }
+
+    static String getActionString(ActionNode action) {
+        if (action == null) {
+            return ACTION_IS_NULL;
+        }
+
+        if (StringUtils.nonEmpty(action.getName())) {
+            return ACTION_NAME + action.getName();
+        }
+
+        if (action.getFunctionRef() != null) {
+            if (action.getFunctionRef() instanceof String) {
+                return ACTION_IS_FUNC + action.getFunctionRef();
+            }
+
+            FunctionRef functionRef = (FunctionRef) action.getFunctionRef();
+            return ACTION_IS_FUNC + functionRef.getRefName();
+        }
+
+        if (action.getEventRef() != null) {
+            return ACTION_IS_EVENT + action.getEventRef().getConsumeEventRef();
+        }
+
+        if (action.getSubFlowRef() != null) {
+            if (action.getSubFlowRef() instanceof String) {
+                return ACTION_IS_SUBFLOW + action.getSubFlowRef();
+            }
+
+            SubFlowRef subFlowRef = (SubFlowRef) action.getSubFlowRef();
+            return ACTION_IS_SUBFLOW + subFlowRef.getWorkflowId();
+        }
+
+        return ACTION_IS_NULL;
+    }
+}
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/OperationStateShape.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/OperationStateShape.java
index 59d1377091..6463057ff4 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/OperationStateShape.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/OperationStateShape.java
@@ -22,6 +22,7 @@ import org.kie.workbench.common.stunner.core.graph.Node;
 import org.kie.workbench.common.stunner.core.graph.content.view.View;
 import org.kie.workbench.common.stunner.sw.client.shapes.icons.CornerIcon;
 import org.kie.workbench.common.stunner.sw.client.shapes.icons.IconPath;
+import org.kie.workbench.common.stunner.sw.client.shapes.icons.IconPosition;
 import org.kie.workbench.common.stunner.sw.definition.OperationState;
 import org.kie.workbench.common.stunner.sw.definition.State;
 
@@ -40,9 +41,14 @@ public class OperationStateShape extends StateShape {
         OperationState state = (OperationState) element.getContent().getDefinition();
         if (state.getTimeouts() != null) {
             getView().addChild(new CornerIcon(IconPath.CLOCK,
+                                              IconPosition.LEFT_FROM_RIGHT_TOP_CORNER,
                                               "StateExecTimeout: " + state.getTimeouts().getStateExecTimeout() + "\r\n"
                                                       + "ActionExecTimeout: " + state.getTimeouts().getActionExecTimeout()));
         }
+
+        getView().addChild(new CornerIcon(IconPath.SERVICE,
+                                          IconPosition.RIGHT_TOP_CORNER,
+                                          HasAction.getActionStringFromArray(state.getActions())));
     }
 
     @Override
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ParallelStateShape.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ParallelStateShape.java
index c8f8448d4e..d2ec756c9e 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ParallelStateShape.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ParallelStateShape.java
@@ -22,6 +22,7 @@ import org.kie.workbench.common.stunner.core.graph.Node;
 import org.kie.workbench.common.stunner.core.graph.content.view.View;
 import org.kie.workbench.common.stunner.sw.client.shapes.icons.CornerIcon;
 import org.kie.workbench.common.stunner.sw.client.shapes.icons.IconPath;
+import org.kie.workbench.common.stunner.sw.client.shapes.icons.IconPosition;
 import org.kie.workbench.common.stunner.sw.definition.ParallelState;
 import org.kie.workbench.common.stunner.sw.definition.State;
 
@@ -40,6 +41,7 @@ public class ParallelStateShape extends StateShape {
         ParallelState state = (ParallelState) element.getContent().getDefinition();
         if (state.getTimeouts() != null) {
             getView().addChild(new CornerIcon(IconPath.CLOCK,
+                                              IconPosition.RIGHT_TOP_CORNER,
                                               "BranchExecTimeout: " + state.getTimeouts().getBranchExecTimeout() + "\r\n"
                                                       + "StateExecTimeout: " + state.getTimeouts().getStateExecTimeout()));
         }
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/SleepStateShape.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/SleepStateShape.java
index d0d3bc45dd..819be339a7 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/SleepStateShape.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/SleepStateShape.java
@@ -22,6 +22,7 @@ import org.kie.workbench.common.stunner.core.graph.Node;
 import org.kie.workbench.common.stunner.core.graph.content.view.View;
 import org.kie.workbench.common.stunner.sw.client.shapes.icons.CornerIcon;
 import org.kie.workbench.common.stunner.sw.client.shapes.icons.IconPath;
+import org.kie.workbench.common.stunner.sw.client.shapes.icons.IconPosition;
 import org.kie.workbench.common.stunner.sw.definition.SleepState;
 import org.kie.workbench.common.stunner.sw.definition.State;
 
@@ -38,7 +39,9 @@ public class SleepStateShape extends StateShape {
     public void applyProperties(Node<View<State>, Edge> element, MutationContext mutationContext) {
         super.applyProperties(element, mutationContext);
         SleepState state = (SleepState) element.getContent().getDefinition();
-        getView().addChild(new CornerIcon(IconPath.CLOCK, "Duration: " + state.getDuration()));
+        getView().addChild(new CornerIcon(IconPath.CLOCK,
+                                          IconPosition.RIGHT_TOP_CORNER,
+                                          "Duration: " + state.getDuration()));
     }
 
     @Override
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/SwitchStateShape.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/SwitchStateShape.java
index c9114e5707..833a2fced9 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/SwitchStateShape.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/SwitchStateShape.java
@@ -22,6 +22,7 @@ import org.kie.workbench.common.stunner.core.graph.Node;
 import org.kie.workbench.common.stunner.core.graph.content.view.View;
 import org.kie.workbench.common.stunner.sw.client.shapes.icons.CornerIcon;
 import org.kie.workbench.common.stunner.sw.client.shapes.icons.IconPath;
+import org.kie.workbench.common.stunner.sw.client.shapes.icons.IconPosition;
 import org.kie.workbench.common.stunner.sw.definition.State;
 import org.kie.workbench.common.stunner.sw.definition.SwitchState;
 
@@ -40,6 +41,7 @@ public class SwitchStateShape extends StateShape {
         SwitchState state = (SwitchState) element.getContent().getDefinition();
         if (state.getTimeouts() != null) {
             getView().addChild(new CornerIcon(IconPath.CLOCK,
+                                              IconPosition.RIGHT_TOP_CORNER,
                                               "EventTimeout: " + state.getTimeouts().getEventTimeout() + "\r\n"
                                                       + "StateExecTimeout: " + state.getTimeouts().getStateExecTimeout()));
         }
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/TransitionView.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/TransitionView.java
index ddc7f103d6..3980ab3585 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/TransitionView.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/TransitionView.java
@@ -16,10 +16,15 @@
 
 package org.kie.workbench.common.stunner.sw.client.shapes;
 
+import com.ait.lienzo.client.core.event.OrthogonalPolylinePointsChangedEvent;
+import com.ait.lienzo.client.core.event.OrthogonalPolylinePointsChangedHandler;
 import com.ait.lienzo.client.core.shape.AbstractDirectionalMultiPointShape;
 import com.ait.lienzo.client.core.shape.MultiPath;
 import com.ait.lienzo.client.core.shape.MultiPathDecorator;
-import com.ait.lienzo.client.core.shape.PolyLine;
+import com.ait.lienzo.client.core.shape.OrthogonalPolyLine;
+import com.ait.lienzo.client.core.shape.wires.util.WiresConnectorLabel;
+import com.ait.lienzo.client.core.types.Point2DArray;
+import com.ait.lienzo.tools.client.event.INodeEvent;
 import org.kie.workbench.common.stunner.client.lienzo.shape.view.wires.ext.WiresConnectorViewExt;
 import org.kie.workbench.common.stunner.core.client.shape.view.event.ShapeViewSupportedEvents;
 
@@ -38,14 +43,16 @@ public class TransitionView extends WiresConnectorViewExt<TransitionView> {
     }
 
     public TransitionView(String color, final double... points) {
-        this(createLine(new PolyLine(points), color));
+        this(createLine(new OrthogonalPolyLine(Point2DArray.fromArrayOfDouble(points)), color));
     }
 
     private TransitionView(final Object[] line) {
         super(ShapeViewSupportedEvents.DESKTOP_CONNECTOR_EVENT_TYPES,
-              (PolyLine) line[0],
+              (OrthogonalPolyLine) line[0],
               (MultiPathDecorator) line[1],
               (MultiPathDecorator) line[2]);
+
+        initHandlers((OrthogonalPolyLine) line[0]);
     }
 
     static Object[] createLine(AbstractDirectionalMultiPointShape<?> line, String color) {
@@ -68,6 +75,25 @@ public class TransitionView extends WiresConnectorViewExt<TransitionView> {
         return new Object[]{line, headDecorator, tailDecorator};
     }
 
+    private void initHandlers(final OrthogonalPolyLine line) {
+        OrthogonalPolylinePointsChangedHandler handler = new OrthogonalPolylinePointsChangedHandler() {
+            @Override
+            public INodeEvent.Type<OrthogonalPolylinePointsChangedHandler> getType() {
+                return new INodeEvent.Type<>();
+            }
+
+            @Override
+            public void onOrthogonalPointsChanged(OrthogonalPolylinePointsChangedEvent event) {
+                final WiresConnectorLabel label = getLabel();
+                if (null != label) {
+                    label.setOrthogonalPoints(event.getOrthogonalPoints().asList());
+                }
+            }
+        };
+
+        line.addOrthogonalPolylinePointsChangedHandler(handler);
+    }
+
     private static MultiPath getArrowMultiPath() {
         return new MultiPath()
                 .M(DECORATOR_WIDTH,
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/CornerIcon.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/CornerIcon.java
index d46281c066..00c2cbe370 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/CornerIcon.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/CornerIcon.java
@@ -19,6 +19,7 @@ import com.ait.lienzo.client.core.shape.Group;
 import com.ait.lienzo.client.core.shape.MultiPath;
 import com.ait.lienzo.client.core.shape.Rectangle;
 import com.ait.lienzo.client.core.shape.toolbox.items.tooltip.PrimitiveTextTooltip;
+import com.ait.lienzo.client.core.types.Point2D;
 import com.ait.lienzo.shared.core.types.EventPropagationMode;
 import com.ait.lienzo.tools.client.event.HandlerRegistration;
 
@@ -26,6 +27,7 @@ public class CornerIcon extends Group {
 
     private final HandlerRegistration mouseEnterHandler;
     private final HandlerRegistration mouseExitHandler;
+    private final HandlerRegistration mouseClickHandler;
     private final String tooltipText;
 
     private final Rectangle border = new Rectangle(20, 20)
@@ -37,9 +39,8 @@ public class CornerIcon extends Group {
             .setEventPropagationMode(EventPropagationMode.NO_ANCESTORS)
             .setListening(true);
 
-    public CornerIcon(String icon, String tooltip) {
-        setX(224);
-        setY(6);
+    public CornerIcon(String icon, Point2D position, String tooltip) {
+        setLocation(position);
         setListening(true);
         add(border);
         this.tooltipText = tooltip;
@@ -61,6 +62,7 @@ public class CornerIcon extends Group {
 
         mouseEnterHandler = border.addNodeMouseEnterHandler(event -> {
             this.getParent().moveToTop();
+            this.moveToTop();
             tooltipElement.show();
             clockIcon.setFillColor("#4F5255");
         });
@@ -69,6 +71,9 @@ public class CornerIcon extends Group {
             clockIcon.setFillColor("#CCC");
             border.getLayer().batch();
         });
+        mouseClickHandler = border.addNodeMouseClickHandler(
+                event -> this.getParent().asGroup().getChildren().get(0).fireEvent(event)
+        );
     }
 
     @Override
@@ -76,5 +81,6 @@ public class CornerIcon extends Group {
         super.destroy();
         mouseEnterHandler.removeHandler();
         mouseExitHandler.removeHandler();
+        mouseClickHandler.removeHandler();
     }
 }
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/IconPath.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/IconPath.java
index 7a5ad766a0..d1254a95f2 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/IconPath.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/IconPath.java
@@ -18,4 +18,5 @@ package org.kie.workbench.common.stunner.sw.client.shapes.icons;
 public interface IconPath {
 
     String CLOCK = "M 4.531 2.344 C 4.531 2.084 4.74 1.875 5 1.875 C 5.26 1.875 5.469 2.084 5.469 2.344 L 5.469 4.75 L 7.135 5.859 C 7.35 6.004 7.408 6.295 7.248 6.51 C 7.121 6.725 6.83 6.783 6.615 6.623 L 4.74 5.373 C 4.609 5.303 4.531 5.156 4.531 4.982 L 4.531 2.344 Z M 5 0 C 7.762 0 10 2.238 10 5 C 10 7.762 7.762 10 5 10 C 2.238 10 0 7.762 0 5 C 0 2.238 2.238 0 5 0 Z M 0.938 5 C 0.938 7.244 2.756 9.063 5 9.063 C 7.244 9.063 9.063 7.244 9.063 5 C 9.063 2.756 7.244 0.938 5 0.938 C 2.756 [...]
+    String SERVICE = "M 2.175 3.286 C 1.743 3.286 1.394 3.637 1.394 4.067 C 1.394 4.498 1.745 4.849 2.175 4.849 C 2.605 4.849 2.956 4.498 2.956 4.067 C 2.956 3.637 2.606 3.286 2.175 3.286 Z M 2.175 4.38 C 2.003 4.38 1.863 4.239 1.863 4.067 C 1.863 3.896 2.003 3.755 2.175 3.755 C 2.346 3.755 2.487 3.896 2.487 4.067 C 2.487 4.239 2.346 4.38 2.175 4.38 Z M 1.875 0.312 C 1.185 0.312 0.625 0.873 0.625 1.563 C 0.625 2.254 1.185 2.813 1.875 2.813 C 2.565 2.813 3.125 2.253 3.125 1.563 C 3.125 0. [...]
 }
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/IconPath.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/IconPosition.java
similarity index 55%
copy from packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/IconPath.java
copy to packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/IconPosition.java
index 7a5ad766a0..c76fe691f8 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/IconPath.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/IconPosition.java
@@ -15,7 +15,10 @@
  */
 package org.kie.workbench.common.stunner.sw.client.shapes.icons;
 
-public interface IconPath {
+import com.ait.lienzo.client.core.types.Point2D;
 
-    String CLOCK = "M 4.531 2.344 C 4.531 2.084 4.74 1.875 5 1.875 C 5.26 1.875 5.469 2.084 5.469 2.344 L 5.469 4.75 L 7.135 5.859 C 7.35 6.004 7.408 6.295 7.248 6.51 C 7.121 6.725 6.83 6.783 6.615 6.623 L 4.74 5.373 C 4.609 5.303 4.531 5.156 4.531 4.982 L 4.531 2.344 Z M 5 0 C 7.762 0 10 2.238 10 5 C 10 7.762 7.762 10 5 10 C 2.238 10 0 7.762 0 5 C 0 2.238 2.238 0 5 0 Z M 0.938 5 C 0.938 7.244 2.756 9.063 5 9.063 C 7.244 9.063 9.063 7.244 9.063 5 C 9.063 2.756 7.244 0.938 5 0.938 C 2.756 [...]
+public interface IconPosition {
+
+    Point2D RIGHT_TOP_CORNER = new Point2D(224, 6);
+    Point2D LEFT_FROM_RIGHT_TOP_CORNER = new Point2D(202, 6);
 }
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/test/java/org/kie/workbench/common/stunner/sw/client/shapes/HasActionTest.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/test/java/org/kie/workbench/common/stunner/sw/client/shapes/HasActionTest.java
new file mode 100644
index 0000000000..fada4bfc38
--- /dev/null
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/test/java/org/kie/workbench/common/stunner/sw/client/shapes/HasActionTest.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kie.workbench.common.stunner.sw.client.shapes;
+
+import org.junit.Test;
+import org.kie.workbench.common.stunner.sw.definition.ActionEventRef;
+import org.kie.workbench.common.stunner.sw.definition.ActionNode;
+import org.kie.workbench.common.stunner.sw.definition.FunctionRef;
+import org.kie.workbench.common.stunner.sw.definition.SubFlowRef;
+
+import static org.junit.Assert.assertEquals;
+import static org.kie.workbench.common.stunner.sw.client.shapes.HasAction.ACTIONS_ARE_NULL;
+import static org.kie.workbench.common.stunner.sw.client.shapes.HasAction.ACTION_IS_EVENT;
+import static org.kie.workbench.common.stunner.sw.client.shapes.HasAction.ACTION_IS_FUNC;
+import static org.kie.workbench.common.stunner.sw.client.shapes.HasAction.ACTION_IS_NULL;
+import static org.kie.workbench.common.stunner.sw.client.shapes.HasAction.ACTION_IS_SUBFLOW;
+import static org.kie.workbench.common.stunner.sw.client.shapes.HasAction.ACTION_NAME;
+import static org.kie.workbench.common.stunner.sw.client.shapes.HasAction.getActionString;
+import static org.kie.workbench.common.stunner.sw.client.shapes.HasAction.getActionStringFromArray;
+
+public class HasActionTest {
+
+    @Test
+    public void actionIsNullTest() {
+        assertEquals(ACTION_IS_NULL, getActionString(null));
+    }
+
+    @Test
+    public void actionIsEmptyTest() {
+        ActionNode action = new ActionNode();
+
+        assertEquals(ACTION_IS_NULL, getActionString(action));
+    }
+
+    @Test
+    public void actionNameIsPresentTest() {
+        ActionNode action = new ActionNode();
+        String testName = "TEST NAME";
+        action.setName(testName);
+
+        assertEquals(ACTION_NAME + testName, getActionString(action));
+    }
+
+    @Test
+    public void functionRefIsStringTest() {
+        ActionNode action = new ActionNode();
+        String funcRef = "FUNC REF NAME";
+        action.setFunctionRef(funcRef);
+
+        assertEquals(ACTION_IS_FUNC + funcRef, getActionString(action));
+    }
+
+    @Test
+    public void functionRefIsEmptyObjectTest() {
+        ActionNode action = new ActionNode();
+        FunctionRef functionRef = new FunctionRef();
+        action.setFunctionRef(functionRef);
+
+        assertEquals(ACTION_IS_FUNC + "null", getActionString(action));
+    }
+
+    @Test
+    public void functionRefIsObjectWithProperNameTest() {
+        ActionNode action = new ActionNode();
+        FunctionRef functionRef = new FunctionRef();
+        String refName = "PROPER REF NAME";
+        functionRef.setRefName(refName);
+        action.setFunctionRef(functionRef);
+
+        assertEquals(ACTION_IS_FUNC + refName, getActionString(action));
+    }
+
+    @Test
+    public void eventRefIsEmptyObjectTest() {
+        ActionNode action = new ActionNode();
+        ActionEventRef eventRef = new ActionEventRef();
+        action.setEventRef(eventRef);
+
+        assertEquals(ACTION_IS_EVENT + "null", getActionString(action));
+    }
+
+    @Test
+    public void eventRefConsumeEventIsProperlySetObjectTest() {
+        ActionNode action = new ActionNode();
+        ActionEventRef eventRef = new ActionEventRef();
+        String consumeEventRef = "PROPER CONSUME EVENT REF";
+        eventRef.setConsumeEventRef(consumeEventRef);
+        action.setEventRef(eventRef);
+
+        assertEquals(ACTION_IS_EVENT + consumeEventRef, getActionString(action));
+    }
+
+    @Test
+    public void subFlowRefIsStringTest() {
+        ActionNode action = new ActionNode();
+        String subFlowRef = "SUBFLOW REF NAME";
+        action.setSubFlowRef(subFlowRef);
+
+        assertEquals(ACTION_IS_SUBFLOW + subFlowRef, getActionString(action));
+    }
+
+    @Test
+    public void subFlowIsEmptyObjectTest() {
+        ActionNode action = new ActionNode();
+        SubFlowRef subFlowRef = new SubFlowRef();
+        action.setSubFlowRef(subFlowRef);
+
+        assertEquals(ACTION_IS_SUBFLOW + "null", getActionString(action));
+    }
+
+    @Test
+    public void subFlowIsObjectWithProperNameTest() {
+        ActionNode action = new ActionNode();
+        SubFlowRef subFlowRef = new SubFlowRef();
+        String workflowId = "PROPER WORKFLOW ID";
+        subFlowRef.setWorkflowId(workflowId);
+        action.setSubFlowRef(subFlowRef);
+
+        assertEquals(ACTION_IS_SUBFLOW + workflowId, getActionString(action));
+    }
+
+    @Test
+    public void actionsArrayNullTest() {
+        assertEquals(ACTIONS_ARE_NULL, getActionStringFromArray(null));
+    }
+
+    @Test
+    public void actionsArrayEmptyTest() {
+        ActionNode[] actions = new ActionNode[0];
+
+        assertEquals(ACTIONS_ARE_NULL, getActionStringFromArray(actions));
+    }
+
+    @Test
+    public void actionsArrayTest() {
+        ActionNode[] actions = new ActionNode[2];
+
+        ActionNode action1 = new ActionNode();
+        SubFlowRef subFlowRef = new SubFlowRef();
+        String workflowId = "PROPER WORKFLOW ID";
+        subFlowRef.setWorkflowId(workflowId);
+        action1.setSubFlowRef(subFlowRef);
+        actions[0] = action1;
+
+        ActionNode action2 = new ActionNode();
+        String funcRef = "FUNC REF NAME";
+        action2.setFunctionRef(funcRef);
+        actions[1] = action2;
+
+        assertEquals(ACTION_IS_SUBFLOW + workflowId + "\r\n" + ACTION_IS_FUNC + funcRef + "\r\n",
+                     getActionStringFromArray(actions));
+    }
+}
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-kogito-app/src/test/java/org/kie/workbench/common/stunner/sw/client/selenium/JsCanvasHelper.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-kogito-app/src/test/java/org/kie/workbench/common/stunner/sw/client/selenium/JsCanvasHelper.java
index 53b466d758..04a2b13cd6 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-kogito-app/src/test/java/org/kie/workbench/common/stunner/sw/client/selenium/JsCanvasHelper.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-kogito-app/src/test/java/org/kie/workbench/common/stunner/sw/client/selenium/JsCanvasHelper.java
@@ -36,6 +36,7 @@ public class JsCanvasHelper {
     private static final String APPLY_STATE = "return canvas.applyState('%1','%2');";
     private static final String CENTER_NODE = "return canvas.centerNode('%s');";
     private static final String IS_CONNECTION = "return canvas.isConnected('%1', '%2');";
+    private static final String GET_CONNECTOR_POINTS = "return canvas.getWiresShape('%s').getMagnet(%1).getConnection(%2).getConnector().getConnectorPointsAsArray();";
 
     private JavascriptExecutor executor;
 
@@ -107,4 +108,12 @@ public class JsCanvasHelper {
         assertThat(connection).isInstanceOf(Boolean.class);
         return (Boolean) connection;
     }
+
+    public List<Object> getConnectorPoints(String uuid, int magnet, int connection) {
+        Object points = executor.executeScript(String.format(GET_CONNECTOR_POINTS.replace("%s", uuid)
+                                                                     .replace("%1", String.valueOf(magnet))
+                                                                     .replace("%2", String.valueOf(connection))));
+        assertThat(points).isInstanceOf(ArrayList.class);
+        return (ArrayList<Object>) points;
+    }
 }
\ No newline at end of file
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-kogito-app/src/test/java/org/kie/workbench/common/stunner/sw/client/selenium/SWEditorSeleniumIT.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-kogito-app/src/test/java/org/kie/workbench/common/stunner/sw/client/selenium/SWEditorSeleniumIT.java
index 23a54f0d09..24ea75ba77 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-kogito-app/src/test/java/org/kie/workbench/common/stunner/sw/client/selenium/SWEditorSeleniumIT.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-kogito-app/src/test/java/org/kie/workbench/common/stunner/sw/client/selenium/SWEditorSeleniumIT.java
@@ -18,6 +18,7 @@ package org.kie.workbench.common.stunner.sw.client.selenium;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.List;
 
 import org.junit.Rule;
 import org.junit.Test;
@@ -29,6 +30,7 @@ import org.openqa.selenium.TakesScreenshot;
 import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;
 import static net.javacrumbs.jsonunit.assertj.JsonAssertions.json;
 import static org.apache.commons.io.FileUtils.copyFile;
+import static org.assertj.core.api.Assertions.assertThat;
 
 public class SWEditorSeleniumIT extends SWEditorSeleniumBase {
 
@@ -182,6 +184,164 @@ public class SWEditorSeleniumIT extends SWEditorSeleniumBase {
         testExample("ProcessTransactionsExample.sw.json");
     }
 
+    @Test
+    public void testAutoLayoutMultipleConnectionsCPs() throws Exception {
+        String resource = "EventBasedSwitchStateExample.sw.json";
+        final String expected = loadResource(resource);
+        setContent(expected);
+        waitCanvasPanel();
+
+        List<String> nodeIds = jsHelper.getNodeIds();
+        assertThat(nodeIds.size()).isEqualTo(8);
+
+        // First connector
+        List<Object> points = jsHelper.getConnectorPoints(nodeIds.get(1), 0, 0);
+        assertThat(points.size()).isEqualTo(10);
+        assertThat(points.get(0)).isEqualTo(558.5348837209302D); // X
+        assertThat(points.get(1)).isEqualTo(319L); // Y
+        assertThat(points.get(2)).isEqualTo(558.5348837209302D); // X
+        assertThat(points.get(3)).isEqualTo(329L); // Y
+        assertThat(points.get(4)).isEqualTo(558.5348837209302D); // X
+        assertThat(points.get(5)).isEqualTo(349.1033464566929D); // Y
+        assertThat(points.get(6)).isEqualTo(783L); // X
+        assertThat(points.get(7)).isEqualTo(349.1033464566929D); // Y
+        assertThat(points.get(8)).isEqualTo(783L); // X
+        assertThat(points.get(9)).isEqualTo(434L); // Y
+
+        // Second connector
+        List<Object> points2 = jsHelper.getConnectorPoints(nodeIds.get(1), 0, 1);
+        assertThat(points2.size()).isEqualTo(10);
+        assertThat(points2.get(0)).isEqualTo(399.4651162790698D); // X
+        assertThat(points2.get(1)).isEqualTo(319L); // Y
+        assertThat(points2.get(2)).isEqualTo(399.4651162790698D); // X
+        assertThat(points2.get(3)).isEqualTo(329L); // Y
+        assertThat(points2.get(4)).isEqualTo(399.4651162790698D); // X
+        assertThat(points2.get(5)).isEqualTo(349.1033464566929D); // Y
+        assertThat(points2.get(6)).isEqualTo(175L); // X
+        assertThat(points2.get(7)).isEqualTo(349.1033464566929D); // Y
+        assertThat(points2.get(8)).isEqualTo(175L); // X
+        assertThat(points2.get(9)).isEqualTo(434L); // Y
+
+        // Third connector
+        List<Object> points3 = jsHelper.getConnectorPoints(nodeIds.get(1), 0, 2);
+        assertThat(points3.size()).isEqualTo(8);
+        assertThat(points3.get(0)).isEqualTo(479L); // X
+        assertThat(points3.get(1)).isEqualTo(319L); // Y
+        assertThat(points3.get(2)).isEqualTo(479L); // X
+        assertThat(points3.get(3)).isEqualTo(329L); // Y
+        assertThat(points3.get(4)).isEqualTo(479L); // X
+        assertThat(points3.get(5)).isEqualTo(392.3333333333333D); // Y
+        assertThat(points3.get(6)).isEqualTo(479L); // X
+        assertThat(points3.get(7)).isEqualTo(434L); // Y
+    }
+
+    @Test
+    public void testAutoLayoutWithSameSourceAndTargetConnectionCPs() throws Exception {
+        String resource = "ApplicantRequestDecisionExample.sw.json";
+        final String expected = loadResource(resource);
+        setContent(expected);
+        waitCanvasPanel();
+
+        List<String> nodeIds = jsHelper.getNodeIds();
+        assertThat(nodeIds.size()).isEqualTo(6);
+
+        // First connector
+        List<Object> points = jsHelper.getConnectorPoints(nodeIds.get(1), 0, 0);
+        assertThat(points.size()).isEqualTo(10);
+        assertThat(points.get(0)).isEqualTo(366.7674418604651D); // X
+        assertThat(points.get(1)).isEqualTo(319L); // Y
+        assertThat(points.get(2)).isEqualTo(366.7674418604651D); // X
+        assertThat(points.get(3)).isEqualTo(329L); // Y
+        assertThat(points.get(4)).isEqualTo(366.7674418604651D); // X
+        assertThat(points.get(5)).isEqualTo(369.20669291338584D); // Y
+        assertThat(points.get(6)).isEqualTo(479L); // X
+        assertThat(points.get(7)).isEqualTo(369.20669291338584D); // Y
+        assertThat(points.get(8)).isEqualTo(479L); // X
+        assertThat(points.get(9)).isEqualTo(434L); // Y
+
+        // Second connector
+        List<Object> points2 = jsHelper.getConnectorPoints(nodeIds.get(1), 0, 1);
+        assertThat(points2.size()).isEqualTo(10);
+        assertThat(points2.get(0)).isEqualTo(287.2325581395349D); // X
+        assertThat(points2.get(1)).isEqualTo(319L); // Y
+        assertThat(points2.get(2)).isEqualTo(287.2325581395349D); // X
+        assertThat(points2.get(3)).isEqualTo(329L); // Y
+        assertThat(points2.get(4)).isEqualTo(287.2325581395349D); // X
+        assertThat(points2.get(5)).isEqualTo(369.20669291338584D); // Y
+        assertThat(points2.get(6)).isEqualTo(175L); // X
+        assertThat(points2.get(7)).isEqualTo(369.20669291338584D); // Y
+        assertThat(points2.get(8)).isEqualTo(175L); // X
+        assertThat(points2.get(9)).isEqualTo(434L); // Y
+
+        // Third connector
+        List<Object> points3 = jsHelper.getConnectorPoints(nodeIds.get(1), 0, 2);
+        assertThat(points3.size()).isEqualTo(10);
+        assertThat(points3.get(0)).isEqualTo(358.52073732718895D); // X
+        assertThat(points3.get(1)).isEqualTo(319L); // Y
+        assertThat(points3.get(2)).isEqualTo(358.52073732718895D); // X
+        assertThat(points3.get(3)).isEqualTo(329L); // Y
+        assertThat(points3.get(4)).isEqualTo(358.52073732718895D); // X
+        assertThat(points3.get(5)).isEqualTo(379.7258858267717D); // Y
+        assertThat(points3.get(6)).isEqualTo(447.47926267281105D); // X
+        assertThat(points3.get(7)).isEqualTo(379.7258858267717D); // Y
+        assertThat(points3.get(8)).isEqualTo(447.47926267281105D); // X
+        assertThat(points3.get(9)).isEqualTo(434L); // Y
+    }
+
+    @Test
+    public void testAutoLayoutLongBackwardConnectionCPs() throws Exception {
+        String resource = "BookLendingExample.sw.json";
+        final String expected = loadResource(resource);
+        setContent(expected);
+        waitCanvasPanel();
+
+        List<String> nodeIds = jsHelper.getNodeIds();
+        assertThat(nodeIds.size()).isEqualTo(13);
+
+        // Long backward connector
+        List<Object> points = jsHelper.getConnectorPoints(nodeIds.get(10), 3, 0);
+        assertThat(points.size()).isEqualTo(14);
+        assertThat(points.get(0)).isEqualTo(504L); // X
+        assertThat(points.get(1)).isEqualTo(1621L); // Y
+        assertThat(points.get(2)).isEqualTo(504L); // X
+        assertThat(points.get(3)).isEqualTo(1631L); // Y
+        assertThat(points.get(4)).isEqualTo(962L); // X
+        assertThat(points.get(5)).isEqualTo(1631L); // Y
+        assertThat(points.get(6)).isEqualTo(962L); // X
+        assertThat(points.get(7)).isEqualTo(1491L); // Y
+        assertThat(points.get(8)).isEqualTo(962L); // X
+        assertThat(points.get(9)).isEqualTo(578L); // Y
+        assertThat(points.get(10)).isEqualTo(962L); // X
+        assertThat(points.get(11)).isEqualTo(514.7445414847161D); // Y
+        assertThat(points.get(12)).isEqualTo(641L); // X
+        assertThat(points.get(13)).isEqualTo(514.7445414847161D); // Y
+    }
+
+    @Test
+    public void testAutoLayoutBackwardConnectionLayerAboveCPs() throws Exception {
+        String resource = "CarVitalsCheckExample.sw.json";
+        final String expected = loadResource(resource);
+        setContent(expected);
+        waitCanvasPanel();
+
+        List<String> nodeIds = jsHelper.getNodeIds();
+        assertThat(nodeIds.size()).isEqualTo(5);
+
+        // Backward connector
+        List<Object> points = jsHelper.getConnectorPoints(nodeIds.get(3), 4, 0);
+        assertThat(points.size()).isEqualTo(10);
+        assertThat(points.get(0)).isEqualTo(50L); // X
+        assertThat(points.get(1)).isEqualTo(708L); // Y
+        assertThat(points.get(2)).isEqualTo(40L); // X
+        assertThat(points.get(3)).isEqualTo(708L); // Y
+        assertThat(points.get(4)).isEqualTo(40L); // X
+        assertThat(points.get(5)).isEqualTo(608L); // Y
+        assertThat(points.get(6)).isEqualTo(149.07834101382488D); // X
+        assertThat(points.get(7)).isEqualTo(608L); // Y
+        assertThat(points.get(8)).isEqualTo(149.07834101382488D); // X
+        assertThat(points.get(9)).isEqualTo(548L); // Y
+    }
+
     private void testExample(String exampleName) throws Exception {
         final String expected = loadResource(exampleName);
         setContent(expected);
diff --git a/packages/serverless-workflow-mermaid-viewer/package.json b/packages/serverless-workflow-mermaid-viewer/package.json
index c6fe8b3a7a..550208c53f 100644
--- a/packages/serverless-workflow-mermaid-viewer/package.json
+++ b/packages/serverless-workflow-mermaid-viewer/package.json
@@ -36,8 +36,8 @@
     "@kie-tools-core/operating-system": "workspace:*",
     "@kie-tools-core/patternfly-base": "workspace:*",
     "@kie-tools-core/workspace": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
     "@severlessworkflow/sdk-typescript": "^3.0.3",
     "mermaid": "^9.1.7",
     "react": "^17.0.2",
diff --git a/packages/serverless-workflow-standalone-editor/package.json b/packages/serverless-workflow-standalone-editor/package.json
index 55d233903b..07e032cc23 100644
--- a/packages/serverless-workflow-standalone-editor/package.json
+++ b/packages/serverless-workflow-standalone-editor/package.json
@@ -16,9 +16,9 @@
     "dist/swf"
   ],
   "scripts": {
-    "build:dev": "rimraf dist && webpack --env dev --config webpack.editor-resources.config.js && webpack --env dev --config webpack.build-resources.config.js && pnpm build:preprocessor && webpack --env dev --config webpack.package-resources.config.js",
+    "build:dev": "rimraf dist && webpack --config webpack.editor-resources.config.js && webpack --config webpack.build-resources.config.js && pnpm build:preprocessor && webpack --config webpack.package-resources.config.js",
     "build:preprocessor": "node dist/preprocessor/preprocessor.js",
-    "build:prod": "pnpm lint && pnpm test && rimraf dist && webpack --env dev --config webpack.editor-resources.config.js && webpack --config webpack.build-resources.config.js && pnpm build:preprocessor && webpack --config webpack.package-resources.config.js",
+    "build:prod": "pnpm lint && pnpm test && rimraf dist && webpack --config webpack.editor-resources.config.js && webpack --config webpack.build-resources.config.js && pnpm build:preprocessor && webpack --config webpack.package-resources.config.js",
     "build:productization": "pnpm build:prod",
     "lint": "run-script-if --bool \"$(build-env linters.run)\" --then \"kie-tools--eslint ./src\"",
     "powershell": "@powershell -NoProfile -ExecutionPolicy Unrestricted -Command",
diff --git a/packages/serverless-workflow-text-editor/package.json b/packages/serverless-workflow-text-editor/package.json
index d5f5f9c21c..1def189bdc 100644
--- a/packages/serverless-workflow-text-editor/package.json
+++ b/packages/serverless-workflow-text-editor/package.json
@@ -37,8 +37,8 @@
     "@kie-tools-core/workspace": "workspace:*",
     "@kie-tools/serverless-workflow-language-service": "workspace:*",
     "@kie-tools/serverless-workflow-service-catalog": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
     "json-schema": "^0.4.0",
     "monaco-editor": "^0.33.0",
     "monaco-yaml": "^4.0.0",
diff --git a/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/main/java/org/kie/workbench/common/stunner/client/lienzo/components/mediators/ZoomLevelSelector.java b/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/main/java/org/kie/workbench/common/stunner/client/lienzo/components/mediators/ZoomLevelSelector.java
index 5ad3fdd82d..131959f576 100644
--- a/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/main/java/org/kie/workbench/common/stunner/client/lienzo/components/mediators/ZoomLevelSelector.java
+++ b/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/main/java/org/kie/workbench/common/stunner/client/lienzo/components/mediators/ZoomLevelSelector.java
@@ -21,10 +21,12 @@ import java.util.Objects;
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.enterprise.context.Dependent;
+import javax.enterprise.event.Event;
 import javax.inject.Inject;
 
 import com.google.gwt.user.client.ui.IsWidget;
 import com.google.gwt.user.client.ui.Widget;
+import org.kie.workbench.common.stunner.client.lienzo.util.ToolboxRefreshEvent;
 import org.uberfire.client.mvp.UberView;
 import org.uberfire.mvp.Command;
 
@@ -49,9 +51,11 @@ public class ZoomLevelSelector implements IsWidget {
     private Command onReset;
     private Command onDecreaseLevel;
     private Command onIncreaseLevel;
+    private final Event<ToolboxRefreshEvent> toolboxRefreshEvent;
 
     @Inject
-    public ZoomLevelSelector(final View view) {
+    public ZoomLevelSelector(final View view, final Event<ToolboxRefreshEvent> toolboxRefreshEvent) {
+        this.toolboxRefreshEvent = toolboxRefreshEvent;
         this.view = view;
         this.onReset = () -> {
         };
@@ -121,14 +125,21 @@ public class ZoomLevelSelector implements IsWidget {
 
     void onReset() {
         onReset.execute();
+        fireToolboxRefreshEvent();
     }
 
     void onIncreaseLevel() {
         onIncreaseLevel.execute();
+        fireToolboxRefreshEvent();
     }
 
     void onDecreaseLevel() {
         onDecreaseLevel.execute();
+        fireToolboxRefreshEvent();
+    }
+
+    protected void fireToolboxRefreshEvent() {
+        toolboxRefreshEvent.fire(new ToolboxRefreshEvent());
     }
 
     @PreDestroy
diff --git a/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/main/java/org/kie/workbench/common/stunner/client/lienzo/components/toolbox/actions/AbstractActionsToolboxView.java b/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/main/java/org/kie/workbench/common/stunner/client/lienzo/components/toolbox/actions/AbstractActionsToolboxView.java
index e5983b7825..302f9a7730 100644
--- a/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/main/java/org/kie/workbench/common/stunner/client/lienzo/components/toolbox/actions/AbstractActionsToolboxView.java
+++ b/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/main/java/org/kie/workbench/common/stunner/client/lienzo/components/toolbox/actions/AbstractActionsToolboxView.java
@@ -35,6 +35,7 @@ import com.ait.lienzo.client.core.shape.wires.WiresShape;
 import com.ait.lienzo.client.widget.panel.impl.LienzoPanelScrollEvent;
 import org.kie.workbench.common.stunner.client.lienzo.canvas.wires.WiresCanvas;
 import org.kie.workbench.common.stunner.client.lienzo.components.glyph.LienzoGlyphRenderers;
+import org.kie.workbench.common.stunner.client.lienzo.util.ToolboxRefreshEvent;
 import org.kie.workbench.common.stunner.core.client.canvas.AbstractCanvas;
 import org.kie.workbench.common.stunner.core.client.components.toolbox.actions.ActionsToolbox;
 import org.kie.workbench.common.stunner.core.client.components.toolbox.actions.ActionsToolboxView;
@@ -74,8 +75,8 @@ public abstract class AbstractActionsToolboxView<V extends AbstractActionsToolbo
     @Override
     public V init(final ActionsToolbox toolbox) {
         return init(toolbox,
-                    (WiresCanvas) toolbox.getCanvas(),
-                    (WiresShape) toolbox.getShape().getShapeView());
+                (WiresCanvas) toolbox.getCanvas(),
+                (WiresShape) toolbox.getShape().getShapeView());
     }
 
     @Override
@@ -90,12 +91,15 @@ public abstract class AbstractActionsToolboxView<V extends AbstractActionsToolbo
         return cast();
     }
 
+    public void onToolboxRefreshEvent(final @Observes ToolboxRefreshEvent event) {
+        drawTopLayer();
+    }
+
     @Override
     public void destroy() {
         Optional.ofNullable(toolboxView).ifPresent(WiresShapeToolbox::destroy);
         Optional.ofNullable(tooltip).ifPresent(ToolboxTextTooltip::destroy);
 
-
         drawTopLayer();
 
         toolboxView = null;
@@ -142,7 +146,7 @@ public abstract class AbstractActionsToolboxView<V extends AbstractActionsToolbo
     private void initButtons(final ActionsToolbox<ActionsToolboxView<?>> toolbox) {
         for (ToolboxAction toolboxAction : toolbox) {
             final ButtonItem button = addButton(toolbox.getGlyph(toolboxAction),
-                                                toolbox.getTitle(toolboxAction));
+                    toolbox.getTitle(toolboxAction));
             button.onClick(event -> {
                 onButtonClick(toolbox, toolboxAction, button, event);
             });
@@ -160,11 +164,11 @@ public abstract class AbstractActionsToolboxView<V extends AbstractActionsToolbo
                                  final ButtonItem button,
                                  final NodeMouseClickEvent event) {
         toolboxAction.onMouseClick(toolbox.getCanvasHandler(),
-                                   toolbox.getElementUUID(),
-                                   new MouseClickEvent(event.getX(),
-                                                       event.getY(),
-                                                       getClientX(event),
-                                                       getClientY(event)));
+                toolbox.getElementUUID(),
+                new MouseClickEvent(event.getX(),
+                        event.getY(),
+                        getClientX(event),
+                        getClientY(event)));
     }
 
     @SuppressWarnings("unchecked")
@@ -174,11 +178,11 @@ public abstract class AbstractActionsToolboxView<V extends AbstractActionsToolbo
                                      final NodeMouseMoveEvent event) {
         button.disable();
         toolboxAction.onMoveStart(toolbox.getCanvasHandler(),
-                                  toolbox.getElementUUID(),
-                                  new MouseMoveEvent(event.getX(),
-                                                     event.getY(),
-                                                     getClientX(event),
-                                                     getClientY(event)));
+                toolbox.getElementUUID(),
+                new MouseMoveEvent(event.getX(),
+                        event.getY(),
+                        getClientX(event),
+                        getClientY(event)));
     }
 
     ButtonItem addButton(final Glyph glyph,
@@ -186,7 +190,7 @@ public abstract class AbstractActionsToolboxView<V extends AbstractActionsToolbo
         final ButtonItem button =
                 toolboxFactory.buttons()
                         .button(renderGlyph(glyph,
-                                            getGlyphSize()))
+                                getGlyphSize()))
                         .decorate(createDecorator())
                         .tooltip(tooltip.createItem(title))
                         .onMouseEnter(event -> onMouseEnter())
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/IconPath.java b/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/main/java/org/kie/workbench/common/stunner/client/lienzo/util/ToolboxRefreshEvent.java
similarity index 50%
copy from packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/IconPath.java
copy to packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/main/java/org/kie/workbench/common/stunner/client/lienzo/util/ToolboxRefreshEvent.java
index 7a5ad766a0..59eb7a5e6b 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/IconPath.java
+++ b/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/main/java/org/kie/workbench/common/stunner/client/lienzo/util/ToolboxRefreshEvent.java
@@ -13,9 +13,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.kie.workbench.common.stunner.sw.client.shapes.icons;
 
-public interface IconPath {
+package org.kie.workbench.common.stunner.client.lienzo.util;
+
+public class ToolboxRefreshEvent {
 
-    String CLOCK = "M 4.531 2.344 C 4.531 2.084 4.74 1.875 5 1.875 C 5.26 1.875 5.469 2.084 5.469 2.344 L 5.469 4.75 L 7.135 5.859 C 7.35 6.004 7.408 6.295 7.248 6.51 C 7.121 6.725 6.83 6.783 6.615 6.623 L 4.74 5.373 C 4.609 5.303 4.531 5.156 4.531 4.982 L 4.531 2.344 Z M 5 0 C 7.762 0 10 2.238 10 5 C 10 7.762 7.762 10 5 10 C 2.238 10 0 7.762 0 5 C 0 2.238 2.238 0 5 0 Z M 0.938 5 C 0.938 7.244 2.756 9.063 5 9.063 C 7.244 9.063 9.063 7.244 9.063 5 C 9.063 2.756 7.244 0.938 5 0.938 C 2.756 [...]
 }
diff --git a/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/test/java/org/kie/workbench/common/stunner/client/lienzo/components/mediators/ZoomLevelSelectorPresenterTest.java b/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/test/java/org/kie/workbench/common/stunner/client/lienzo/components/mediators/ZoomLevelSelectorPresenterTest.java
index 50e3a420c0..6cf61bd8bf 100644
--- a/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/test/java/org/kie/workbench/common/stunner/client/lienzo/components/mediators/ZoomLevelSelectorPresenterTest.java
+++ b/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/test/java/org/kie/workbench/common/stunner/client/lienzo/components/mediators/ZoomLevelSelectorPresenterTest.java
@@ -16,6 +16,8 @@
 
 package org.kie.workbench.common.stunner.client.lienzo.components.mediators;
 
+import javax.enterprise.event.Event;
+
 import com.ait.lienzo.client.core.event.ViewportTransformChangedHandler;
 import com.ait.lienzo.client.core.shape.Layer;
 import com.ait.lienzo.client.core.shape.Viewport;
@@ -36,6 +38,7 @@ import org.junit.runner.RunWith;
 import org.kie.workbench.common.stunner.client.lienzo.canvas.LienzoCanvas;
 import org.kie.workbench.common.stunner.client.lienzo.canvas.LienzoCanvasView;
 import org.kie.workbench.common.stunner.client.lienzo.canvas.LienzoPanel;
+import org.kie.workbench.common.stunner.client.lienzo.util.ToolboxRefreshEvent;
 import org.kie.workbench.common.stunner.core.client.api.SessionManager;
 import org.kie.workbench.common.stunner.core.client.components.views.FloatingView;
 import org.kie.workbench.common.stunner.core.client.components.views.FloatingWidgetView;
@@ -112,10 +115,13 @@ public class ZoomLevelSelectorPresenterTest {
     private Layer layer;
     private ZoomLevelSelector selector;
 
+    @Mock
+    private Event<ToolboxRefreshEvent> toolboxRefreshEventEvent;
+
     @Before
     public void setUp() {
         translationService = new ClientTranslationService(translationServiceMock, elementNameProviders, sessionManager, definitionUtils);
-        selector = spy(new ZoomLevelSelector(selectorView));
+        selector = spy(new ZoomLevelSelector(selectorView, toolboxRefreshEventEvent));
         layer = spy(new Layer());
         when(layer.getViewport()).thenReturn(viewport);
         when(canvas.getView()).thenReturn(canvasView);
diff --git a/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/test/java/org/kie/workbench/common/stunner/client/lienzo/components/mediators/ZoomLevelSelectorTest.java b/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/test/java/org/kie/workbench/common/stunner/client/lienzo/components/mediators/ZoomLevelSelectorTest.java
index ae61ae07c6..807b574ec1 100644
--- a/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/test/java/org/kie/workbench/common/stunner/client/lienzo/components/mediators/ZoomLevelSelectorTest.java
+++ b/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/test/java/org/kie/workbench/common/stunner/client/lienzo/components/mediators/ZoomLevelSelectorTest.java
@@ -16,15 +16,19 @@
 
 package org.kie.workbench.common.stunner.client.lienzo.components.mediators;
 
+import javax.enterprise.event.Event;
+
 import com.google.gwt.user.client.ui.Widget;
 import com.google.gwtmockito.GwtMockitoTestRunner;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.kie.workbench.common.stunner.client.lienzo.util.ToolboxRefreshEvent;
 import org.mockito.Mock;
 import org.uberfire.mvp.Command;
 
 import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
@@ -48,9 +52,12 @@ public class ZoomLevelSelectorTest {
 
     private ZoomLevelSelector tested;
 
+    @Mock
+    private Event<ToolboxRefreshEvent> toolboxRefreshEventEvent;
+
     @Before
     public void setUp() {
-        tested = new ZoomLevelSelector(view);
+        tested = new ZoomLevelSelector(view, toolboxRefreshEventEvent);
         tested.onIncreaseLevel(onIncreaseLevel);
         tested.onDecreaseLevel(onDecreaseLevel);
         tested.onReset(onReset);
@@ -93,18 +100,21 @@ public class ZoomLevelSelectorTest {
     public void testOnReset() {
         tested.onReset();
         verify(onReset, times(1)).execute();
+        verify(toolboxRefreshEventEvent, times(1)).fire(any(ToolboxRefreshEvent.class));
     }
 
     @Test
     public void testOnIncreaseLevel() {
         tested.onIncreaseLevel();
         verify(onIncreaseLevel, times(1)).execute();
+        verify(toolboxRefreshEventEvent, times(1)).fire(any(ToolboxRefreshEvent.class));
     }
 
     @Test
     public void testOnDecreaseLevel() {
         tested.onDecreaseLevel();
         verify(onDecreaseLevel, times(1)).execute();
+        verify(toolboxRefreshEventEvent, times(1)).fire(any(ToolboxRefreshEvent.class));
     }
 
     @Test
diff --git a/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/test/java/org/kie/workbench/common/stunner/client/lienzo/components/toolbox/actions/AbstractActionsToolboxViewTest.java b/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/test/java/org/kie/workbench/common/stunner/client/lienzo/components/toolbox/actions/AbstractActionsToolboxViewTest.java
index 1f3f3d7cd4..8ee68603c8 100644
--- a/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/test/java/org/kie/workbench/common/stunner/client/lienzo/components/toolbox/actions/AbstractActionsToolboxViewTest.java
+++ b/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/test/java/org/kie/workbench/common/stunner/client/lienzo/components/toolbox/actions/AbstractActionsToolboxViewTest.java
@@ -41,6 +41,7 @@ import org.kie.workbench.common.stunner.client.lienzo.canvas.wires.WiresCanvas;
 import org.kie.workbench.common.stunner.client.lienzo.canvas.wires.WiresCanvasView;
 import org.kie.workbench.common.stunner.client.lienzo.canvas.wires.WiresLayer;
 import org.kie.workbench.common.stunner.client.lienzo.components.glyph.LienzoGlyphRenderers;
+import org.kie.workbench.common.stunner.client.lienzo.util.ToolboxRefreshEvent;
 import org.kie.workbench.common.stunner.core.client.canvas.AbstractCanvas;
 import org.kie.workbench.common.stunner.core.client.components.toolbox.actions.ActionsToolbox;
 import org.mockito.ArgumentCaptor;
@@ -192,4 +193,12 @@ public abstract class AbstractActionsToolboxViewTest {
                times(1)).drawTopLayer();
     }
 
+    @Test
+    public void testOnToolboxRefreshEvent() {
+        doCallRealMethod().when(toolboxView2).onToolboxRefreshEvent(any());
+        toolboxView2.onToolboxRefreshEvent(new ToolboxRefreshEvent());
+        verify(toolboxView2,
+                times(1)).drawTopLayer();
+    }
+
 }
diff --git a/packages/text-editor/package.json b/packages/text-editor/package.json
index 35da9bc665..94ef06b659 100644
--- a/packages/text-editor/package.json
+++ b/packages/text-editor/package.json
@@ -33,7 +33,7 @@
     "@kie-tools-core/operating-system": "workspace:*",
     "@kie-tools-core/patternfly-base": "workspace:*",
     "@kie-tools-core/workspace": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
+    "@patternfly/react-core": "^4.276.6",
     "monaco-editor": "^0.33.0",
     "monaco-yaml": "^4.0.0",
     "react": "^17.0.2",
diff --git a/packages/uniforms-patternfly/package.json b/packages/uniforms-patternfly/package.json
index 4b1db7a9d2..a16d84fc06 100644
--- a/packages/uniforms-patternfly/package.json
+++ b/packages/uniforms-patternfly/package.json
@@ -40,8 +40,8 @@
     "@kie-tools/eslint": "workspace:*",
     "@kie-tools/root-env": "workspace:*",
     "@kie-tools/tsconfig": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
     "@testing-library/jest-dom": "^5.16.1",
     "@testing-library/react": "^11.2.6",
     "@types/jest": "^26.0.23",
diff --git a/packages/uniforms-patternfly/src/DateField.tsx b/packages/uniforms-patternfly/src/DateField.tsx
index e98a8f562e..8999e18822 100644
--- a/packages/uniforms-patternfly/src/DateField.tsx
+++ b/packages/uniforms-patternfly/src/DateField.tsx
@@ -38,7 +38,7 @@ const DateConstructor = (typeof global === "object" ? global : window).Date;
 
 function DateField({ onChange, ...props }: DateFieldProps) {
   const dateValue = useCallback(
-    (newDate?: Date) => {
+    (newDate?: string) => {
       if (newDate) {
         return new DateConstructor(newDate);
       }
@@ -67,11 +67,11 @@ function DateField({ onChange, ...props }: DateFieldProps) {
   }, [dateValue]);
 
   const onDateChange = useCallback(
-    (value: string, date?: Date) => {
-      if (!date) {
-        onChange(date);
+    (event: React.FormEvent<HTMLInputElement>, value: string) => {
+      if (!value) {
+        onChange(value);
       } else {
-        const newDate = dateValue(date);
+        const newDate = dateValue(value);
         const time = parseTime;
         if (time !== "") {
           newDate?.setUTCHours(parseInt(time?.split(":")[0]));
@@ -110,7 +110,7 @@ function DateField({ onChange, ...props }: DateFieldProps) {
   }, [dateValue, props.min, props.max]);
 
   const onTimeChange = useCallback(
-    (time: string, hours?: number, minutes?: number) => {
+    (event: React.FormEvent<HTMLInputElement>, time: string, hours?: number, minutes?: number) => {
       const newDate = dateValue();
       if (newDate) {
         if (hours && minutes) {
diff --git a/packages/uniforms-patternfly/src/LongTextField.tsx b/packages/uniforms-patternfly/src/LongTextField.tsx
index aa3d7bb272..c5923d882a 100644
--- a/packages/uniforms-patternfly/src/LongTextField.tsx
+++ b/packages/uniforms-patternfly/src/LongTextField.tsx
@@ -22,7 +22,7 @@ export type LongTextFieldProps = HTMLFieldProps<
   string,
   HTMLDivElement,
   {
-    inputRef?: React.RefObject<HTMLInputElement>;
+    inputRef?: React.RefObject<HTMLTextAreaElement>;
     onChange: (value: string, event: React.ChangeEvent<HTMLTextAreaElement>) => void;
     value?: string;
     prefix?: string;
diff --git a/packages/uniforms-patternfly/src/TextField.tsx b/packages/uniforms-patternfly/src/TextField.tsx
index 92d5274302..4f0d0b6264 100644
--- a/packages/uniforms-patternfly/src/TextField.tsx
+++ b/packages/uniforms-patternfly/src/TextField.tsx
@@ -101,14 +101,14 @@ function TextField({ onChange, ...props }: TextFieldProps) {
   }, [props.type, props.field, props.value, props.max, props.min, parseTime]);
 
   const onDateChange = useCallback(
-    (value: string) => {
+    (event: React.FormEvent<HTMLInputElement>, value: string) => {
       onChange(value);
     },
     [onChange]
   );
 
   const onTimeChange = useCallback(
-    (time: string) => {
+    (event: React.FormEvent<HTMLInputElement>, time: string) => {
       const parsedTime = time.split(":");
       if (parsedTime.length === 2) {
         onChange([...parsedTime, "00"].join(":"));
diff --git a/packages/uniforms-patternfly/src/__tests__/DateField.test.tsx b/packages/uniforms-patternfly/src/__tests__/DateField.test.tsx
index 9df35ac27f..08ec377442 100644
--- a/packages/uniforms-patternfly/src/__tests__/DateField.test.tsx
+++ b/packages/uniforms-patternfly/src/__tests__/DateField.test.tsx
@@ -39,9 +39,9 @@ test("<DateField> - renders a input with correct id (specified)", () => {
   expect(screen.getByTestId("date-field")).toBeInTheDocument();
   expect(screen.getByTestId("date-picker").getAttribute("id")).toBe("date-picker-y");
   // TimePicker component id is in an inside div
-  expect(screen.getByTestId("time-picker").getElementsByClassName("pf-c-select")[0].getAttribute("id")).toBe(
-    "time-picker-y"
-  );
+  expect(
+    screen.getByTestId("time-picker").getElementsByClassName("pf-c-input-group")[0].children[0].getAttribute("id")
+  ).toBe("time-picker-y");
 });
 
 test("<DateField> - renders a input with correct name", () => {
@@ -111,12 +111,24 @@ test("<DateField> - renders a input which correctly reacts on change (DatePicker
   const onChange = jest.fn();
 
   const now = "2000-04-04";
+  const dateNow = new Date(now);
   render(usingUniformsContext(<DateField name="x" />, { x: { type: Date } }, { onChange }));
 
   const input = screen.getByTestId("date-picker").getElementsByTagName("input")[0];
   fireEvent.change(input, { target: { value: now } });
 
-  expect(onChange).toHaveBeenLastCalledWith("x", `${now}T00:00:00.000Z`);
+  expect(onChange).toHaveBeenLastCalledWith("x", `${dateNow.toISOString()}`);
+});
+
+test("<DateField> - renders a input which correctly reacts on change (empty value) (DatePicker)", () => {
+  const onChange = jest.fn();
+
+  render(usingUniformsContext(<DateField name="x" value={"2000-04-04"} />, { x: { type: Date } }, { onChange }));
+
+  const input = screen.getByTestId("date-picker").getElementsByTagName("input")[0];
+  fireEvent.change(input, { target: { value: "" } });
+
+  expect(onChange).toHaveBeenLastCalledWith("x", "");
 });
 
 test("<DateField> - renders a input which correctly reacts on change (DatePicker - empty)", () => {
diff --git a/packages/unitables-dmn/package.json b/packages/unitables-dmn/package.json
index 57800c96da..5c901673fa 100644
--- a/packages/unitables-dmn/package.json
+++ b/packages/unitables-dmn/package.json
@@ -33,8 +33,8 @@
     "@kie-tools/form-dmn": "workspace:*",
     "@kie-tools/i18n-common-dictionary": "workspace:*",
     "@kie-tools/unitables": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
     "@types/lodash": "^4.14.168",
     "@types/react-table": "^7.0.25",
     "ajv": "^6.12.6",
diff --git a/packages/unitables/package.json b/packages/unitables/package.json
index 7e0dfee795..9ce55297b7 100644
--- a/packages/unitables/package.json
+++ b/packages/unitables/package.json
@@ -32,8 +32,8 @@
     "@kie-tools/form": "workspace:*",
     "@kie-tools/i18n-common-dictionary": "workspace:*",
     "@kie-tools/uniforms-patternfly": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
     "@types/lodash": "^4.14.168",
     "@types/react-table": "^7.0.25",
     "ajv": "^6.12.6",
diff --git a/packages/vscode-extension-dashbuilder-editor/src/browser/extension.ts b/packages/vscode-extension-dashbuilder-editor/src/browser/extension.ts
index 17ef892b1d..84b0a47979 100644
--- a/packages/vscode-extension-dashbuilder-editor/src/browser/extension.ts
+++ b/packages/vscode-extension-dashbuilder-editor/src/browser/extension.ts
@@ -23,6 +23,8 @@ import * as vscode from "vscode";
 import { DashbuilderVsCodeExtensionConfiguration } from "../extension/configuration";
 import { setupDashboardEditorControls } from "../extension/setupDashboardEditorControls";
 import { DashbuilderViewerChannelApiProducer } from "../api/DashbuilderViewerChannelApiProducer";
+import { setupBuiltInVsCodeEditorDashbuilderContributions } from "../extension/builtInVsCodeEditorDashbuilderContributions";
+import { VsCodeDashbuilderLanguageService } from "../extension/languageService/VsCodeDashbuilderLanguageService";
 
 const componentServerUrl = "https://start.kubesmarts.org/dashbuilder-client/dashbuilder/component";
 
@@ -56,6 +58,16 @@ export async function activate(context: vscode.ExtensionContext) {
   });
 
   const configuration = new DashbuilderVsCodeExtensionConfiguration();
+
+  const vsCodeDashbuilderLanguageService = new VsCodeDashbuilderLanguageService();
+
+  setupBuiltInVsCodeEditorDashbuilderContributions({
+    context,
+    vsCodeDashbuilderLanguageService,
+    configuration,
+    kieEditorsStore,
+  });
+
   await setupDashboardEditorControls({
     context,
     configuration,
diff --git a/packages/vscode-extension-dashbuilder-editor/src/extension/builtInVsCodeEditorDashbuilderContributions.ts b/packages/vscode-extension-dashbuilder-editor/src/extension/builtInVsCodeEditorDashbuilderContributions.ts
index 91dafd6f12..b39b10c7a5 100644
--- a/packages/vscode-extension-dashbuilder-editor/src/extension/builtInVsCodeEditorDashbuilderContributions.ts
+++ b/packages/vscode-extension-dashbuilder-editor/src/extension/builtInVsCodeEditorDashbuilderContributions.ts
@@ -109,7 +109,7 @@ export function setupBuiltInVsCodeEditorDashbuilderContributions(args: {
 
   args.context.subscriptions.push(
     vscode.languages.registerCodeLensProvider(
-      { scheme: "file", pattern: "**/*.dash.{yaml,yml,json}" },
+      { pattern: "**/*.dash.{yaml,yml,json}" },
       {
         provideCodeLenses: async (document: vscode.TextDocument, token: vscode.CancellationToken) => {
           const lsCodeLenses = await args.vsCodeDashbuilderLanguageService.getLs(document).getCodeLenses({
@@ -141,7 +141,7 @@ export function setupBuiltInVsCodeEditorDashbuilderContributions(args: {
 
   args.context.subscriptions.push(
     vscode.languages.registerCompletionItemProvider(
-      { scheme: "file", pattern: "**/*.dash.{yaml,yml,json}" },
+      { pattern: "**/*.dash.{yaml,yml,json}" },
       {
         provideCompletionItems: async (
           document: vscode.TextDocument,
diff --git a/packages/vscode-extension-serverless-workflow-editor/src/extension/builtInVsCodeEditorSwfContributions.ts b/packages/vscode-extension-serverless-workflow-editor/src/extension/builtInVsCodeEditorSwfContributions.ts
index dde2e8f643..88d8bb5224 100644
--- a/packages/vscode-extension-serverless-workflow-editor/src/extension/builtInVsCodeEditorSwfContributions.ts
+++ b/packages/vscode-extension-serverless-workflow-editor/src/extension/builtInVsCodeEditorSwfContributions.ts
@@ -147,7 +147,7 @@ export function setupBuiltInVsCodeEditorSwfContributions(args: {
 
   args.context.subscriptions.push(
     vscode.languages.registerCodeLensProvider(
-      { scheme: "file", pattern: "**/*.sw.{json,yaml,yml}" },
+      { pattern: "**/*.sw.{json,yaml,yml}" },
       {
         provideCodeLenses: async (document: vscode.TextDocument, token: vscode.CancellationToken) => {
           const lsCodeLenses = await args.vsCodeSwfLanguageService.getLs(document).getCodeLenses({
@@ -179,7 +179,7 @@ export function setupBuiltInVsCodeEditorSwfContributions(args: {
 
   args.context.subscriptions.push(
     vscode.languages.registerCompletionItemProvider(
-      { scheme: "file", pattern: "**/*.sw.{json,yaml,yml}" },
+      { pattern: "**/*.sw.{json,yaml,yml}" },
       {
         provideCompletionItems: async (
           document: vscode.TextDocument,
diff --git a/packages/yard-editor/package.json b/packages/yard-editor/package.json
index 6e517bc871..489d427b34 100644
--- a/packages/yard-editor/package.json
+++ b/packages/yard-editor/package.json
@@ -38,8 +38,8 @@
     "@kie-tools-core/workspace": "workspace:*",
     "@kie-tools/boxed-expression-component": "workspace:*",
     "@kie-tools/i18n-common-dictionary": "workspace:*",
-    "@patternfly/react-core": "^4.157.3",
-    "@patternfly/react-icons": "^4.11.17",
+    "@patternfly/react-core": "^4.276.6",
+    "@patternfly/react-icons": "^4.93.6",
     "@types/js-yaml": "^4.0.5",
     "csstype": "^3.0.11",
     "js-yaml": "^4.1.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 960d5da083..04695755dd 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -15,6 +15,9 @@ importers:
       "@kie-tools-scripts/build-env":
         specifier: workspace:*
         version: link:scripts/build-env
+      "@kie-tools-scripts/check-junit-report-results":
+        specifier: workspace:*
+        version: link:scripts/check-junit-report-results
       "@kie-tools-scripts/run-script-if":
         specifier: workspace:*
         version: link:scripts/run-script-if
@@ -64,11 +67,11 @@ importers:
         specifier: workspace:*
         version: link:../../packages/workspace
       "@patternfly/react-core":
-        specifier: ^4.157.3
-        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.276.6
+        version: 4.276.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-icons":
-        specifier: ^4.11.17
-        version: 4.19.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.93.6
+        version: 4.93.6(react-dom@17.0.2)(react@17.0.2)
       react:
         specifier: ^17.0.2
         version: 17.0.2
@@ -459,11 +462,11 @@ importers:
         specifier: workspace:*
         version: link:../../packages/uniforms-patternfly
       "@patternfly/react-core":
-        specifier: ^4.157.3
-        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.276.6
+        version: 4.276.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-icons":
-        specifier: ^4.11.17
-        version: 4.19.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.93.6
+        version: 4.93.6(react-dom@17.0.2)(react@17.0.2)
       ajv:
         specifier: ^6.12.6
         version: 6.12.6
@@ -577,11 +580,11 @@ importers:
         specifier: workspace:*
         version: link:../../packages/serverless-workflow-standalone-editor
       "@patternfly/react-core":
-        specifier: ^4.157.3
-        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.276.6
+        version: 4.276.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-icons":
-        specifier: ^4.11.17
-        version: 4.19.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.93.6
+        version: 4.93.6(react-dom@17.0.2)(react@17.0.2)
       monaco-editor:
         specifier: ^0.33.0
         version: 0.33.0
@@ -656,8 +659,8 @@ importers:
         specifier: ^0.27.2
         version: 0.27.2
       fast-xml-parser:
-        specifier: ^3.17.4
-        version: 3.17.4
+        specifier: ^4.1.2
+        version: 4.1.2
       portfinder:
         specifier: ^1.0.32
         version: 1.0.32
@@ -753,17 +756,17 @@ importers:
         specifier: workspace:*
         version: link:../i18n-common-dictionary
       "@patternfly/react-core":
-        specifier: ^4.157.3
-        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.276.6
+        version: 4.276.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-icons":
-        specifier: ^4.11.17
-        version: 4.19.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.93.6
+        version: 4.93.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-styles":
-        specifier: ^4.18.8
-        version: 4.18.8
+        specifier: ^4.92.6
+        version: 4.92.6
       "@patternfly/react-table":
-        specifier: ^4.27.15
-        version: 4.37.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.112.39
+        version: 4.112.39(react-dom@17.0.2)(react@17.0.2)
       lodash:
         specifier: ^4.17.21
         version: 4.17.21
@@ -1823,6 +1826,109 @@ importers:
         specifier: ^5.8.0
         version: 5.8.0
 
+  packages/dashbuilder-component-swf-editor:
+    dependencies:
+      "@kie-tools-core/patternfly-base":
+        specifier: workspace:*
+        version: link:../patternfly-base
+      "@kie-tools/dashbuilder-component-api":
+        specifier: workspace:*
+        version: link:../dashbuilder-component-api
+      "@kie-tools/serverless-workflow-standalone-editor":
+        specifier: workspace:*
+        version: link:../serverless-workflow-standalone-editor
+      heatmap.js:
+        specifier: ^2.0.5
+        version: 2.0.5
+      react:
+        specifier: ^17.0.2
+        version: 17.0.2
+      react-dom:
+        specifier: ^17.0.2
+        version: 17.0.2(react@17.0.2)
+    devDependencies:
+      "@babel/core":
+        specifier: ^7.16.0
+        version: 7.16.12
+      "@babel/preset-env":
+        specifier: ^7.16.0
+        version: 7.16.11(@babel/core@7.16.12)
+      "@babel/preset-react":
+        specifier: ^7.16.0
+        version: 7.16.0(@babel/core@7.16.12)
+      "@kie-tools-core/webpack-base":
+        specifier: workspace:*
+        version: link:../webpack-base
+      "@kie-tools/dashbuilder-component-dev":
+        specifier: workspace:*
+        version: link:../dashbuilder-component-dev
+      "@kie-tools/eslint":
+        specifier: workspace:*
+        version: link:../eslint
+      "@kie-tools/root-env":
+        specifier: workspace:*
+        version: link:../root-env
+      "@kie-tools/tsconfig":
+        specifier: workspace:*
+        version: link:../tsconfig
+      "@testing-library/jest-dom":
+        specifier: ^5.16.1
+        version: 5.16.1
+      "@types/heatmap.js":
+        specifier: ^2.0.36
+        version: 2.0.37
+      "@types/jest":
+        specifier: ^26.0.23
+        version: 26.0.23
+      "@types/jest-when":
+        specifier: ^2.7.4
+        version: 2.7.4
+      "@types/react":
+        specifier: ^17.0.6
+        version: 17.0.21
+      "@types/react-dom":
+        specifier: ^17.0.5
+        version: 17.0.8
+      "@types/testing-library__jest-dom":
+        specifier: ^5.9.1
+        version: 5.9.5
+      copy-webpack-plugin:
+        specifier: ^11.0.0
+        version: 11.0.0(webpack@5.70.0)
+      html-webpack-plugin:
+        specifier: ^5.3.2
+        version: 5.3.2(webpack@5.70.0)
+      jest:
+        specifier: ^26.6.3
+        version: 26.6.3
+      jest-junit:
+        specifier: ^14.0.0
+        version: 14.0.0
+      jest-when:
+        specifier: ^3.5.0
+        version: 3.5.0(jest@26.6.3)
+      rimraf:
+        specifier: ^3.0.2
+        version: 3.0.2
+      ts-jest:
+        specifier: ^26.5.6
+        version: 26.5.6(jest@26.6.3)(typescript@4.8.4)
+      typescript:
+        specifier: ^4.4.2
+        version: 4.8.4
+      webpack:
+        specifier: ^5.36.2
+        version: 5.70.0(webpack-cli@4.10.0)
+      webpack-cli:
+        specifier: ^4.10.0
+        version: 4.10.0(webpack-dev-server@4.7.3)(webpack@5.70.0)
+      webpack-dev-server:
+        specifier: ^4.7.3
+        version: 4.7.3(webpack-cli@4.10.0)(webpack@5.70.0)
+      webpack-merge:
+        specifier: ^5.8.0
+        version: 5.8.0
+
   packages/dashbuilder-component-table:
     dependencies:
       "@kie-tools-core/patternfly-base":
@@ -1832,11 +1938,11 @@ importers:
         specifier: workspace:*
         version: link:../dashbuilder-component-api
       "@patternfly/react-core":
-        specifier: ^4.157.3
-        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.276.6
+        version: 4.276.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-table":
-        specifier: ^4.27.15
-        version: 4.37.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.112.39
+        version: 4.112.39(react-dom@17.0.2)(react@17.0.2)
       react:
         specifier: ^17.0.2
         version: 17.0.2
@@ -2035,11 +2141,11 @@ importers:
         specifier: workspace:*
         version: link:../uniforms-patternfly
       "@patternfly/react-core":
-        specifier: ^4.157.3
-        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.276.6
+        version: 4.276.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-table":
-        specifier: ^4.27.15
-        version: 4.37.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.112.39
+        version: 4.112.39(react-dom@17.0.2)(react@17.0.2)
       ajv:
         specifier: ^6.12.6
         version: 6.12.6
@@ -2147,14 +2253,14 @@ importers:
         specifier: workspace:*
         version: link:../dashbuilder-component-api
       "@patternfly/react-charts":
-        specifier: ^6.15.23
-        version: 6.15.23(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^6.94.18
+        version: 6.94.18(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-core":
-        specifier: ^4.157.3
-        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.276.6
+        version: 4.276.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-table":
-        specifier: ^4.27.15
-        version: 4.37.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.112.39
+        version: 4.112.39(react-dom@17.0.2)(react@17.0.2)
       numeral:
         specifier: ^2.0.6
         version: 2.0.6
@@ -2283,11 +2389,11 @@ importers:
         specifier: workspace:*
         version: link:../dashbuilder-language-service
       "@patternfly/react-core":
-        specifier: ^4.157.3
-        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.276.6
+        version: 4.276.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-icons":
-        specifier: ^4.11.17
-        version: 4.19.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.93.6
+        version: 4.93.6(react-dom@17.0.2)(react@17.0.2)
       json-schema:
         specifier: ^0.4.0
         version: 0.4.0
@@ -2514,11 +2620,11 @@ importers:
         specifier: workspace:*
         version: link:../workspace
       "@patternfly/react-core":
-        specifier: ^4.157.3
-        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.276.6
+        version: 4.276.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-icons":
-        specifier: ^4.11.17
-        version: 4.19.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.93.6
+        version: 4.93.6(react-dom@17.0.2)(react@17.0.2)
       react:
         specifier: ^17.0.2
         version: 17.0.2
@@ -2641,11 +2747,11 @@ importers:
         specifier: workspace:*
         version: link:../i18n-common-dictionary
       "@patternfly/react-core":
-        specifier: ^4.157.3
-        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.276.6
+        version: 4.276.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-icons":
-        specifier: ^4.11.17
-        version: 4.19.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.93.6
+        version: 4.93.6(react-dom@17.0.2)(react@17.0.2)
       react:
         specifier: ^17.0.2
         version: 17.0.2
@@ -2808,11 +2914,11 @@ importers:
         specifier: workspace:*
         version: link:../i18n-common-dictionary
       "@patternfly/react-core":
-        specifier: ^4.157.3
-        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.276.6
+        version: 4.276.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-icons":
-        specifier: ^4.11.17
-        version: 4.19.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.93.6
+        version: 4.93.6(react-dom@17.0.2)(react@17.0.2)
       react:
         specifier: ^17.0.2
         version: 17.0.2
@@ -2998,11 +3104,11 @@ importers:
         specifier: workspace:*
         version: link:../workspace
       "@patternfly/react-core":
-        specifier: ^4.157.3
-        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.276.6
+        version: 4.276.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-icons":
-        specifier: ^4.11.17
-        version: 4.19.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.93.6
+        version: 4.93.6(react-dom@17.0.2)(react@17.0.2)
       csstype:
         specifier: ^3.0.11
         version: 3.0.11
@@ -3375,11 +3481,11 @@ importers:
         specifier: workspace:*
         version: link:../uniforms-patternfly
       "@patternfly/react-core":
-        specifier: ^4.157.3
-        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.276.6
+        version: 4.276.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-icons":
-        specifier: ^4.11.17
-        version: 4.19.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.93.6
+        version: 4.93.6(react-dom@17.0.2)(react@17.0.2)
       ajv:
         specifier: ^6.12.6
         version: 6.12.6
@@ -3484,11 +3590,11 @@ importers:
         specifier: workspace:*
         version: link:../uniforms-patternfly
       "@patternfly/react-core":
-        specifier: ^4.157.3
-        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.276.6
+        version: 4.276.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-icons":
-        specifier: ^4.11.17
-        version: 4.19.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.93.6
+        version: 4.93.6(react-dom@17.0.2)(react@17.0.2)
       ajv:
         specifier: ^6.12.6
         version: 6.12.6
@@ -3708,11 +3814,11 @@ importers:
         specifier: workspace:*
         version: link:../patternfly-base
       "@patternfly/react-core":
-        specifier: ^4.157.3
-        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.276.6
+        version: 4.276.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-icons":
-        specifier: ^4.11.17
-        version: 4.19.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.93.6
+        version: 4.93.6(react-dom@17.0.2)(react@17.0.2)
       react:
         specifier: ^17.0.2
         version: 17.0.2
@@ -3955,14 +4061,14 @@ importers:
         specifier: workspace:*
         version: link:../i18n-common-dictionary
       "@patternfly/react-core":
-        specifier: ^4.157.3
-        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.276.6
+        version: 4.276.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-icons":
-        specifier: ^4.11.17
-        version: 4.19.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.93.6
+        version: 4.93.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-table":
-        specifier: ^4.27.15
-        version: 4.37.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.112.39
+        version: 4.112.39(react-dom@17.0.2)(react@17.0.2)
       react:
         specifier: ^17.0.2
         version: 17.0.2
@@ -4167,8 +4273,8 @@ importers:
         specifier: workspace:*
         version: link:../pmml-editor-marshaller
       "@patternfly/react-core":
-        specifier: ^4.157.3
-        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.276.6
+        version: 4.276.6(react-dom@17.0.2)(react@17.0.2)
       react:
         specifier: ^17.0.2
         version: 17.0.2
@@ -4711,14 +4817,14 @@ importers:
         specifier: ^18.5.3
         version: 18.5.3
       "@patternfly/react-core":
-        specifier: ^4.157.3
-        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.276.6
+        version: 4.276.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-icons":
-        specifier: ^4.11.17
-        version: 4.19.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.93.6
+        version: 4.93.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-tokens":
-        specifier: ^4.33.1
-        version: 4.33.1
+        specifier: ^4.94.6
+        version: 4.94.6
       bowser:
         specifier: ^2.10.0
         version: 2.11.0
@@ -5036,14 +5142,14 @@ importers:
         specifier: workspace:*
         version: link:../pmml-editor-marshaller
       "@patternfly/react-charts":
-        specifier: ^6.15.23
-        version: 6.15.23(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^6.94.18
+        version: 6.94.18(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-core":
-        specifier: ^4.157.3
-        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.276.6
+        version: 4.276.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-icons":
-        specifier: ^4.11.17
-        version: 4.19.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.93.6
+        version: 4.93.6(react-dom@17.0.2)(react@17.0.2)
       "@types/lodash":
         specifier: ^4.14.168
         version: 4.14.169
@@ -5423,16 +5529,16 @@ importers:
         version: 18.5.3
       "@patternfly/quickstarts":
         specifier: ^2.3.2
-        version: 2.3.3(@patternfly/react-core@4.168.8)(react-dom@17.0.2)(react@17.0.2)(showdown@2.1.0)
+        version: 2.3.3(@patternfly/react-core@4.276.6)(react-dom@17.0.2)(react@17.0.2)(showdown@2.1.0)
       "@patternfly/react-core":
-        specifier: ^4.157.3
-        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.276.6
+        version: 4.276.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-icons":
-        specifier: ^4.11.17
-        version: 4.19.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.93.6
+        version: 4.93.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-tokens":
-        specifier: ^4.33.1
-        version: 4.33.1
+        specifier: ^4.94.6
+        version: 4.94.6
       "@rhoas/registry-instance-sdk":
         specifier: ^0.34.1
         version: 0.34.1
@@ -5675,11 +5781,11 @@ importers:
         specifier: workspace:*
         version: link:../i18n-common-dictionary
       "@patternfly/react-core":
-        specifier: ^4.157.3
-        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.276.6
+        version: 4.276.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-icons":
-        specifier: ^4.11.17
-        version: 4.19.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.93.6
+        version: 4.93.6(react-dom@17.0.2)(react@17.0.2)
       react:
         specifier: ^17.0.2
         version: 17.0.2
@@ -5817,11 +5923,11 @@ importers:
         specifier: workspace:*
         version: link:../serverless-workflow-text-editor
       "@patternfly/react-core":
-        specifier: ^4.157.3
-        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.276.6
+        version: 4.276.6(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-icons":
-        specifier: ^4.11.17
-        version: 4.19.8(react-dom@17.0.2)(react@17.0.2)
+        specifier: ^4.93.6
+        version: 4.93.6(react-dom@17.0.2)(react@17.0.2)
       json-schema:
         specifier: ^0.4.0
         version: 0.4.0
@@ -6041,6 +6147,58 @@ importers:
         specifier: ^4.4.2
         version: 4.5.4
 
+  packages/serverless-workflow-jq-expressions:
+    dependencies:
+      "@kie-tools/serverless-workflow-service-catalog":
+        specifier: workspace:*
+        version: link:../serverless-workflow-service-catalog
+      cross-fetch:
+        specifier: ^3.1.5
+        version: 3.1.5
+    devDependencies:
+      "@babel/core":
... 2050 lines suppressed ...


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 21/27: KOGITO-8972: Refactor UX Minor fixes (#1648)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit 67ce3c75682c34a844daace8247802248c3b5be2
Author: Fabrizio Antonangeli <fa...@gmail.com>
AuthorDate: Thu May 18 18:18:49 2023 +0200

    KOGITO-8972: Refactor UX Minor fixes  (#1648)
    
    Co-authored-by: Guilherme Caponetto <63...@users.noreply.github.com>
---
 .../serverless-logic-web-tools/src/PageTitle.tsx   |  26 ++++
 .../src/editor/EditorPage.tsx                      |   3 +-
 .../src/editor/NewFileDropdownMenu.tsx             |  63 ++++++---
 .../sample/{Showcase.tsx => SamplesCatalog.tsx}    |  53 +++++++-
 .../src/home/sample/sampleApi.ts                   |   1 +
 .../src/homepage/overView/ImportFromUrlCard.tsx    |   5 +-
 .../src/homepage/overView/NewModelCard.tsx         |  43 ++++--
 .../homepage/overView/NewServerlessModelCard.tsx   |  69 ----------
 .../src/homepage/overView/Overview.tsx             |  26 ++--
 .../src/homepage/recentModels/RecentModels.tsx     |   9 +-
 .../recentModels/workspaceFiles/WorkspaceFiles.tsx |   3 +
 .../src/homepage/routes/HomePageRoutes.tsx         |   4 +-
 .../KieSandboxExtendedServicesModal.tsx            |   2 +-
 .../src/navigation/Routes.ts                       |  13 +-
 .../dropdown/OpenshiftDeploymentsDropdown.tsx      |   9 +-
 .../ApplicationServicesIntegrationQuickStart.ts    | 150 +--------------------
 .../src/settings/SettingsContext.tsx               |   1 +
 .../KieSandboxExtendedServicesSettings.tsx         |  20 ++-
 .../featurePreview/FeaturePreviewSettings.tsx      |  14 +-
 .../src/settings/github/GitHubSettings.tsx         |  11 +-
 .../src/settings/openshift/OpenShiftSettings.tsx   |  18 ++-
 .../serviceAccount/ServiceAccountSettings.tsx      |  23 ++--
 .../serviceRegistry/ServiceRegistrySettings.tsx    |  22 ++-
 .../src/workspace/components/ImportFromUrlForm.tsx |  12 +-
 24 files changed, 288 insertions(+), 312 deletions(-)

diff --git a/packages/serverless-logic-web-tools/src/PageTitle.tsx b/packages/serverless-logic-web-tools/src/PageTitle.tsx
new file mode 100644
index 0000000000..00b6337e28
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/PageTitle.tsx
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { APP_NAME } from "./AppConstants";
+
+/**
+ *
+ * Sets the title of the page by concatenating the given title sections and append the application name.
+ * @param titleSections An array of strings representing the sections of the title in the order of [parent, children]
+ * @returns
+ */
+export function setPageTitle(titleSections: string[]): void {
+  document.title = [APP_NAME, ...titleSections].reverse().join(" | ");
+}
diff --git a/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx b/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx
index b0e9dc58f2..4fe16df52c 100644
--- a/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx
@@ -42,6 +42,7 @@ import { EditorToolbar } from "./EditorToolbar";
 import { APP_NAME } from "../AppConstants";
 import { WebToolsEmbeddedEditor, WebToolsEmbeddedEditorRef } from "./WebToolsEmbeddedEditor";
 import { useEditorNotifications } from "./hooks/useEditorNotifications";
+import { setPageTitle } from "../PageTitle";
 
 export interface Props {
   workspaceId: string;
@@ -73,7 +74,7 @@ export function EditorPage(props: Props) {
   });
 
   useEffect(() => {
-    document.title = `${APP_NAME} :: ${props.fileRelativePath}`;
+    setPageTitle([props.fileRelativePath]);
   }, [props.fileRelativePath]);
 
   // keep the page in sync with the name of `workspaceFilePromise`, even if changes
diff --git a/packages/serverless-logic-web-tools/src/editor/NewFileDropdownMenu.tsx b/packages/serverless-logic-web-tools/src/editor/NewFileDropdownMenu.tsx
index 8f12de447f..5996576438 100644
--- a/packages/serverless-logic-web-tools/src/editor/NewFileDropdownMenu.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/NewFileDropdownMenu.tsx
@@ -18,7 +18,6 @@ import * as React from "react";
 import { useCallback, useEffect, useRef, useState } from "react";
 import { useWorkspaces, WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
 import { FileLabel } from "../workspace/components/FileLabel";
-import { Flex, FlexItem } from "@patternfly/react-core/dist/js/layouts/Flex";
 import { Divider } from "@patternfly/react-core/dist/js/components/Divider";
 import {
   DrilldownMenu,
@@ -39,6 +38,7 @@ import { FileTypes } from "@kie-tools-core/workspaces-git-fs/dist/constants/Exte
 import { decoder } from "@kie-tools-core/workspaces-git-fs/dist/encoderdecoder/EncoderDecoder";
 import { extractExtension } from "@kie-tools-core/workspaces-git-fs/dist/relativePath/WorkspaceFileRelativePathParser";
 import { UrlType } from "../workspace/hooks/ImportableUrlHooks";
+import { ValidatedOptions } from "@patternfly/react-core/dist/js";
 
 const ROOT_MENU_ID = "addFileRootMenu";
 
@@ -54,6 +54,8 @@ export function NewFileDropdownMenu(props: {
   const [drilldownPath, setDrilldownPath] = useState<string[]>([]);
   const [menuHeights, setMenuHeights] = useState<{ [key: string]: number }>({});
   const [activeMenu, setActiveMenu] = useState(ROOT_MENU_ID);
+  const [url, setUrl] = useState("");
+  const [isUrlValid, setIsUrlValid] = useState(ValidatedOptions.default);
 
   const drillIn = useCallback((_event, fromMenuId, toMenuId, pathId) => {
     setMenuDrilledIn((prev) => [...prev, fromMenuId]);
@@ -206,7 +208,32 @@ export function NewFileDropdownMenu(props: {
     [workspaces, props, successfullyUploadedAlert]
   );
 
-  const [url, setUrl] = useState("");
+  const NewJsonYamlDrilldownMenuItem = useCallback(
+    (args: { prefixId: string; description: string; fileTypes: { json: FileTypes; yaml: FileTypes } }) => (
+      <MenuItem
+        itemId={`${args.prefixId}ItemId`}
+        description={args.description}
+        direction={"down"}
+        drilldownMenu={
+          <DrilldownMenu id={`${args.prefixId}File`}>
+            <MenuItem direction="up">Back</MenuItem>
+            <Divider />
+            <MenuItem onClick={() => addEmptyFile(args.fileTypes.json)} itemId={`${args.prefixId}Json`}>
+              JSON
+            </MenuItem>
+            <MenuItem onClick={() => addEmptyFile(args.fileTypes.yaml)} itemId={`${args.prefixId}Yaml`}>
+              YAML
+            </MenuItem>
+          </DrilldownMenu>
+        }
+      >
+        <b>
+          <FileLabel style={{ marginBottom: "4px" }} extension={args.fileTypes.json} />
+        </b>
+      </MenuItem>
+    ),
+    [addEmptyFile]
+  );
 
   return (
     <Menu
@@ -222,28 +249,20 @@ export function NewFileDropdownMenu(props: {
     >
       <MenuContent menuHeight={`${menuHeights[activeMenu]}px`}>
         <MenuList style={{ padding: 0 }}>
-          <MenuItem
-            itemId={"newSwfItemId"}
-            onClick={() => addEmptyFile(FileTypes.SW_JSON)}
-            description="Serverless Workflow files are used to define orchestration logic for services."
-          >
-            <b>
-              <FileLabel style={{ marginBottom: "4px" }} extension={FileTypes.SW_JSON} />
-            </b>
-          </MenuItem>
-          <MenuItem
-            itemId={"newSdItemId"}
-            onClick={() => addEmptyFile(FileTypes.YARD_YAML)}
-            description="Serverless Decision files are used to define decision logic for services."
-          >
-            <b>
-              <FileLabel style={{ marginBottom: "4px" }} extension={FileTypes.YARD_YAML} />
-            </b>
-          </MenuItem>
+          <NewJsonYamlDrilldownMenuItem
+            prefixId="newSwf"
+            description="Define orchestration logic for services."
+            fileTypes={{ json: FileTypes.SW_JSON, yaml: FileTypes.SW_YAML }}
+          />
+          <NewJsonYamlDrilldownMenuItem
+            prefixId="newSd"
+            description="Define decision logic for services."
+            fileTypes={{ json: FileTypes.YARD_JSON, yaml: FileTypes.YARD_YAML }}
+          />
           <MenuItem
             itemId={"newDashboardItemId"}
             onClick={() => addEmptyFile(FileTypes.DASH_YAML)}
-            description="Dashboard files are used to define data visualization from data extracted from applications."
+            description="Define data visualization from data extracted from applications."
           >
             <b>
               <FileLabel style={{ marginBottom: "4px" }} extension={FileTypes.DASH_YAML} />
@@ -267,6 +286,7 @@ export function NewFileDropdownMenu(props: {
                       setUrl(url);
                       setImportingError(undefined);
                     }}
+                    onValidate={setIsUrlValid}
                     onSubmit={() => importFromUrl(url)}
                   />
                 </MenuInput>
@@ -275,6 +295,7 @@ export function NewFileDropdownMenu(props: {
                     variant={url.length > 0 ? ButtonVariant.primary : ButtonVariant.secondary}
                     isLoading={isImporting}
                     onClick={() => importFromUrl(url)}
+                    isDisabled={isUrlValid !== ValidatedOptions.success}
                   >
                     Import
                   </Button>
diff --git a/packages/serverless-logic-web-tools/src/home/sample/Showcase.tsx b/packages/serverless-logic-web-tools/src/home/sample/SamplesCatalog.tsx
similarity index 84%
rename from packages/serverless-logic-web-tools/src/home/sample/Showcase.tsx
rename to packages/serverless-logic-web-tools/src/home/sample/SamplesCatalog.tsx
index 52303c80b2..cac108bc89 100644
--- a/packages/serverless-logic-web-tools/src/home/sample/Showcase.tsx
+++ b/packages/serverless-logic-web-tools/src/home/sample/SamplesCatalog.tsx
@@ -31,13 +31,20 @@ import { Gallery } from "@patternfly/react-core/dist/js/layouts/Gallery";
 import { CubesIcon } from "@patternfly/react-icons/dist/js/icons/cubes-icon";
 import * as React from "react";
 import { useCallback, useEffect, useMemo, useState } from "react";
+import { useHistory, useLocation } from "react-router";
+import { QueryParams } from "../../navigation/Routes";
+import { setPageTitle } from "../../PageTitle";
+import { useQueryParam } from "../../queryParams/QueryParamsContext";
 import { FileLabel } from "../../workspace/components/FileLabel";
 import { useSampleDispatch } from "./hooks/SampleContext";
-import { Sample, SampleCategory, SampleCoversHashtable } from "./sampleApi";
+import { Sample, SampleCategories, SampleCategory, SampleCoversHashtable } from "./sampleApi";
 import { SampleCard } from "./SampleCard";
 import { SampleCardSkeleton } from "./SampleCardSkeleton";
 import { SamplesLoadError } from "./SamplesLoadError";
 
+type SearchParams = { searchValue: string; category?: SampleCategory };
+
+const PAGE_TITLE = "Samples Catalog";
 const SAMPLE_PRIORITY: Record<SampleCategory, number> = {
   ["serverless-workflow"]: 1,
   ["dashbuilder"]: 2,
@@ -61,16 +68,20 @@ export const SAMPLE_CARDS_PER_PAGE_OPTIONS: PerPageOptions[] = [
   },
 ];
 
-export function Showcase() {
+export function SamplesCatalog() {
   const sampleDispatch = useSampleDispatch();
   const [loading, setLoading] = useState<boolean>(true);
   const [samples, setSamples] = useState<Sample[]>([]);
   const [sampleCovers, setSampleCovers] = useState<SampleCoversHashtable>({});
   const [sampleLoadingError, setSampleLoadingError] = useState("");
   const [searchFilter, setSearchFilter] = useState("");
-  const [categoryFilter, setCategoryFilter] = useState<SampleCategory | undefined>();
+  const [searchParams, setSearchParams] = useState<SearchParams>({ searchValue: "", category: undefined });
   const [page, setPage] = React.useState(1);
   const [isCategoryFilterDropdownOpen, setCategoryFilterDropdownOpen] = useState(false);
+  const history = useHistory();
+  const location = useLocation();
+
+  const categoryFilter = useQueryParam(QueryParams.SAMPLES_CATEGORY) as SampleCategory;
 
   const visibleSamples = useMemo(
     () => samples.slice((page - 1) * CARDS_PER_PAGE, page * CARDS_PER_PAGE),
@@ -94,18 +105,42 @@ export function Showcase() {
     return ALL_CATEGORIES_LABEL;
   }, [categoryFilter]);
 
+  const setCategoryFilter = useCallback(
+    (category?: SampleCategory) => {
+      const searchParams = new URLSearchParams(location.search);
+      if (category) {
+        searchParams.set(QueryParams.SAMPLES_CATEGORY, category);
+      } else {
+        searchParams.delete(QueryParams.SAMPLES_CATEGORY);
+      }
+      const newSearchString = searchParams.toString();
+      history.push({ search: newSearchString });
+    },
+    [history, location]
+  );
+
   const onSearch = useCallback(
-    async (args: { searchValue: string; category?: SampleCategory }) => {
-      if (args.searchValue === searchFilter && args.category === categoryFilter) {
+    async (args: SearchParams) => {
+      if (args.searchValue === searchParams.searchValue && args.category === searchParams.category) {
         return;
       }
       setSearchFilter(args.searchValue);
       setCategoryFilter(args.category);
+      setSearchParams(args);
       setSamples(await sampleDispatch.getSamples({ searchFilter: args.searchValue, categoryFilter: args.category }));
     },
-    [categoryFilter, sampleDispatch, searchFilter]
+    [sampleDispatch, setCategoryFilter, searchParams]
   );
 
+  useEffect(() => {
+    if (categoryFilter && !SampleCategories.includes(categoryFilter)) {
+      setCategoryFilter(undefined);
+      return;
+    }
+
+    onSearch({ searchValue: searchFilter, category: categoryFilter });
+  }, [categoryFilter, onSearch, searchFilter, setCategoryFilter]);
+
   useEffect(() => {
     sampleDispatch
       .getSamples({})
@@ -153,11 +188,15 @@ export function Showcase() {
     setPage(v);
   }, []);
 
+  useEffect(() => {
+    setPageTitle([PAGE_TITLE]);
+  }, []);
+
   return (
     <Page>
       <PageSection variant={"light"}>
         <TextContent>
-          <Text component={TextVariants.h1}>Samples Catalog</Text>
+          <Text component={TextVariants.h1}>{PAGE_TITLE}</Text>
           <Text component={TextVariants.p}>Try one of our samples to start defining your model.</Text>
         </TextContent>
         <Toolbar style={{ paddingBottom: "0" }}>
diff --git a/packages/serverless-logic-web-tools/src/home/sample/sampleApi.ts b/packages/serverless-logic-web-tools/src/home/sample/sampleApi.ts
index 7a8efb27ba..8a0ebd7f80 100644
--- a/packages/serverless-logic-web-tools/src/home/sample/sampleApi.ts
+++ b/packages/serverless-logic-web-tools/src/home/sample/sampleApi.ts
@@ -38,6 +38,7 @@ interface GitHubRepoInfo {
 type GitHubFileInfo = GitHubRepoInfo & { path: string };
 
 export type SampleCategory = "serverless-workflow" | "serverless-decision" | "dashbuilder";
+export const SampleCategories: SampleCategory[] = ["serverless-workflow", "serverless-decision", "dashbuilder"];
 
 const SUPPORTING_FILES_FOLDER = join(".github", "supporting-files");
 
diff --git a/packages/serverless-logic-web-tools/src/homepage/overView/ImportFromUrlCard.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/ImportFromUrlCard.tsx
index 6379023cda..bca84cafbd 100644
--- a/packages/serverless-logic-web-tools/src/homepage/overView/ImportFromUrlCard.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/overView/ImportFromUrlCard.tsx
@@ -25,12 +25,14 @@ import { CodeIcon } from "@patternfly/react-icons/dist/js/icons/code-icon";
 import { ImportFromUrlForm } from "../../workspace/components/ImportFromUrlForm";
 import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
 import { useEditorEnvelopeLocator } from "../../envelopeLocator/EditorEnvelopeLocatorContext";
+import { ValidatedOptions } from "@patternfly/react-core/dist/js/helpers";
 
 export function ImportFromUrlCard() {
   const routes = useRoutes();
   const history = useHistory();
   const editorEnvelopeLocator = useEditorEnvelopeLocator();
   const [url, setUrl] = useState("");
+  const [isUrlValid, setIsUrlValid] = useState(ValidatedOptions.default);
 
   const importFromUrl = useCallback(() => {
     history.push({
@@ -67,12 +69,13 @@ export function ImportFromUrlCard() {
           <Text component={TextVariants.p}>Import a GitHub Repository, a GitHub Gist, or any other file URL.</Text>
         </TextContent>
         <br />
-        <ImportFromUrlForm url={url} onChange={setUrl} onSubmit={importFromUrl} />
+        <ImportFromUrlForm url={url} onChange={setUrl} onSubmit={importFromUrl} onValidate={setIsUrlValid} />
       </CardBody>
       <CardFooter>
         <Button
           variant={url.length > 0 ? ButtonVariant.primary : ButtonVariant.secondary}
           onClick={importFromUrl}
+          isDisabled={isUrlValid !== ValidatedOptions.success}
           ouiaId="import-from-url-button"
         >
           {buttonLabel}
diff --git a/packages/serverless-logic-web-tools/src/homepage/overView/NewModelCard.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/NewModelCard.tsx
index 81fd7da2c3..a9ac11041a 100644
--- a/packages/serverless-logic-web-tools/src/homepage/overView/NewModelCard.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/overView/NewModelCard.tsx
@@ -17,6 +17,7 @@
 import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
 import { Card, CardBody, CardFooter, CardTitle } from "@patternfly/react-core/dist/js/components/Card";
 import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
+import { Flex } from "@patternfly/react-core/dist/js/layouts/Flex";
 import { GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
 import * as React from "react";
 import { Link } from "react-router-dom";
@@ -24,14 +25,24 @@ import { SupportedFileExtensions } from "../../extension";
 import { useRoutes } from "../../navigation/Hooks";
 import { FileLabel } from "../../workspace/components/FileLabel";
 
-export function NewModelCard(props: { title: string; extension: SupportedFileExtensions; description: string }) {
+export function NewModelCard(props: {
+  title: string;
+  jsonExtension?: SupportedFileExtensions;
+  yamlExtension?: SupportedFileExtensions;
+  description: string;
+}) {
   const routes = useRoutes();
+  const { jsonExtension, yamlExtension } = props;
+
+  if (!jsonExtension && !yamlExtension) {
+    throw new Error("At least one of jsonExtension or yamlExtension must be provided.");
+  }
 
   return (
     <GridItem sm={12} md={4}>
-      <Card isFullHeight={true} isPlain={true} isCompact>
+      <Card isFullHeight={true} isPlain={true} isCompact={true}>
         <CardTitle>
-          <FileLabel style={{ fontSize: "0.6em" }} extension={props.extension} />
+          <FileLabel style={{ fontSize: "0.6em" }} extension={(jsonExtension || yamlExtension)!} />
         </CardTitle>
         <CardBody>
           <TextContent>
@@ -39,11 +50,27 @@ export function NewModelCard(props: { title: string; extension: SupportedFileExt
           </TextContent>
         </CardBody>
         <CardFooter>
-          <Link to={{ pathname: routes.newModel.path({ extension: props.extension }) }}>
-            <Button variant={ButtonVariant.secondary} ouiaId={`new-${props.extension}-button`}>
-              New {props.title}
-            </Button>
-          </Link>
+          <TextContent>
+            <Text component={TextVariants.p}>
+              <b>New {props.title}</b>
+            </Text>
+          </TextContent>
+          <Flex>
+            {jsonExtension && (
+              <Link to={{ pathname: routes.newModel.path({ extension: jsonExtension }) }}>
+                <Button variant={ButtonVariant.secondary} ouiaId={`new-${jsonExtension}-button`} isSmall>
+                  JSON
+                </Button>
+              </Link>
+            )}
+            {yamlExtension && (
+              <Link to={{ pathname: routes.newModel.path({ extension: yamlExtension }) }}>
+                <Button variant={ButtonVariant.secondary} ouiaId={`new-${yamlExtension}-button`} isSmall>
+                  YAML
+                </Button>
+              </Link>
+            )}
+          </Flex>
         </CardFooter>
       </Card>
     </GridItem>
diff --git a/packages/serverless-logic-web-tools/src/homepage/overView/NewServerlessModelCard.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/NewServerlessModelCard.tsx
deleted file mode 100644
index a7141523cf..0000000000
--- a/packages/serverless-logic-web-tools/src/homepage/overView/NewServerlessModelCard.tsx
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
-import { Card, CardBody, CardFooter, CardTitle } from "@patternfly/react-core/dist/js/components/Card";
-import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
-import { Flex } from "@patternfly/react-core/dist/js/layouts/Flex";
-import { GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
-import * as React from "react";
-import { Link } from "react-router-dom";
-import { SupportedFileExtensions } from "../../extension";
-import { useRoutes } from "../../navigation/Hooks";
-import { FileLabel } from "../../workspace/components/FileLabel";
-
-export function NewServerlessModelCard(props: {
-  title: string;
-  jsonExtension: SupportedFileExtensions;
-  yamlExtension: SupportedFileExtensions;
-  description: string;
-}) {
-  const routes = useRoutes();
-
-  return (
-    <GridItem sm={12} md={4}>
-      <Card isFullHeight={true} isPlain={true} isCompact={true}>
-        <CardTitle>
-          <FileLabel style={{ fontSize: "0.6em" }} extension={props.jsonExtension} />
-        </CardTitle>
-        <CardBody>
-          <TextContent>
-            <Text component={TextVariants.p}>{props.description}</Text>
-          </TextContent>
-        </CardBody>
-        <CardFooter>
-          <TextContent>
-            <Text component={TextVariants.p}>
-              <b>New {props.title}</b>
-            </Text>
-          </TextContent>
-          <Flex>
-            <Link to={{ pathname: routes.newModel.path({ extension: props.jsonExtension }) }}>
-              <Button variant={ButtonVariant.secondary} ouiaId={`new-${props.jsonExtension}-button`}>
-                JSON
-              </Button>
-            </Link>
-            <Link to={{ pathname: routes.newModel.path({ extension: props.yamlExtension }) }}>
-              <Button variant={ButtonVariant.secondary} ouiaId={`new-${props.yamlExtension}-button`}>
-                YAML
-              </Button>
-            </Link>
-          </Flex>
-        </CardFooter>
-      </Card>
-    </GridItem>
-  );
-}
diff --git a/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx
index ac72570919..62f2bc857e 100644
--- a/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx
@@ -20,7 +20,7 @@ import { Grid, GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
 import { Gallery } from "@patternfly/react-core/dist/js/layouts/Gallery";
 import { PageSection } from "@patternfly/react-core/dist/js/components/Page";
 import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
-import { NewServerlessModelCard } from "./NewServerlessModelCard";
+import { NewModelCard } from "./NewModelCard";
 import { Button, ButtonVariant, Card, CardBody } from "@patternfly/react-core/dist/js";
 import { ImportFromUrlCard } from "./ImportFromUrlCard";
 import { UploadCard } from "./UploadCard";
@@ -28,8 +28,7 @@ import { useRoutes } from "../../navigation/Hooks";
 import { useHistory } from "react-router";
 import { useQueryParam, useQueryParams } from "../../queryParams/QueryParamsContext";
 import { QueryParams } from "../../navigation/Routes";
-import { useCallback, useContext, useMemo } from "react";
-import { NewModelCard } from "./NewModelCard";
+import { useEffect, useCallback, useContext, useMemo } from "react";
 import { Title } from "@patternfly/react-core/dist/js/components/Title";
 import { Stack, StackItem } from "@patternfly/react-core/dist/js/layouts/Stack";
 import { CardHeader, CardHeaderMain, CardTitle } from "@patternfly/react-core/dist/js/components/Card";
@@ -37,6 +36,9 @@ import { List, ListItem } from "@patternfly/react-core/dist/js/components/List";
 import { QuickStartContext, QuickStartContextValues } from "@patternfly/quickstarts";
 import { ExternalLinkAltIcon } from "@patternfly/react-icons/dist/js/icons";
 import { SERVERLESS_LOGIC_WEBTOOLS_DOCUMENTATION_URL } from "../../AppConstants";
+import { setPageTitle } from "../../PageTitle";
+
+const PAGE_TITLE = "Overview";
 
 export function Overview(props: { isNavOpen: boolean }) {
   const routes = useRoutes();
@@ -73,6 +75,10 @@ export function Overview(props: { isNavOpen: boolean }) {
     [closeExpandedWorkspace, history, routes, expandedWorkspaceId]
   );
 
+  useEffect(() => {
+    setPageTitle([PAGE_TITLE]);
+  }, []);
+
   return (
     <>
       <PageSection
@@ -129,24 +135,22 @@ export function Overview(props: { isNavOpen: boolean }) {
               </CardHeader>
               <CardBody>
                 <Grid>
-                  <NewServerlessModelCard
+                  <NewModelCard
                     title={"Workflow"}
                     jsonExtension={FileTypes.SW_JSON}
                     yamlExtension={FileTypes.SW_YAML}
-                    description={"Serverless Workflow files are used to define orchestration logic for services."}
+                    description={"Define orchestration logic for services."}
                   />
-                  <NewServerlessModelCard
+                  <NewModelCard
                     title={"Decision"}
                     jsonExtension={FileTypes.YARD_JSON}
                     yamlExtension={FileTypes.YARD_YAML}
-                    description={"Serverless Decision files are used to define decision logic for services."}
+                    description={"Define decision logic for services."}
                   />
                   <NewModelCard
                     title={"Dashboard"}
-                    extension={FileTypes.DASH_YAML}
-                    description={
-                      "Dashboard files are used to define data visualization from data extracted from applications."
-                    }
+                    yamlExtension={FileTypes.DASH_YML}
+                    description={"Define data visualization from data extracted from applications."}
                   />
                 </Grid>
               </CardBody>
diff --git a/packages/serverless-logic-web-tools/src/homepage/recentModels/RecentModels.tsx b/packages/serverless-logic-web-tools/src/homepage/recentModels/RecentModels.tsx
index c184cce16c..c7f3120d85 100644
--- a/packages/serverless-logic-web-tools/src/homepage/recentModels/RecentModels.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/recentModels/RecentModels.tsx
@@ -30,11 +30,14 @@ import * as React from "react";
 import { useCallback, useEffect, useMemo, useState } from "react";
 import { Alerts, AlertsController, useAlert } from "../../alerts/Alerts";
 import { splitFiles } from "../../extension";
+import { setPageTitle } from "../../PageTitle";
 import { ConfirmDeleteModal } from "../../table/ConfirmDeleteModal";
 import { defaultPerPageOptions, TablePagination } from "../../table/TablePagination";
 import { TableToolbar } from "../../table/TableToolbar";
 import { WorkspacesTable } from "./WorkspacesTable";
 
+const PAGE_TITLE = "Recent models";
+
 export function RecentModels() {
   const workspaceDescriptorsPromise = useWorkspaceDescriptorsPromise();
   const [selectedWorkspaceIds, setSelectedWorkspaceIds] = useState<WorkspaceDescriptor["workspaceId"][]>([]);
@@ -170,6 +173,10 @@ export function RecentModels() {
       .catch(() => setDeleteModalFetchError(true));
   }, [getWorkspaceName, selectedWorkspaceIds, isWsFolder]);
 
+  useEffect(() => {
+    setPageTitle([PAGE_TITLE]);
+  }, []);
+
   return (
     <PromiseStateWrapper
       promise={workspaceDescriptorsPromise}
@@ -183,7 +190,7 @@ export function RecentModels() {
             <Page>
               <PageSection variant={"light"}>
                 <TextContent>
-                  <Text component={TextVariants.h1}>Recent models</Text>
+                  <Text component={TextVariants.h1}>{PAGE_TITLE}</Text>
                   <Text component={TextVariants.p}>
                     Use your recent models from GitHub Repository, a GitHub Gist or saved in your browser.
                   </Text>
diff --git a/packages/serverless-logic-web-tools/src/homepage/recentModels/workspaceFiles/WorkspaceFiles.tsx b/packages/serverless-logic-web-tools/src/homepage/recentModels/workspaceFiles/WorkspaceFiles.tsx
index e97d8b00be..9829c9dd3f 100644
--- a/packages/serverless-logic-web-tools/src/homepage/recentModels/workspaceFiles/WorkspaceFiles.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/recentModels/workspaceFiles/WorkspaceFiles.tsx
@@ -36,6 +36,7 @@ import { Alerts, AlertsController, useAlert } from "../../../alerts/Alerts";
 import { NewFileDropdownMenu } from "../../../editor/NewFileDropdownMenu";
 import { splitFiles } from "../../../extension";
 import { routes } from "../../../navigation/Routes";
+import { setPageTitle } from "../../../PageTitle";
 import { ConfirmDeleteModal } from "../../../table/ConfirmDeleteModal";
 import { defaultPerPageOptions, TablePagination } from "../../../table/TablePagination";
 import { TableToolbar } from "../../../table/TableToolbar";
@@ -163,6 +164,8 @@ export function WorkspaceFiles(props: Props) {
         const filesCount = files.length;
         const allFilesCount = workspace.files.length;
 
+        setPageTitle([workspace.descriptor.name]);
+
         return (
           <>
             <Alerts ref={alertsRef} width={"500px"} />
diff --git a/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx b/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx
index 78aae5a70f..b6d61bb6e5 100644
--- a/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx
@@ -26,7 +26,7 @@ import { NewWorkspaceFromUrlPage } from "../../workspace/components/NewWorkspace
 import { NewWorkspaceWithEmptyFilePage } from "../../workspace/components/NewWorkspaceWithEmptyFilePage";
 import { EditorPage } from "../../editor/EditorPage";
 import { NoMatchPage } from "../../navigation/NoMatchPage";
-import { Showcase } from "../../home/sample/Showcase";
+import { SamplesCatalog } from "../../home/sample/SamplesCatalog";
 import { WorkspaceFiles } from "../recentModels/workspaceFiles/WorkspaceFiles";
 
 export function HomePageRoutes(props: { isNavOpen: boolean }) {
@@ -69,7 +69,7 @@ export function HomePageRoutes(props: { isNavOpen: boolean }) {
         {({ match }) => <WorkspaceFiles workspaceId={match!.params.workspaceId!} />}
       </Route>
       <Route path={routes.sampleCatalog.path({})}>
-        <Showcase />
+        <SamplesCatalog />
       </Route>
       <Route component={NoMatchPage} />
     </Switch>
diff --git a/packages/serverless-logic-web-tools/src/kieSandboxExtendedServices/KieSandboxExtendedServicesModal.tsx b/packages/serverless-logic-web-tools/src/kieSandboxExtendedServices/KieSandboxExtendedServicesModal.tsx
index 2c28e56473..a2ec0287ec 100644
--- a/packages/serverless-logic-web-tools/src/kieSandboxExtendedServices/KieSandboxExtendedServicesModal.tsx
+++ b/packages/serverless-logic-web-tools/src/kieSandboxExtendedServices/KieSandboxExtendedServicesModal.tsx
@@ -801,7 +801,7 @@ function KieSandboxExtendedServicesWizardFooter(props: WizardImperativeControlPr
     if (status === KieSandboxExtendedServicesStatus.STOPPED) {
       wizardContext.goToStepByName(props.steps[1].name);
     }
-  }, [status, props.setModalPage]);
+  }, [status, props.setModalPage, props.steps, wizardContext]);
 
   return (
     <WizardFooter>
diff --git a/packages/serverless-logic-web-tools/src/navigation/Routes.ts b/packages/serverless-logic-web-tools/src/navigation/Routes.ts
index 9230e52175..e2e485fdf4 100644
--- a/packages/serverless-logic-web-tools/src/navigation/Routes.ts
+++ b/packages/serverless-logic-web-tools/src/navigation/Routes.ts
@@ -25,6 +25,7 @@ export enum QueryParams {
   REMOVE_REMOTE = "removeRemote",
   RENAME_WORKSPACE = "renameWorkspace",
   SAMPLE_ID = "sampleId",
+  SAMPLES_CATEGORY = "category",
 }
 
 export enum PathParams {
@@ -136,17 +137,17 @@ export const routes = {
     pathParams: PathParams.WORKSPACE_ID;
   }>(({ workspaceId }) => `/${workspaceId}/files`),
 
-  recentModels: new Route<{}>(() => `/RecentModels`),
-  sampleCatalog: new Route<{}>(() => `/SampleCatalog`),
+  recentModels: new Route<{}>(() => `/recent-models`),
+  sampleCatalog: new Route<{}>(() => `/sample-catalog`),
 
   settings: {
     home: new Route<{}>(() => SETTINGS_ROUTE),
     github: new Route<{}>(() => `${SETTINGS_ROUTE}/github`),
     openshift: new Route<{}>(() => `${SETTINGS_ROUTE}/openshift`),
-    kie_sandbox_extended_services: new Route<{}>(() => `${SETTINGS_ROUTE}/kie_sandbox_extended_services`),
-    service_account: new Route<{}>(() => `${SETTINGS_ROUTE}/serviceAccount`),
-    service_registry: new Route<{}>(() => `${SETTINGS_ROUTE}/serviceRegistry`),
-    feature_preview: new Route<{}>(() => `${SETTINGS_ROUTE}/featurePreview`),
+    kie_sandbox_extended_services: new Route<{}>(() => `${SETTINGS_ROUTE}/kie-sandbox-extended-services`),
+    service_account: new Route<{}>(() => `${SETTINGS_ROUTE}/service-account`),
+    service_registry: new Route<{}>(() => `${SETTINGS_ROUTE}/service-registry`),
+    feature_preview: new Route<{}>(() => `${SETTINGS_ROUTE}/feature-preview`),
   },
 
   static: {
diff --git a/packages/serverless-logic-web-tools/src/openshift/dropdown/OpenshiftDeploymentsDropdown.tsx b/packages/serverless-logic-web-tools/src/openshift/dropdown/OpenshiftDeploymentsDropdown.tsx
index 6a4c26392b..ae3746a328 100644
--- a/packages/serverless-logic-web-tools/src/openshift/dropdown/OpenshiftDeploymentsDropdown.tsx
+++ b/packages/serverless-logic-web-tools/src/openshift/dropdown/OpenshiftDeploymentsDropdown.tsx
@@ -95,6 +95,13 @@ export function OpenshiftDeploymentsDropdown() {
     }
   }, [openshift.deployments, isConnected, openOpenShiftSettings, settings.openshift.config.namespace]);
 
+  const onDeploymensDropdownToggle = useCallback(() => {
+    if (!isConnected) {
+      history.push(routes.settings.openshift.path({}));
+    }
+    openshift.setDeploymentsDropdownOpen((dropdownOpen) => isConnected && !dropdownOpen);
+  }, [history, isConnected, openshift]);
+
   return (
     <>
       <Tooltip
@@ -110,7 +117,7 @@ export function OpenshiftDeploymentsDropdown() {
           toggle={
             <ResponsiveDropdownToggle
               toggleIndicator={null}
-              onToggle={() => openshift.setDeploymentsDropdownOpen((dropdownOpen) => isConnected && !dropdownOpen)}
+              onToggle={onDeploymensDropdownToggle}
               className={"kie-tools--masthead-hoverable-dark"}
             >
               <OpenshiftIcon color={!isConnected ? "gray" : undefined} />
diff --git a/packages/serverless-logic-web-tools/src/quickstarts-data/ApplicationServicesIntegrationQuickStart.ts b/packages/serverless-logic-web-tools/src/quickstarts-data/ApplicationServicesIntegrationQuickStart.ts
index 38e0974f29..15dd250ce9 100644
--- a/packages/serverless-logic-web-tools/src/quickstarts-data/ApplicationServicesIntegrationQuickStart.ts
+++ b/packages/serverless-logic-web-tools/src/quickstarts-data/ApplicationServicesIntegrationQuickStart.ts
@@ -27,7 +27,7 @@ export const ApplicationServicesIntegrationQuickStart: QuickStart = {
     durationMinutes: 30,
     prerequisites: ["You have access to the Red Hat OpenShift Application and Data Services console."],
     description: "",
-    introduction: ` Some of the features in Serverless Logic Web Tools require integration with Red Hat OpenShift Application and Data Services. Consider uploading OpenAPI specifications to a service registry and deploying Serverless Workflow that requires Apache Kafka as examples of integration with Red Hat OpenShift Application and Data Services.
+    introduction: ` Some of the features in Serverless Logic Web Tools require integration with Red Hat OpenShift Application and Data Services. Consider uploading OpenAPI specifications to a service registry and deploying Serverless Workflow as examples of integration with Red Hat OpenShift Application and Data Services.
 
 This document describes how you can configure the required settings to complete the integration with Red Hat OpenShift Application and Data Services.  `,
 
@@ -268,154 +268,6 @@ If you find an issue or any misleading information, please feel free to report i
           </div>
         </div>`,
       },
-      {
-        title: "Creating Streams for Apache Kafka in Red Hat OpenShift application and Data Services",
-        description: `<div class="sectionbody">
-          <div class="paragraph">
-            <p>You can create or use a Kafka instance from Red Hat OpenShift Application and Data Services console and add the instance to the Serverless Logic Web Tools.</p>
-          </div>
-          <div class="ulist">
-            <div class="title">
-              <em>
-                <strong>Prerequisites</strong>
-              </em>
-            </div>
-            <ul>
-              <li>
-                <p>You have access to the Red Hat OpenShift Application and Data Services console.</p>
-              </li>
-              <li>
-                <p>You have created a service account.</p>
-                <div class="paragraph">
-                  <p>For information about creating a service account, see <a href="https://kiegroup.github.io/kogito-docs/serverlessworkflow/latest/tooling/serverless-logic-web-tools/serverless-logic-web-tools-redhat-application-services-integration.html#proc-create-service-account-serverless-logic-web-tools">Creating a service account in Red Hat OpenShift application and Data Services</a>. </p>
-                </div>
-              </li>
-            </ul>
-          </div>
-          <div class="olist arabic">
-            <div class="title">
-              <em>
-                <strong>Procedure</strong>
-              </em>
-            </div>
-            <ol class="arabic">
-              <li>
-                <p>To create an Apache Kafka instance in Red Hat Openshift Application and Data Services console, perform the following steps:</p>
-                <div class="openblock">
-                  <div class="content">
-                    <div class="admonitionblock note">
-                      <table>
-                        <tbody>
-                          <tr>
-                            <td class="icon">&nbsp;</td>
-                            <td class="content">
-                              <div class="paragraph">
-                                <p>
-                                  <strong>NOTE <br>
-                                  </strong>You can skip this step if you already have an Apache Kafka instance.
-                                </p>
-                              </div>
-                            </td>
-                          </tr>
-                        </tbody>
-                      </table>
-                    </div>
-                    <div class="olist loweralpha">
-                      <ol class="loweralpha" type="a">
-                        <li>
-                          <p>Go to <a href="https://console.redhat.com/application-services/streams/kafkas">Streams for Apache Kafka | Red Hat OpenShift Application and Data Services</a>. </p>
-                        </li>
-                        <li>
-                          <p>Click <strong>Create Kafka instance</strong>. </p>
-                        </li>
-                        <li>
-                          <p>In the <strong>Create a Kafka instance</strong> window, enter the name for a Kafka instance. </p>
-                          <div class="paragraph">
-                            <p>You can also fill the other fields or leave those fields with default values.</p>
-                          </div>
-                        </li>
-                        <li>
-                          <p>Click <strong>Create instance</strong>. </p>
-                        </li>
-                        <li>
-                          <p>Reload the <strong>Kafka instances</strong> page for the list of instances to reflect the instance you created. </p>
-                        </li>
-                        <li>
-                          <p>Once the status of the Kafka instance you created is updated as <strong>Ready</strong>, click on the instance. </p>
-                        </li>
-                        <li>
-                          <p>Go to the <strong>Topics</strong> tab and create a new topic. </p>
-                        </li>
-                        <li>
-                          <p>Go to the <strong>Access</strong> tab, click <strong>Manage Access</strong>, and select <strong>All Accounts</strong> or the service account you created. </p>
-                        </li>
-                        <li>
-                          <p>Add the following permissions:</p>
-                          <div class="ulist">
-                            <ul>
-                              <li>
-                                <p>
-                                  <em>Consumer group is " * " | Allow All | All Accounts</em>;
-                                </p>
-                              </li>
-                              <li>
-                                <p>
-                                  <em>Topic is " * " | Allow All | All Accounts</em>;
-                                </p>
-                              </li>
-                            </ul>
-                          </div>
-                        </li>
-                        <li>
-                          <p>Click on the menu on the top-right corner of the screen.</p>
-                        </li>
-                        <li>
-                          <p>Click <strong>Connection</strong>. </p>
-                        </li>
-                        <li>
-                          <p>Copy the value of <strong>Bootstrap server</strong>. </p>
-                        </li>
-                      </ol>
-                    </div>
-                  </div>
-                </div>
-              </li>
-              <li>
-                <p>If you already have a Kafka instance, find the value of <strong>Bootstrap server</strong> of your Kafka instance. </p>
-              </li>
-              <li>
-                <p>In the Serverless Logic Web Tools web application, click on the <strong>Cog wheel</strong> (⚙️) on the top-right corner and go to the <strong>Streams for Apache Kafka</strong> tab. </p>
-              </li>
-              <li>
-                <p>Enter the value of <strong>Bootstrap server</strong>. </p>
-              </li>
-              <li>
-                <p>Enter the name of topic you created in the <strong>Topic</strong> field and click <strong>Apply</strong>. </p>
-                <div class="paragraph">
-                  <p>The content in the <strong>Streams for Apache Kafka</strong> tab updates and displays <strong>Your Streams for Apache Kafka information is set</strong> message. </p>
-                </div>
-              </li>
-            </ol>
-          </div>
-          <div class="admonitionblock note">
-            <table>
-              <tbody>
-                <tr>
-                  <td class="icon">&nbsp;</td>
-                  <td class="content">
-                    <div class="paragraph">
-                      <p>
-                        <strong>NOTE <br>
-                        </strong>The procedures in this document make the integration easy for you. However, you can also create specific service accounts, topics, and consumer groups.
-                      </p>
-                    </div>
-                  </td>
-                </tr>
-              </tbody>
-            </table>
-          </div>
-        </div>`,
-      },
     ],
   },
 };
diff --git a/packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx b/packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx
index d626bc2d06..10a8856bba 100644
--- a/packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx
@@ -112,6 +112,7 @@ export interface SettingsDispatchContextType {
   };
 }
 
+export const SETTINGS_PAGE_SECTION_TITLE = "Settings";
 export const SettingsContext = React.createContext<SettingsContextType>({} as any);
 export const SettingsDispatchContext = React.createContext<SettingsDispatchContextType>({} as any);
 
diff --git a/packages/serverless-logic-web-tools/src/settings/extendedServices/KieSandboxExtendedServicesSettings.tsx b/packages/serverless-logic-web-tools/src/settings/extendedServices/KieSandboxExtendedServicesSettings.tsx
index 529d9428fa..a57b209a12 100644
--- a/packages/serverless-logic-web-tools/src/settings/extendedServices/KieSandboxExtendedServicesSettings.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/extendedServices/KieSandboxExtendedServicesSettings.tsx
@@ -14,12 +14,14 @@
  * limitations under the License.
  */
 
-import { Modal, ModalVariant } from "@patternfly/react-core/dist/js/components/Modal";
+import React from "react";
+import { QuickStartContext, QuickStartContextValues } from "@patternfly/quickstarts";
 import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
 import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
 import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
 import { ActionGroup, Form, FormAlert, FormGroup } from "@patternfly/react-core/dist/js/components/Form";
 import { InputGroup, InputGroupText } from "@patternfly/react-core/dist/js/components/InputGroup";
+import { Modal, ModalVariant } from "@patternfly/react-core/dist/js/components/Modal";
 import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
 import { Popover } from "@patternfly/react-core/dist/js/components/Popover";
 import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
@@ -28,15 +30,17 @@ import { AddCircleOIcon } from "@patternfly/react-icons/dist/js/icons/add-circle
 import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-circle-icon";
 import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
 import { TimesIcon } from "@patternfly/react-icons/dist/js/icons/times-icon";
-import * as React from "react";
-import { useCallback, useMemo, useState, useContext } from "react";
+import { useCallback, useContext, useEffect, useMemo, useState } from "react";
+import { SETTINGS_PAGE_SECTION_TITLE } from "../SettingsContext";
 import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
 import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
-import { ExtendedServicesConfig, useSettings, useSettingsDispatch } from "../../settings/SettingsContext";
-import { QuickStartContext, QuickStartContextValues } from "@patternfly/quickstarts";
+import { setPageTitle } from "../../PageTitle";
 import { QuickStartIds } from "../../quickstarts-data";
+import { ExtendedServicesConfig, useSettings, useSettingsDispatch } from "../../settings/SettingsContext";
 import { SettingsPageProps } from "../types";
 
+const PAGE_TITLE = "KIE Sandbox Extended Services";
+
 export function KieSandboxExtendedServicesSettings(props: SettingsPageProps) {
   const settings = useSettings();
   const settingsDispatch = useSettingsDispatch();
@@ -76,11 +80,15 @@ export function KieSandboxExtendedServicesSettings(props: SettingsPageProps) {
     setIsModalOpen((prevIsModalOpen) => !prevIsModalOpen);
   }, []);
 
+  useEffect(() => {
+    setPageTitle([SETTINGS_PAGE_SECTION_TITLE, PAGE_TITLE]);
+  }, []);
+
   return (
     <Page>
       <PageSection variant={"light"} isWidthLimited>
         <TextContent>
-          <Text component={TextVariants.h1}>KIE Sandbox Extended Services</Text>
+          <Text component={TextVariants.h1}>{PAGE_TITLE}</Text>
           <Text component={TextVariants.p}>
             Data you provide here is necessary for proxying Serverless Logic Web Tools requests to OpenShift, thus
             making it possible to deploy models.
diff --git a/packages/serverless-logic-web-tools/src/settings/featurePreview/FeaturePreviewSettings.tsx b/packages/serverless-logic-web-tools/src/settings/featurePreview/FeaturePreviewSettings.tsx
index 3f16408eb9..e73ce07652 100644
--- a/packages/serverless-logic-web-tools/src/settings/featurePreview/FeaturePreviewSettings.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/featurePreview/FeaturePreviewSettings.tsx
@@ -14,15 +14,19 @@
  * limitations under the License.
  */
 
-import * as React from "react";
+import React from "react";
+import { Checkbox } from "@patternfly/react-core/dist/js/components/Checkbox";
 import { Form } from "@patternfly/react-core/dist/js/components/Form";
 import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
 import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
 import { useCallback, useEffect, useState } from "react";
+import { SETTINGS_PAGE_SECTION_TITLE } from "../SettingsContext";
+import { setPageTitle } from "../../PageTitle";
 import { useSettings, useSettingsDispatch } from "../SettingsContext";
-import { Checkbox } from "@patternfly/react-core/dist/js/components/Checkbox";
 import { saveConfigCookie } from "./FeaturePreviewConfig";
 
+const PAGE_TITLE = "Feature Preview";
+
 export function FeaturePreviewSettings() {
   const settings = useSettings();
   const settingsDispatch = useSettingsDispatch();
@@ -42,11 +46,15 @@ export function FeaturePreviewSettings() {
     [config]
   );
 
+  useEffect(() => {
+    setPageTitle([SETTINGS_PAGE_SECTION_TITLE, PAGE_TITLE]);
+  }, []);
+
   return (
     <Page>
       <PageSection variant={"light"} isWidthLimited>
         <TextContent>
-          <Text component={TextVariants.h1}>Feature Preview</Text>
+          <Text component={TextVariants.h1}>{PAGE_TITLE}</Text>
           <Text component={TextVariants.p}>
             Data you provide here is necessary for configuring the preview of features that are not fully supported yet.
             <br /> All information is locally stored in your browser and never shared with anyone.
diff --git a/packages/serverless-logic-web-tools/src/settings/github/GitHubSettings.tsx b/packages/serverless-logic-web-tools/src/settings/github/GitHubSettings.tsx
index 15cf7ffac7..17ac0dc172 100644
--- a/packages/serverless-logic-web-tools/src/settings/github/GitHubSettings.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/github/GitHubSettings.tsx
@@ -30,12 +30,15 @@ import { ExclamationTriangleIcon } from "@patternfly/react-icons/dist/js/icons/e
 import { ExternalLinkAltIcon } from "@patternfly/react-icons/dist/js/icons/external-link-alt-icon";
 import { GithubIcon } from "@patternfly/react-icons/dist/js/icons/github-icon";
 import * as React from "react";
-import { useCallback, useContext, useMemo, useRef, useState } from "react";
+import { useEffect, useCallback, useContext, useMemo, useRef, useState } from "react";
 import { makeCookieName } from "../../cookies";
 import { QuickStartIds } from "../../quickstarts-data";
 import { AuthStatus, useSettings, useSettingsDispatch } from "../../settings/SettingsContext";
 import { SettingsPageProps } from "../types";
+import { setPageTitle } from "../../PageTitle";
+import { SETTINGS_PAGE_SECTION_TITLE } from "../SettingsContext";
 
+const PAGE_TITLE = "GitHub";
 export const GITHUB_OAUTH_TOKEN_SIZE = 40;
 export const GITHUB_TOKENS_URL = "https://github.com/settings/tokens";
 export const GITHUB_TOKENS_HOW_TO_URL =
@@ -97,11 +100,15 @@ export function GitHubSettings(props: SettingsPageProps) {
     setPotentialGitHubToken(undefined);
   }, [settingsDispatch.github.authService]);
 
+  useEffect(() => {
+    setPageTitle([SETTINGS_PAGE_SECTION_TITLE, PAGE_TITLE]);
+  }, []);
+
   return (
     <Page>
       <PageSection variant={"light"}>
         <TextContent>
-          <Text component={TextVariants.h1}>GitHub</Text>
+          <Text component={TextVariants.h1}>{PAGE_TITLE}</Text>
           <Text component={TextVariants.p}>
             Data you provide here is necessary for creating repositories containing models you design, and syncing
             changes with GitHub.
diff --git a/packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettings.tsx b/packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettings.tsx
index 7402abd0dd..70e28a0b6e 100644
--- a/packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettings.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettings.tsx
@@ -14,27 +14,31 @@
  * limitations under the License.
  */
 
-import { Modal, ModalVariant } from "@patternfly/react-core/dist/js/components/Modal";
+import React from "react";
+import { KubernetesConnection } from "@kie-tools-core/kubernetes-bridge/dist/service";
 import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
 import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
 import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
+import { Modal, ModalVariant } from "@patternfly/react-core/dist/js/components/Modal";
 import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
 import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
 import { AddCircleOIcon } from "@patternfly/react-icons/dist/js/icons/add-circle-o-icon";
 import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-circle-icon";
-import * as React from "react";
-import { useCallback, useState } from "react";
+import { useCallback, useEffect, useState } from "react";
 import { Link } from "react-router-dom";
+import { SETTINGS_PAGE_SECTION_TITLE } from "../SettingsContext";
 import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
 import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
 import { routes } from "../../navigation/Routes";
 import { OpenShiftInstanceStatus } from "../../openshift/OpenShiftInstanceStatus";
+import { setPageTitle } from "../../PageTitle";
 import { obfuscate } from "../github/GitHubSettings";
 import { useSettings, useSettingsDispatch } from "../SettingsContext";
 import { SettingsPageProps } from "../types";
 import { saveConfigCookie } from "./OpenShiftSettingsConfig";
 import { OpenShiftSettingsSimpleConfig } from "./OpenShiftSettingsSimpleConfig";
-import { KubernetesConnection } from "@kie-tools-core/kubernetes-bridge/dist/service";
+
+const PAGE_TITLE = "OpenShift";
 
 export function OpenShiftSettings(props: SettingsPageProps) {
   const settings = useSettings();
@@ -57,11 +61,15 @@ export function OpenShiftSettings(props: SettingsPageProps) {
     saveConfigCookie(newConfig);
   }, [settings.openshift.config, settingsDispatch.openshift]);
 
+  useEffect(() => {
+    setPageTitle([SETTINGS_PAGE_SECTION_TITLE, PAGE_TITLE]);
+  }, []);
+
   return (
     <Page>
       <PageSection variant={"light"} isWidthLimited>
         <TextContent>
-          <Text component={TextVariants.h1}>OpenShift</Text>
+          <Text component={TextVariants.h1}>{PAGE_TITLE}</Text>
           <Text component={TextVariants.p}>
             Data you provide here is necessary for deploying models you design to your OpenShift instance.
             <br />
diff --git a/packages/serverless-logic-web-tools/src/settings/serviceAccount/ServiceAccountSettings.tsx b/packages/serverless-logic-web-tools/src/settings/serviceAccount/ServiceAccountSettings.tsx
index 93060e14dc..59d29acf47 100644
--- a/packages/serverless-logic-web-tools/src/settings/serviceAccount/ServiceAccountSettings.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/serviceAccount/ServiceAccountSettings.tsx
@@ -14,12 +14,14 @@
  * limitations under the License.
  */
 
-import { Modal, ModalVariant } from "@patternfly/react-core/dist/js/components/Modal";
+import React from "react";
+import { QuickStartContext, QuickStartContextValues } from "@patternfly/quickstarts";
 import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
 import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
 import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
 import { ActionGroup, Form, FormAlert, FormGroup } from "@patternfly/react-core/dist/js/components/Form";
 import { InputGroup, InputGroupText } from "@patternfly/react-core/dist/js/components/InputGroup";
+import { Modal, ModalVariant } from "@patternfly/react-core/dist/js/components/Modal";
 import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
 import { Popover } from "@patternfly/react-core/dist/js/components/Popover";
 import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
@@ -28,17 +30,19 @@ import { AddCircleOIcon } from "@patternfly/react-icons/dist/js/icons/add-circle
 import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-circle-icon";
 import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
 import { TimesIcon } from "@patternfly/react-icons/dist/js/icons/times-icon";
-import * as React from "react";
-import { useCallback, useMemo, useState, useContext } from "react";
+import { useCallback, useContext, useEffect, useMemo, useState } from "react";
 import { Link } from "react-router-dom";
+import { SETTINGS_PAGE_SECTION_TITLE } from "../SettingsContext";
 import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
 import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
 import { routes } from "../../navigation/Routes";
+import { setPageTitle } from "../../PageTitle";
+import { QuickStartIds } from "../../quickstarts-data";
 import { useSettings, useSettingsDispatch } from "../SettingsContext";
 import { SettingsPageProps } from "../types";
 import { EMPTY_CONFIG, isServiceAccountConfigValid, resetConfigCookie, saveConfigCookie } from "./ServiceAccountConfig";
-import { QuickStartContext, QuickStartContextValues } from "@patternfly/quickstarts";
-import { QuickStartIds } from "../../quickstarts-data";
+
+const PAGE_TITLE = "Service Account";
 
 export function ServiceAccountSettings(props: SettingsPageProps) {
   const settings = useSettings();
@@ -95,11 +99,15 @@ export function ServiceAccountSettings(props: SettingsPageProps) {
     saveConfigCookie(config);
   }, [config, settingsDispatch.serviceAccount]);
 
+  useEffect(() => {
+    setPageTitle([SETTINGS_PAGE_SECTION_TITLE, PAGE_TITLE]);
+  }, []);
+
   return (
     <Page>
       <PageSection variant={"light"} isWidthLimited>
         <TextContent>
-          <Text component={TextVariants.h1}>Service Account</Text>
+          <Text component={TextVariants.h1}>{PAGE_TITLE}</Text>
           <Text component={TextVariants.p}>
             Data you provide here is necessary for uploading Open API specs associated with models you design to your
             Service Registry instance. All information is locally stored in your browser and never shared with anyone.
@@ -123,8 +131,7 @@ export function ServiceAccountSettings(props: SettingsPageProps) {
               isInline
             >
               KIE Sandbox Extended Services is necessary for uploading Open API specs associated with models you design
-              to your Service Registry instance and also connecting deployments with your Streams for Apache Kafka
-              instance.
+              to your Service Registry instance.
             </Alert>
             <br />
           </>
diff --git a/packages/serverless-logic-web-tools/src/settings/serviceRegistry/ServiceRegistrySettings.tsx b/packages/serverless-logic-web-tools/src/settings/serviceRegistry/ServiceRegistrySettings.tsx
index a196d80931..f23e6909c8 100644
--- a/packages/serverless-logic-web-tools/src/settings/serviceRegistry/ServiceRegistrySettings.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/serviceRegistry/ServiceRegistrySettings.tsx
@@ -14,12 +14,14 @@
  * limitations under the License.
  */
 
-import { Modal, ModalVariant } from "@patternfly/react-core/dist/js/components/Modal";
+import React from "react";
+import { QuickStartContext, QuickStartContextValues } from "@patternfly/quickstarts";
 import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
 import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
 import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
 import { ActionGroup, Form, FormAlert, FormGroup } from "@patternfly/react-core/dist/js/components/Form";
 import { InputGroup, InputGroupText } from "@patternfly/react-core/dist/js/components/InputGroup";
+import { Modal, ModalVariant } from "@patternfly/react-core/dist/js/components/Modal";
 import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
 import { Popover } from "@patternfly/react-core/dist/js/components/Popover";
 import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
@@ -28,22 +30,24 @@ import { AddCircleOIcon } from "@patternfly/react-icons/dist/js/icons/add-circle
 import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-circle-icon";
 import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
 import { TimesIcon } from "@patternfly/react-icons/dist/js/icons/times-icon";
-import * as React from "react";
-import { useCallback, useMemo, useState, useContext } from "react";
+import { useCallback, useContext, useEffect, useMemo, useState } from "react";
 import { Link } from "react-router-dom";
+import { SETTINGS_PAGE_SECTION_TITLE } from "../SettingsContext";
 import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
 import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
 import { routes } from "../../navigation/Routes";
+import { setPageTitle } from "../../PageTitle";
+import { QuickStartIds } from "../../quickstarts-data";
 import { useSettings, useSettingsDispatch } from "../SettingsContext";
+import { SettingsPageProps } from "../types";
 import {
   EMPTY_CONFIG,
   isServiceRegistryConfigValid,
   resetConfigCookie,
   saveConfigCookie,
 } from "./ServiceRegistryConfig";
-import { QuickStartContext, QuickStartContextValues } from "@patternfly/quickstarts";
-import { QuickStartIds } from "../../quickstarts-data";
-import { SettingsPageProps } from "../types";
+
+const PAGE_TITLE = "Service Registry";
 
 export function ServiceRegistrySettings(props: SettingsPageProps) {
   const settings = useSettings();
@@ -94,11 +98,15 @@ export function ServiceRegistrySettings(props: SettingsPageProps) {
     saveConfigCookie(config);
   }, [config, settingsDispatch.serviceRegistry]);
 
+  useEffect(() => {
+    setPageTitle([SETTINGS_PAGE_SECTION_TITLE, PAGE_TITLE]);
+  }, []);
+
   return (
     <Page>
       <PageSection variant={"light"} isWidthLimited>
         <TextContent>
-          <Text component={TextVariants.h1}>Service Registry</Text>
+          <Text component={TextVariants.h1}>{PAGE_TITLE}</Text>
           <Text component={TextVariants.p}>
             Data you provide here is necessary for uploading specs associated with models you design to your Service
             Registry instance. All information is locally stored in your browser and never shared with anyone.
diff --git a/packages/serverless-logic-web-tools/src/workspace/components/ImportFromUrlForm.tsx b/packages/serverless-logic-web-tools/src/workspace/components/ImportFromUrlForm.tsx
index 611d3eb4b1..61e2aa8409 100644
--- a/packages/serverless-logic-web-tools/src/workspace/components/ImportFromUrlForm.tsx
+++ b/packages/serverless-logic-web-tools/src/workspace/components/ImportFromUrlForm.tsx
@@ -19,19 +19,21 @@ import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-cir
 import { ExclamationCircleIcon } from "@patternfly/react-icons/dist/js/icons/exclamation-circle-icon";
 import { TextInput } from "@patternfly/react-core/dist/js/components/TextInput";
 import * as React from "react";
-import { FormEvent, useCallback, useMemo } from "react";
+import { useEffect, FormEvent, useCallback, useMemo } from "react";
 import { ValidatedOptions } from "@patternfly/react-core/dist/js/helpers/constants";
 import { useEditorEnvelopeLocator } from "../../envelopeLocator/EditorEnvelopeLocatorContext";
 import { UrlType, useImportableUrl } from "../hooks/ImportableUrlHooks";
 
 export function ImportFromUrlForm(props: {
-  url?: string;
+  allowedTypes?: UrlType[];
   importingError?: string;
   onChange: (url: string) => void;
   onSubmit: () => void;
+  onValidate?: (isValid: ValidatedOptions) => void;
+  url?: string;
   urlInputRef?: React.RefObject<HTMLInputElement>;
-  allowedTypes?: UrlType[];
 }) {
+  const { onValidate } = props;
   const editorEnvelopeLocator = useEditorEnvelopeLocator();
   const importableUrl = useImportableUrl({
     isFileSupported: (path: string) => editorEnvelopeLocator.hasMappingFor(path),
@@ -77,6 +79,10 @@ export function ImportFromUrlForm(props: {
     return "";
   }, [importableUrl.error, props.importingError]);
 
+  useEffect(() => {
+    onValidate?.(validatedOption);
+  }, [validatedOption, onValidate]);
+
   return (
     <Form onSubmit={onSubmit}>
       <FormGroup


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 20/27: KOGITO-8153: Create an extensible Samples page (now Catalog) (#1635)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit 15fcd99b0b8b64c72c3b1f1ba3eac9d0a3d6dbb3
Author: Fabrizio Antonangeli <fa...@gmail.com>
AuthorDate: Tue May 16 13:33:43 2023 +0200

    KOGITO-8153: Create an extensible Samples page (now Catalog) (#1635)
    
    Co-authored-by: Guilherme Caponetto <63...@users.noreply.github.com>
---
 .../src/home/sample/SampleCard.tsx                 | 192 ++++++++++++-------
 .../src/home/sample/SampleCardSkeleton.css         |   9 -
 .../src/home/sample/Showcase.tsx                   | 209 +++++++++++++--------
 .../src/home/sample/hooks/SampleContext.tsx        | 148 ++++++++++++++-
 .../src/home/sample/sampleApi.ts                   | 118 +++++++-----
 5 files changed, 461 insertions(+), 215 deletions(-)

diff --git a/packages/serverless-logic-web-tools/src/home/sample/SampleCard.tsx b/packages/serverless-logic-web-tools/src/home/sample/SampleCard.tsx
index 31475546ff..aa81206b59 100644
--- a/packages/serverless-logic-web-tools/src/home/sample/SampleCard.tsx
+++ b/packages/serverless-logic-web-tools/src/home/sample/SampleCard.tsx
@@ -14,19 +14,19 @@
  * limitations under the License.
  */
 
-import * as React from "react";
-import { useMemo, useRef, useEffect } from "react";
-import { Card, CardTitle, CardFooter, CardBody } from "@patternfly/react-core/dist/js/components/Card";
-import { Grid, GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
-import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
-import { useRoutes } from "../../navigation/Hooks";
-import { Link } from "react-router-dom";
-import { Text } from "@patternfly/react-core/dist/js/components/Text";
+import { Button, Modal, ModalVariant, Skeleton } from "@patternfly/react-core/dist/js";
+import { Card, CardBody, CardTitle } from "@patternfly/react-core/dist/js/components/Card";
 import { Label, LabelProps } from "@patternfly/react-core/dist/js/components/Label";
-import { FolderIcon, FileIcon, MonitoringIcon } from "@patternfly/react-icons/dist/js/icons";
-import { Sample, SampleCategory } from "./sampleApi";
+import { Text } from "@patternfly/react-core/dist/js/components/Text";
 import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
 import { Bullseye } from "@patternfly/react-core/dist/js/layouts/Bullseye";
+import { Grid, GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
+import { FileIcon, FolderIcon, MonitoringIcon, SearchPlusIcon } from "@patternfly/react-icons/dist/js/icons";
+import * as React from "react";
+import { useCallback, useEffect, useMemo, useState } from "react";
+import { useHistory } from "react-router-dom";
+import { useRoutes } from "../../navigation/Hooks";
+import { Sample, SampleCategory } from "./sampleApi";
 
 const tagMap: Record<SampleCategory, { label: string; icon: React.ComponentClass; color: LabelProps["color"] }> = {
   ["serverless-workflow"]: {
@@ -46,72 +46,120 @@ const tagMap: Record<SampleCategory, { label: string; icon: React.ComponentClass
   },
 };
 
-export function SampleCard(props: { sample: Sample }) {
-  const routes = useRoutes();
-  const imgRef = useRef<HTMLImageElement>(null);
-  const tag = useMemo(() => tagMap[props.sample.definition.category], [props.sample.definition.category]);
+function SampleSvgImg(props: {
+  sample: Sample;
+  svgBlob: string | undefined;
+  height?: string;
+  width?: string;
+  maxWidth?: string;
+  maxHeight?: string;
+}) {
+  const [svgUrl, setSvgUrl] = useState("");
+  const { height, width, maxWidth = "100%", maxHeight } = props;
 
   useEffect(() => {
-    const blob = new Blob([props.sample.svgContent], { type: "image/svg+xml" });
+    const blob = new Blob([props.svgBlob || ""], { type: "image/svg+xml" });
     const url = URL.createObjectURL(blob);
-    imgRef.current!.addEventListener("load", () => URL.revokeObjectURL(url), { once: true });
-    imgRef.current!.src = url;
-  }, [props.sample.svgContent]);
+    setSvgUrl(url);
+    return () => {
+      URL.revokeObjectURL(url);
+    };
+  }, [props.svgBlob]);
+
+  if (!svgUrl || !props.svgBlob) {
+    return <Skeleton height={height} width="100%" style={{ maxHeight: "80%" }} />;
+  }
+
+  return (
+    <img style={{ height, width, maxWidth, maxHeight }} src={svgUrl} alt={`SVG for sample ${props.sample.sampleId}`} />
+  );
+}
+
+export function SampleCard(props: { sample: Sample; cover: string | undefined }) {
+  const [isModalOpen, setIsModalOpen] = useState(false);
+  const routes = useRoutes();
+  const tag = useMemo(() => tagMap[props.sample.definition.category], [props.sample.definition.category]);
+  const history = useHistory();
+
+  const onCardClick = useCallback(() => {
+    history.push({
+      pathname: routes.sampleShowcase.path({}),
+      search: routes.sampleShowcase.queryString({ sampleId: props.sample.sampleId }),
+    });
+  }, [props.sample, history, routes]);
+
+  const handleModalToggle = useCallback((e?) => {
+    e?.stopPropagation();
+    setIsModalOpen((prevState) => !prevState);
+  }, []);
 
   return (
-    <Card isCompact={true} isFullHeight={true}>
-      <Grid style={{ height: "100%" }}>
-        <GridItem
-          lg={6}
-          style={{ overflow: "hidden", textAlign: "center", verticalAlign: "middle", position: "relative" }}
-        >
-          <div style={{ position: "absolute", bottom: "16px", right: 0, left: 0, margin: "auto" }}>
-            <Label color={tag.color}>
-              <tag.icon />
-              &nbsp;&nbsp;<b>{tag.label}</b>
-            </Label>
-          </div>
-          <Bullseye style={{ padding: "0px 8px 30px 8px" }}>
-            <img
-              style={{ height: "370px", maxWidth: "100%" }}
-              ref={imgRef}
-              alt={`SVG for sample ${props.sample.sampleId}`}
-            />
-          </Bullseye>
-        </GridItem>
-        <GridItem lg={6} style={{ display: "flex", flexDirection: "column" }}>
-          <CardTitle data-ouia-component-type="sample-title">{props.sample.definition.title}</CardTitle>
-          <CardBody isFilled={true}>
-            <Tooltip content={<div>{props.sample.definition.description}</div>}>
-              <Text
-                component="p"
-                style={{
-                  display: "-webkit-box",
-                  WebkitBoxOrient: "vertical",
-                  WebkitLineClamp: 5,
-                  overflow: "hidden",
-                  textOverflow: "ellipsis",
-                  whiteSpace: "pre-wrap",
-                }}
-              >
-                {props.sample.definition.description}
-              </Text>
-            </Tooltip>
-          </CardBody>
-          <CardFooter style={{ alignItems: "baseline" }}>
-            <Link
-              to={{
-                pathname: routes.sampleShowcase.path({}),
-                search: routes.sampleShowcase.queryString({ sampleId: props.sample.sampleId }),
-              }}
-            >
-              <Button variant={ButtonVariant.tertiary} ouiaId={props.sample.sampleId + `-try-swf-sample-button`}>
-                Try it out!
-              </Button>
-            </Link>
-          </CardFooter>
-        </GridItem>
-      </Grid>
-    </Card>
+    <>
+      <Card isCompact={true} isFullHeight={true} onClick={onCardClick} isSelectable>
+        <Grid style={{ height: "100%" }}>
+          <GridItem
+            lg={6}
+            style={{ overflow: "hidden", textAlign: "center", verticalAlign: "middle", position: "relative" }}
+          >
+            <div style={{ position: "absolute", bottom: "16px", right: 0, left: 0, margin: "auto" }}>
+              {props.cover && (
+                <Button
+                  type="button"
+                  onClick={handleModalToggle}
+                  isLarge
+                  variant="plain"
+                  style={
+                    {
+                      "--pf-c-button--PaddingLeft": "0",
+                      "--pf-c-button--PaddingRight": "0",
+                      marginTop: "-16px",
+                      marginLeft: "80%",
+                    } as React.CSSProperties
+                  }
+                >
+                  <SearchPlusIcon size="sm" />
+                </Button>
+              )}
+              <Label color={tag.color}>
+                <tag.icon />
+                &nbsp;&nbsp;<b>{tag.label}</b>
+              </Label>
+            </div>
+            <Bullseye style={{ padding: "0px 8px 30px 8px" }}>
+              <SampleSvgImg sample={props.sample} svgBlob={props.cover} height="370px" />
+            </Bullseye>
+          </GridItem>
+          <GridItem lg={6} style={{ display: "flex", flexDirection: "column" }}>
+            <CardTitle data-ouia-component-type="sample-title">{props.sample.definition.title}</CardTitle>
+            <CardBody isFilled={true}>
+              <Tooltip content={<div>{props.sample.definition.description}</div>}>
+                <Text
+                  component="p"
+                  style={{
+                    display: "-webkit-box",
+                    WebkitBoxOrient: "vertical",
+                    WebkitLineClamp: 5,
+                    overflow: "hidden",
+                    textOverflow: "ellipsis",
+                    whiteSpace: "pre-wrap",
+                  }}
+                >
+                  {props.sample.definition.description}
+                </Text>
+              </Tooltip>
+            </CardBody>
+          </GridItem>
+        </Grid>
+      </Card>
+      <Modal
+        title={props.sample.definition.title}
+        variant={ModalVariant.large}
+        isOpen={isModalOpen}
+        onClose={handleModalToggle}
+        style={{ textAlign: "center" }}
+      >
+        <SampleSvgImg sample={props.sample} svgBlob={props.cover} height="670px" />
+      </Modal>
+    </>
   );
 }
diff --git a/packages/serverless-logic-web-tools/src/home/sample/SampleCardSkeleton.css b/packages/serverless-logic-web-tools/src/home/sample/SampleCardSkeleton.css
index cc7433efff..3c9c1fa459 100644
--- a/packages/serverless-logic-web-tools/src/home/sample/SampleCardSkeleton.css
+++ b/packages/serverless-logic-web-tools/src/home/sample/SampleCardSkeleton.css
@@ -14,15 +14,6 @@
  * limitations under the License.
  */
 
-.sample-card-skeleton--gallery {
-  overflow-x: auto;
-  grid-auto-flow: column;
-  grid-auto-columns: minmax(calc(100% / 3.1 - 16px), 1fr);
-  padding-bottom: 8px;
-  padding-right: var(--pf-c-page__main-section--xl--PaddingRight);
-  height: 430px;
-}
-
 .sample-card-skeleton--grid {
   height: 100%;
 }
diff --git a/packages/serverless-logic-web-tools/src/home/sample/Showcase.tsx b/packages/serverless-logic-web-tools/src/home/sample/Showcase.tsx
index e1839b9c36..52303c80b2 100644
--- a/packages/serverless-logic-web-tools/src/home/sample/Showcase.tsx
+++ b/packages/serverless-logic-web-tools/src/home/sample/Showcase.tsx
@@ -14,28 +14,29 @@
  * limitations under the License.
  */
 
-import * as React from "react";
-import { useEffect, useState, useCallback, useMemo } from "react";
-import { TextContent, Text } from "@patternfly/react-core/dist/js/components/Text";
-import { SampleCard } from "./SampleCard";
-import { Gallery } from "@patternfly/react-core/dist/js/layouts/Gallery";
-import { Sample, SampleCategory } from "./sampleApi";
-import { SampleCardSkeleton } from "./SampleCardSkeleton";
-import { SamplesLoadError } from "./SamplesLoadError";
-import { useSampleDispatch } from "./hooks/SampleContext";
-import { SearchInput } from "@patternfly/react-core/dist/js/components/SearchInput";
-import { PageSection } from "@patternfly/react-core/dist/js/components/Page";
-import { EmptyState, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
-import { Title } from "@patternfly/react-core/dist/js/components/Title";
-import { CubesIcon } from "@patternfly/react-icons/dist/js/icons/cubes-icon";
+import { Pagination, PaginationVariant, PerPageOptions, Skeleton } from "@patternfly/react-core/dist/js";
 import {
   Dropdown,
   DropdownItem,
   DropdownSeparator,
   DropdownToggle,
 } from "@patternfly/react-core/dist/js/components/Dropdown";
+import { EmptyState, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
+import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
+import { SearchInput } from "@patternfly/react-core/dist/js/components/SearchInput";
+import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
+import { Title } from "@patternfly/react-core/dist/js/components/Title";
+import { Toolbar, ToolbarContent, ToolbarItem } from "@patternfly/react-core/dist/js/components/Toolbar";
+import { Gallery } from "@patternfly/react-core/dist/js/layouts/Gallery";
+import { CubesIcon } from "@patternfly/react-icons/dist/js/icons/cubes-icon";
+import * as React from "react";
+import { useCallback, useEffect, useMemo, useState } from "react";
 import { FileLabel } from "../../workspace/components/FileLabel";
-import { Flex, FlexItem } from "@patternfly/react-core/dist/js/layouts/Flex";
+import { useSampleDispatch } from "./hooks/SampleContext";
+import { Sample, SampleCategory, SampleCoversHashtable } from "./sampleApi";
+import { SampleCard } from "./SampleCard";
+import { SampleCardSkeleton } from "./SampleCardSkeleton";
+import { SamplesLoadError } from "./SamplesLoadError";
 
 const SAMPLE_PRIORITY: Record<SampleCategory, number> = {
   ["serverless-workflow"]: 1,
@@ -50,18 +51,49 @@ const LABEL_MAP: Record<SampleCategory, JSX.Element> = {
 };
 
 const ALL_CATEGORIES_LABEL = "All categories";
-
+const CARDS_PER_PAGE = 9;
 const CATEGORY_ARRAY = Object.keys(SAMPLE_PRIORITY) as SampleCategory[];
 
+export const SAMPLE_CARDS_PER_PAGE_OPTIONS: PerPageOptions[] = [
+  {
+    title: `${CARDS_PER_PAGE}`,
+    value: CARDS_PER_PAGE,
+  },
+];
+
 export function Showcase() {
   const sampleDispatch = useSampleDispatch();
   const [loading, setLoading] = useState<boolean>(true);
   const [samples, setSamples] = useState<Sample[]>([]);
+  const [sampleCovers, setSampleCovers] = useState<SampleCoversHashtable>({});
   const [sampleLoadingError, setSampleLoadingError] = useState("");
   const [searchFilter, setSearchFilter] = useState("");
   const [categoryFilter, setCategoryFilter] = useState<SampleCategory | undefined>();
+  const [page, setPage] = React.useState(1);
   const [isCategoryFilterDropdownOpen, setCategoryFilterDropdownOpen] = useState(false);
 
+  const visibleSamples = useMemo(
+    () => samples.slice((page - 1) * CARDS_PER_PAGE, page * CARDS_PER_PAGE),
+    [samples, page]
+  );
+
+  const samplesCount = useMemo(() => samples.length, [samples]);
+
+  const filterResultMessage = useMemo(() => {
+    if (samplesCount === 0) {
+      return;
+    }
+    const isPlural = samplesCount > 1;
+    return `Showing ${samplesCount} sample${isPlural ? "s" : ""}`;
+  }, [samplesCount]);
+
+  const selectedCategory = useMemo(() => {
+    if (categoryFilter) {
+      return LABEL_MAP[categoryFilter];
+    }
+    return ALL_CATEGORIES_LABEL;
+  }, [categoryFilter]);
+
   const onSearch = useCallback(
     async (args: { searchValue: string; category?: SampleCategory }) => {
       if (args.searchValue === searchFilter && args.category === categoryFilter) {
@@ -91,20 +123,10 @@ export function Showcase() {
       });
   }, [sampleDispatch]);
 
-  const filterResultMessage = useMemo(() => {
-    if (samples.length === 0) {
-      return;
-    }
-    const isPlural = samples.length > 1;
-    return `Showing ${samples.length} sample${isPlural ? "s" : ""}`;
-  }, [samples.length]);
-
-  const selectedCategory = useMemo(() => {
-    if (categoryFilter) {
-      return LABEL_MAP[categoryFilter];
-    }
-    return ALL_CATEGORIES_LABEL;
-  }, [categoryFilter]);
+  useEffect(() => {
+    sampleDispatch.getSampleCovers({ samples: visibleSamples, prevState: sampleCovers }).then(setSampleCovers);
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [visibleSamples, sampleDispatch]);
 
   const categoryFilterDropdownItems = useMemo(
     () => [
@@ -127,17 +149,20 @@ export function Showcase() {
     [onSearch, searchFilter]
   );
 
+  const onSetPage = useCallback((_e, v) => {
+    setPage(v);
+  }, []);
+
   return (
-    <>
-      {sampleLoadingError && <SamplesLoadError errors={[sampleLoadingError]} />}
-      {!sampleLoadingError && (
-        <>
-          <TextContent>
-            <Text component="h1">Samples Showcase</Text>
-          </TextContent>
-          <br />
-          <Flex flexWrap={{ default: "wrap" }}>
-            <FlexItem style={{ marginRight: 0 }}>
+    <Page>
+      <PageSection variant={"light"}>
+        <TextContent>
+          <Text component={TextVariants.h1}>Samples Catalog</Text>
+          <Text component={TextVariants.p}>Try one of our samples to start defining your model.</Text>
+        </TextContent>
+        <Toolbar style={{ paddingBottom: "0" }}>
+          <ToolbarContent style={{ paddingLeft: "0", paddingRight: "0", paddingBottom: "0" }}>
+            <ToolbarItem variant="search-filter">
               <SearchInput
                 value={""}
                 type={"search"}
@@ -150,8 +175,8 @@ export function Showcase() {
                   e.stopPropagation();
                 }}
               />
-            </FlexItem>
-            <FlexItem>
+            </ToolbarItem>
+            <ToolbarItem>
               <Dropdown
                 style={{ backgroundColor: "white" }}
                 onSelect={() => setCategoryFilterDropdownOpen(false)}
@@ -166,46 +191,74 @@ export function Showcase() {
                 }
                 isOpen={isCategoryFilterDropdownOpen}
               />
-            </FlexItem>
-            <FlexItem>
+            </ToolbarItem>
+            <ToolbarItem>
               {filterResultMessage && (
                 <TextContent>
                   <Text>{filterResultMessage}</Text>
                 </TextContent>
               )}
-            </FlexItem>
-          </Flex>
-          <br />
-          {loading && <SampleCardSkeleton numberOfCards={4} />}
-          {!loading && samples.length === 0 && (
-            <PageSection variant={"light"} isFilled={true} style={{ marginRight: "25px" }}>
-              <EmptyState style={{ height: "350px" }}>
-                <EmptyStateIcon icon={CubesIcon} />
-                <Title headingLevel="h4" size="lg">
-                  {"None of the available samples matched this search"}
-                </Title>
-              </EmptyState>
-            </PageSection>
-          )}
-          {!loading && samples.length > 0 && (
-            <Gallery
-              hasGutter={true}
-              minWidths={{ sm: "calc(100%/3.1 - 16px)", default: "100%" }}
-              style={{
-                overflowX: "auto",
-                gridAutoFlow: "column",
-                gridAutoColumns: "minmax(calc(100%/3.1 - 16px),1fr)",
-                paddingBottom: "8px",
-                paddingRight: "var(--pf-c-page__main-section--xl--PaddingRight)",
-              }}
-            >
-              {samples.map((sample) => (
-                <SampleCard sample={sample} key={`sample-${sample.sampleId}`} />
-              ))}
-            </Gallery>
-          )}
-        </>
-      )}
-    </>
+            </ToolbarItem>
+            <ToolbarItem variant="pagination">
+              {loading && <Skeleton width="200px" />}
+              {!loading && (
+                <Pagination
+                  isCompact
+                  itemCount={samplesCount}
+                  onSetPage={onSetPage}
+                  page={page}
+                  perPage={CARDS_PER_PAGE}
+                  perPageOptions={SAMPLE_CARDS_PER_PAGE_OPTIONS}
+                  variant="top"
+                />
+              )}
+            </ToolbarItem>
+          </ToolbarContent>
+        </Toolbar>
+      </PageSection>
+
+      <PageSection isFilled>
+        {sampleLoadingError && <SamplesLoadError errors={[sampleLoadingError]} />}
+        {!sampleLoadingError && (
+          <>
+            {loading && <SampleCardSkeleton numberOfCards={6} />}
+            {!loading && samplesCount === 0 && (
+              <PageSection variant={"light"} isFilled={true} style={{ marginRight: "25px" }}>
+                <EmptyState style={{ height: "350px" }}>
+                  <EmptyStateIcon icon={CubesIcon} />
+                  <Title headingLevel="h4" size="lg">
+                    {"None of the available samples matched this search"}
+                  </Title>
+                </EmptyState>
+              </PageSection>
+            )}
+            {!loading && samplesCount > 0 && (
+              <>
+                <Gallery hasGutter={true} minWidths={{ sm: "calc(100%/3.1 - 16px)", default: "100%" }}>
+                  {visibleSamples.map((sample) => (
+                    <SampleCard
+                      sample={sample}
+                      key={`sample-${sample.sampleId}`}
+                      cover={sampleCovers[sample.sampleId]}
+                    />
+                  ))}
+                </Gallery>
+                <br />
+                <Pagination
+                  itemCount={samplesCount}
+                  onSetPage={onSetPage}
+                  page={page}
+                  perPage={CARDS_PER_PAGE}
+                  perPageComponent="button"
+                  perPageOptions={SAMPLE_CARDS_PER_PAGE_OPTIONS}
+                  variant={PaginationVariant.bottom}
+                  widgetId="bottom-example"
+                />
+              </>
+            )}
+          </>
+        )}
+      </PageSection>
+    </Page>
   );
 }
diff --git a/packages/serverless-logic-web-tools/src/home/sample/hooks/SampleContext.tsx b/packages/serverless-logic-web-tools/src/home/sample/hooks/SampleContext.tsx
index f8fdbd7e4c..65204accd1 100644
--- a/packages/serverless-logic-web-tools/src/home/sample/hooks/SampleContext.tsx
+++ b/packages/serverless-logic-web-tools/src/home/sample/hooks/SampleContext.tsx
@@ -20,17 +20,42 @@ import { LocalFile } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/Loc
 import * as React from "react";
 import { useContext, useMemo, useCallback, useState } from "react";
 import { useSettingsDispatch } from "../../../settings/SettingsContext";
-import { fetchSampleDefinitions, fetchSampleFiles, Sample, SampleCategory } from "../sampleApi";
+import {
+  fetchSampleCover,
+  fetchSampleDefinitions,
+  fetchSampleFiles,
+  Sample,
+  SampleCategory,
+  SampleCoversHashtable,
+} from "../sampleApi";
 import { decoder, encoder } from "@kie-tools-core/workspaces-git-fs/dist/encoderdecoder/EncoderDecoder";
 import Fuse from "fuse.js";
 
 const SAMPLE_DEFINITIONS_CACHE_FILE_PATH = "/definitions.json";
+const SAMPLE_COVERS_CACHE_FILE_PATH = "/covers.json";
 const SAMPLES_FS_MOUNT_POINT = `lfs_v1__samples__${process.env.WEBPACK_REPLACE__version!}`;
 const SEARCH_KEYS = ["definition.category", "definition.title", "definition.description"];
 
 export interface SampleDispatchContextType {
   getSamples(args: { categoryFilter?: SampleCategory; searchFilter?: string }): Promise<Sample[]>;
   getSampleFiles(sampleId: string): Promise<LocalFile[]>;
+  /**
+   * Gets the cover image for a sample from cache, or loads it from the API and caches it.
+   * @param args.sample The sample to get the cover image for.
+   * @param args.noCacheWriting A flag indicating whether to write the loaded cover image to cache.
+   * @returns The cover image as a base64-encoded string.
+   */
+  getSampleCover(args: { sample: Sample; noCacheWriting?: boolean }): Promise<string | undefined>;
+  /**
+   * Gets the cover images for an array of samples from cache, or loads them from the API and caches them.
+   * @param args.samples An array of samples to get the cover images for.
+   * @param args.prevState The previous state of the entities being loaded
+   * @returns An object containing the sample IDs as keys and the cover images as base64-encoded strings.
+   */
+  getSampleCovers(args: {
+    samples: Sample[];
+    prevState: { [key: string]: string | undefined };
+  }): Promise<SampleCoversHashtable>;
 }
 
 export const SampleDispatchContext = React.createContext<SampleDispatchContextType>({} as any);
@@ -43,23 +68,81 @@ export function SampleContextProvider(props: React.PropsWithChildren<{}>) {
   const sampleStorageService = useMemo(() => new LfsStorageService(), []);
 
   const [allSampleDefinitions, setAllSampleDefinitions] = useState<Sample[]>();
-
-  const loadCache = useCallback(
-    async (args: { path: string; loadFn: () => Promise<any> }) => {
+  const [allSampleCovers, setAllSampleCovers] = useState<{ [sampleId: string]: string }>({});
+
+  /**
+   * Retrieves the contents of a cache file
+   *
+   * @param args.path The path of the cache file to retrieve.
+   * @returns The JSON-parsed contents of the cache file, or `null` if the file doesn't exist.
+   */
+  const getCacheContent = useCallback(
+    async (args: { path: string }) => {
       const storageFile = await sampleStorageService.getFile(fs, args.path);
       if (storageFile) {
         const cacheContent = decoder.decode(await storageFile.getFileContents());
         return JSON.parse(cacheContent);
       }
-      const content = await args.loadFn();
+      return null;
+    },
+    [sampleStorageService, fs]
+  );
+
+  /**
+   * Adds or updates the contents of a cache file
+   *
+   * @param args.path The path of the cache file to retrieve.
+   * @param args.content The content to add in the cache file.
+   * @returns The content stored in the cache file.
+   */
+  const addCacheContent = useCallback(
+    async (args: { path: string; content: any }) => {
       const cacheFile = new LfsStorageFile({
         path: args.path,
-        getFileContents: async () => encoder.encode(JSON.stringify(content)),
+        getFileContents: async () => encoder.encode(JSON.stringify(args.content)),
       });
-      await sampleStorageService.createFiles(fs, [cacheFile]);
-      return content;
+      await sampleStorageService.createOrOverwriteFile(fs, cacheFile);
+      return args.content;
     },
-    [fs, sampleStorageService]
+    [sampleStorageService, fs]
+  );
+
+  const loadCache = useCallback(
+    async (args: { path: string; loadFn: () => Promise<any> }) => {
+      const cacheContent = await getCacheContent(args);
+
+      if (cacheContent) {
+        return cacheContent;
+      }
+      const content = await args.loadFn();
+
+      return await addCacheContent({ ...args, content });
+    },
+    [getCacheContent, addCacheContent]
+  );
+
+  /**
+   * Loads an entity from cache if available, otherwise loads it from the provided load function and saves it to cache.
+   * @param args.path The path of the cache file.
+   * @param args.id The unique identifier for the entity being loaded.
+   * @param args.noCacheWriting A flag indicating whether to write the loaded entity to cache.
+   * @param args.loadFn The function to use to load the entity if it is not found in cache.
+   * @returns The loaded entity.
+   */
+  const loadCacheEntity = useCallback(
+    async (args: { path: string; id: string; noCacheWriting?: boolean; loadFn: () => Promise<any> }) => {
+      const cacheContent = (await getCacheContent(args)) || {};
+      if (cacheContent[args.id]) {
+        return cacheContent[args.id];
+      }
+
+      cacheContent[args.id] = await args.loadFn();
+
+      return !args.noCacheWriting
+        ? (await addCacheContent({ ...args, content: cacheContent }))[args.id]
+        : cacheContent[args.id];
+    },
+    [getCacheContent, addCacheContent]
   );
 
   const getSamples = useCallback(
@@ -95,12 +178,57 @@ export function SampleContextProvider(props: React.PropsWithChildren<{}>) {
     [allSampleDefinitions, loadCache, settingsDispatch.github.octokit]
   );
 
+  const getSampleCover = useCallback(
+    async (args: { sample: Sample; noCacheWriting?: boolean }) => {
+      const cachedCover = allSampleCovers[args.sample.sampleId];
+
+      if (!cachedCover) {
+        const cover = await loadCacheEntity({
+          path: SAMPLE_COVERS_CACHE_FILE_PATH,
+          id: args.sample.sampleId,
+          loadFn: async () => fetchSampleCover({ octokit: settingsDispatch.github.octokit, sample: args.sample }),
+          noCacheWriting: args.noCacheWriting,
+        });
+
+        allSampleCovers[args.sample.sampleId] = cover;
+        setAllSampleCovers(allSampleCovers);
+        return cover;
+      } else {
+        return cachedCover;
+      }
+    },
+    [settingsDispatch.github.octokit, loadCacheEntity, allSampleCovers]
+  );
+
+  const getSampleCovers = useCallback(
+    async (args: { samples: Sample[]; prevState: { [key: string]: string } }) => {
+      if (!args.samples.length) {
+        return {};
+      }
+
+      const covers = (
+        await Promise.all(
+          args.samples.map(async (sample) => ({
+            [sample.sampleId]: await getSampleCover({ ...args, sample, noCacheWriting: true }),
+          }))
+        )
+      ).reduce((acc, curr) => ({ ...acc, ...curr }), args.prevState || {});
+
+      const cacheContent = await getCacheContent({ path: SAMPLE_COVERS_CACHE_FILE_PATH });
+      return await addCacheContent({ path: SAMPLE_COVERS_CACHE_FILE_PATH, content: { ...covers, ...cacheContent } });
+    },
+    [getSampleCover, addCacheContent, getCacheContent]
+  );
+
   const getSampleFiles = useCallback(
     async (sampleId: string) => fetchSampleFiles({ octokit: settingsDispatch.github.octokit, sampleId }),
     [settingsDispatch.github.octokit]
   );
 
-  const dispatch = useMemo(() => ({ getSamples, getSampleFiles }), [getSamples, getSampleFiles]);
+  const dispatch = useMemo(
+    () => ({ getSamples, getSampleFiles, getSampleCover, getSampleCovers }),
+    [getSamples, getSampleFiles, getSampleCover, getSampleCovers]
+  );
   return <SampleDispatchContext.Provider value={dispatch}>{props.children}</SampleDispatchContext.Provider>;
 }
 
diff --git a/packages/serverless-logic-web-tools/src/home/sample/sampleApi.ts b/packages/serverless-logic-web-tools/src/home/sample/sampleApi.ts
index e4054706dc..7a8efb27ba 100644
--- a/packages/serverless-logic-web-tools/src/home/sample/sampleApi.ts
+++ b/packages/serverless-logic-web-tools/src/home/sample/sampleApi.ts
@@ -39,7 +39,10 @@ type GitHubFileInfo = GitHubRepoInfo & { path: string };
 
 export type SampleCategory = "serverless-workflow" | "serverless-decision" | "dashbuilder";
 
+const SUPPORTING_FILES_FOLDER = join(".github", "supporting-files");
+
 const SAMPLE_DEFINITION_FILE = "definition.json";
+const SAMPLE_DEFINITIONS_FILE = join(SUPPORTING_FILES_FOLDER, "sample-definitions.json");
 
 const SAMPLE_TEMPLATE_FOLDER = "template";
 
@@ -49,6 +52,18 @@ const SAMPLE_FOLDER = "samples";
 
 type SampleStatus = "ok" | "out of date" | "deprecated";
 
+interface SampleSocial {
+  network: string;
+  id: string;
+}
+
+interface SampleAuthor {
+  name: string;
+  email: string;
+  github: string;
+  social: SampleSocial[];
+}
+
 interface SampleDefinition {
   category: SampleCategory;
   status: SampleStatus;
@@ -56,6 +71,12 @@ interface SampleDefinition {
   description: string;
   cover: string;
   tags: string[];
+  type: string;
+  dependencies: string[];
+  related_to: string[];
+  resources: string[];
+  authors: SampleAuthor[];
+  sample_path: string;
 }
 
 interface ContentData {
@@ -73,14 +94,17 @@ interface ContentData {
 export type Sample = {
   sampleId: string;
   definition: SampleDefinition;
-  svgContent: string;
+};
+
+export type SampleCoversHashtable = {
+  [sampleId: string]: string;
 };
 
 export const KIE_SAMPLES_REPO: GitHubFileInfo = {
   owner: "kiegroup",
   repo: "kie-samples",
   ref: process.env["WEBPACK_REPLACE__samplesRepositoryRef"]!,
-  path: "samples",
+  path: SAMPLE_FOLDER,
 };
 
 async function fetchFileContent(args: { octokit: Octokit; fileInfo: GitHubFileInfo }): Promise<string | undefined> {
@@ -143,56 +167,56 @@ async function listSampleDefinitionFiles(args: {
     .map((folder) => ({ sampleId: folder.name, definitionPath: join(folder.path, SAMPLE_DEFINITION_FILE) }));
 }
 
+/**
+ * fetch the Sample Definitions file from the repository.
+ * @param args.octokit An instance of the Octokit GitHub API client.
+ * @returns an array of Samples
+ */
 export async function fetchSampleDefinitions(octokit: Octokit): Promise<Sample[]> {
-  const sampleDefinitionFiles = await listSampleDefinitionFiles({
+  const fileContent = await fetchFileContent({
     octokit,
-    repoInfo: { ...KIE_SAMPLES_REPO },
+    fileInfo: {
+      ...KIE_SAMPLES_REPO,
+      path: SAMPLE_DEFINITIONS_FILE,
+    },
   });
 
-  const samples = (
-    await Promise.all(
-      sampleDefinitionFiles.map(async (definitionFile) => {
-        const fileContent = await fetchFileContent({
-          octokit,
-          fileInfo: {
-            ...KIE_SAMPLES_REPO,
-            path: definitionFile.definitionPath,
-          },
-        });
-
-        if (!fileContent) {
-          console.error(`Could not read sample definition for ${definitionFile.sampleId}`);
-          return null;
-        }
-
-        const definition = JSON.parse(fileContent) as SampleDefinition;
-        const svgContent = await fetchFileContent({
-          octokit,
-          fileInfo: {
-            ...KIE_SAMPLES_REPO,
-            path: join("samples", definitionFile.sampleId, definition.cover),
-          },
-        });
-
-        if (!svgContent) {
-          console.error(`Could not read sample svg for ${definitionFile.sampleId}`);
-          return null;
-        }
-
-        return {
-          sampleId: definitionFile.sampleId,
-          definition,
-          svgContent,
-        };
-      })
-    )
-  ).filter((sample) => sample !== null) as Sample[];
+  if (!fileContent) {
+    console.error(`Could not read sample definitions`);
+    return [];
+  }
+
+  const definitions = JSON.parse(fileContent) as SampleDefinition[];
+
+  return definitions.map((definition) => ({
+    sampleId: definition.sample_path.replace(new RegExp(`^${SAMPLE_FOLDER}/`), ""),
+    definition,
+  }));
+}
 
-  if (samples.length === 0) {
-    throw new Error("No samples could be loaded.");
+/**
+ * Fetches the cover of a given sample using the GitHub API.
+ * @param args.octokit An instance of the Octokit GitHub API client.
+ * @param args.sample The sample object for which the cover is being fetched.
+ * @returns The content of the SVG cover file for the sample, or undefined if it could not be fetched.
+ */
+export async function fetchSampleCover(args: { octokit: Octokit; sample: Sample }): Promise<string | undefined> {
+  const { sample } = args;
+
+  const svgContent = await fetchFileContent({
+    octokit: args.octokit,
+    fileInfo: {
+      ...KIE_SAMPLES_REPO,
+      path: join(SAMPLE_FOLDER, sample.sampleId, sample.definition.cover),
+    },
+  });
+
+  if (!svgContent) {
+    console.error(`Could not read sample svg for ${sample.sampleId}`);
+    return;
   }
 
-  return samples;
+  return svgContent;
 }
 
 export async function fetchSampleFiles(args: { octokit: Octokit; sampleId: string }): Promise<LocalFile[]> {
@@ -209,7 +233,9 @@ export async function fetchSampleFiles(args: { octokit: Octokit; sampleId: strin
   }
 
   const sampleFiles = sampleFolderFiles
-    .filter((file) => file.name !== SAMPLE_DEFINITION_FILE && extname(file.name) !== SVG_EXTENSION)
+    .filter(
+      (file) => file.name !== SAMPLE_DEFINITION_FILE && extname(file.name) !== SVG_EXTENSION && file.type === "file"
+    )
     .map(async (file) => {
       const fileContent = await fetchFileContent({
         octokit: args.octokit,


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 09/27: Merge remote-tracking branch 'kiegroup/main' into KOGITO-8015-feature-preview

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit 720bb2a323b2d715d9f5604d635b6d5ba1f44d0e
Merge: 9bc804ea70 c3ae91d77f
Author: Guilherme Caponetto <63...@users.noreply.github.com>
AuthorDate: Wed Feb 15 06:29:41 2023 -0300

    Merge remote-tracking branch 'kiegroup/main' into KOGITO-8015-feature-preview

 packages/vscode-extension-yard-editor/README.md    |   2 +-
 .../it-tests/yard-editor.test.ts                   |   3 +-
 packages/vscode-extension-yard-editor/package.json |  30 +--
 .../src/extension/extension.ts                     |   2 +-
 .../src/extension/setupDiagramEditorControls.ts    |   2 +-
 .../syntaxes/JSON.tmLanguage.json                  | 213 ---------------------
 packages/yard-editor/README.md                     |   2 +-
 packages/yard-editor/dev-webapp/App.tsx            |   6 +-
 packages/yard-editor/dev-webapp/EmptyState.tsx     |   5 +-
 packages/yard-editor/src/model/YardSerializer.ts   |   2 +-
 .../yard-editor/src/textEditor/YardTextEditor.tsx  |  10 -
 11 files changed, 14 insertions(+), 263 deletions(-)


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 12/27: KOGITO-8151: Refactor file listing according to UX redesign (#1463)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit 1abdf8072b48b8ad310cb86003e0b30ad4cfd8d0
Author: Fabrizio Antonangeli <fa...@gmail.com>
AuthorDate: Mon Mar 27 15:38:30 2023 +0200

    KOGITO-8151: Refactor file listing according to UX redesign (#1463)
    
    Co-authored-by: Guilherme Caponetto <63...@users.noreply.github.com>
---
 packages/serverless-logic-web-tools/package.json   |   2 +-
 .../src/editor/EditorToolbar.tsx                   |   2 +-
 .../src/homepage/pageTemplate/OnlineEditorPage.tsx |   8 +-
 .../homepage/recentModels/ConfirmDeleteModal.tsx   | 154 ++++++
 .../src/homepage/recentModels/RecentModels.tsx     | 209 ++++++++
 .../src/homepage/recentModels/WorkspacesTable.tsx  | 232 +++++++++
 .../homepage/recentModels/WorkspacesTableRow.tsx   | 209 ++++++++
 .../src/homepage/routes/HomePageRoutes.tsx         |  10 +-
 .../homepage/serverlessModels/ServerlessModels.tsx | 552 ---------------------
 .../src/homepage/uiNav/HomePageNav.tsx             |  25 +-
 .../src/navigation/Routes.ts                       |   3 +
 .../serverless-logic-web-tools/src/table/Table.css |  21 +
 .../src/table/TablePagination.tsx                  |  54 ++
 .../src/table/TableToolbar.tsx                     | 161 ++++++
 pnpm-lock.yaml                                     |   6 +-
 15 files changed, 1072 insertions(+), 576 deletions(-)

diff --git a/packages/serverless-logic-web-tools/package.json b/packages/serverless-logic-web-tools/package.json
index 5a80c7f3da..b4dc7778a3 100644
--- a/packages/serverless-logic-web-tools/package.json
+++ b/packages/serverless-logic-web-tools/package.json
@@ -55,12 +55,12 @@
     "@patternfly/quickstarts": "^2.3.2",
     "@patternfly/react-core": "^4.276.6",
     "@patternfly/react-icons": "^4.93.6",
+    "@patternfly/react-table": "^4.112.39",
     "@patternfly/react-tokens": "^4.94.6",
     "@rhoas/registry-instance-sdk": "^0.34.1",
     "axios": "^0.27.2",
     "bowser": "^2.10.0",
     "buffer": "^6.0.3",
-    "dexie": "^3.2.2",
     "history": "^4.9.0",
     "jszip": "^3.7.1",
     "moment": "^2.29.4",
diff --git a/packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx b/packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx
index 20348a49c8..23eca2485c 100644
--- a/packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx
@@ -1313,7 +1313,7 @@ If you are, it means that creating this Gist failed and it can safely be deleted
                   <Button
                     className={"kie-tools--masthead-hoverable"}
                     variant={ButtonVariant.plain}
-                    onClick={() => history.push({ pathname: routes.home.path({}) })}
+                    onClick={() => history.push({ pathname: routes.recentModels.path({}) })}
                   >
                     <AngleLeftIcon />
                   </Button>
diff --git a/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx b/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
index e9c22f59b6..7d481676b1 100644
--- a/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
@@ -166,7 +166,13 @@ export function OnlineEditorPage(props: OnlineEditorPageProps) {
   return (
     <QuickStartContainer {...drawerProps}>
       <div id="page-container" ref={props.pageContainerRef}>
-        <Page header={masthead} sidebar={sidebar} skipToContent={pageSkipToContent} mainContainerId={mainContainerId}>
+        <Page
+          header={masthead}
+          sidebar={sidebar}
+          skipToContent={pageSkipToContent}
+          mainContainerId={mainContainerId}
+          isManagedSidebar
+        >
           {props.children}
         </Page>
       </div>
diff --git a/packages/serverless-logic-web-tools/src/homepage/recentModels/ConfirmDeleteModal.tsx b/packages/serverless-logic-web-tools/src/homepage/recentModels/ConfirmDeleteModal.tsx
new file mode 100644
index 0000000000..4d260c06af
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/homepage/recentModels/ConfirmDeleteModal.tsx
@@ -0,0 +1,154 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import * as React from "react";
+import { WorkspaceDescriptor } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceDescriptor";
+import { Button, Checkbox, Modal, ModalProps, Skeleton } from "@patternfly/react-core/dist/js";
+import { useCallback, useEffect, useMemo, useState } from "react";
+import { useWorkspaces } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+import { splitFiles } from "../../extension";
+
+export function ConfirmDeleteModal(
+  props: {
+    onDelete: () => void;
+    selectedWorkspaceIds: WorkspaceDescriptor["workspaceId"][];
+  } & Pick<ModalProps, "isOpen" | "onClose">
+) {
+  const { selectedWorkspaceIds, isOpen, onClose, onDelete } = props;
+  const [isDeleteCheck, setIsDeleteCheck] = useState(false);
+  const [firstSelectedWorkspaceName, setFirstSelectedWorkspaceName] = useState("");
+  const [selectedFoldersCount, setSelectedFoldersCount] = useState(0);
+  const [elementsTypeName, setElementsTypeName] = useState("models");
+  const [dataLoaded, setDataLoaded] = useState(false);
+  const [fetchError, setFetchError] = useState(false);
+  const workspaces = useWorkspaces();
+
+  const isPlural = useMemo(() => selectedWorkspaceIds.length > 1, [selectedWorkspaceIds]);
+
+  const isWsFolder = useCallback(
+    async (workspaceId: WorkspaceDescriptor["workspaceId"]) => {
+      const { editableFiles, readonlyFiles } = splitFiles(await workspaces.getFiles({ workspaceId }));
+      return editableFiles.length > 1 || readonlyFiles.length > 0;
+    },
+    [workspaces]
+  );
+
+  const getWorkspaceName = useCallback(
+    async (workspaceId: WorkspaceDescriptor["workspaceId"]) => {
+      if (selectedWorkspaceIds.length !== 1) {
+        return "";
+      }
+      const workspaceData = await workspaces.getWorkspace({ workspaceId });
+      return (await isWsFolder(workspaceId))
+        ? workspaceData.name
+        : (await workspaces.getFiles({ workspaceId }))[0].nameWithoutExtension;
+    },
+    [isWsFolder, selectedWorkspaceIds, workspaces]
+  );
+
+  const onDeleteCheckChange = useCallback((checked: boolean) => {
+    setIsDeleteCheck(checked);
+  }, []);
+
+  useEffect(() => {
+    if (!isOpen) {
+      return;
+    }
+
+    const allPromises: Promise<void>[] = [];
+
+    setIsDeleteCheck(false);
+    setDataLoaded(false);
+    setFetchError(false);
+
+    if (selectedWorkspaceIds.length === 1) {
+      allPromises.push(getWorkspaceName(selectedWorkspaceIds[0]).then(setFirstSelectedWorkspaceName));
+    }
+
+    allPromises.push(
+      Promise.all(selectedWorkspaceIds.map(isWsFolder)).then((results) => {
+        const foldersCount = results.filter((r) => r).length;
+        setSelectedFoldersCount(foldersCount);
+        if (isPlural) {
+          setElementsTypeName(foldersCount ? "workspaces" : "models");
+        } else {
+          setElementsTypeName(foldersCount ? "workspace" : "model");
+        }
+      })
+    );
+
+    Promise.all(allPromises)
+      .then(() => setDataLoaded(true))
+      .catch((error) => {
+        console.error("Error retrieving workspace data:", error);
+        setFetchError(true);
+      });
+  }, [selectedWorkspaceIds, isWsFolder, isOpen, getWorkspaceName, isPlural]);
+
+  return (
+    <>
+      <Modal
+        title={`Delete ${elementsTypeName}`}
+        titleIconVariant={"warning"}
+        isOpen={isOpen && !fetchError}
+        onClose={onClose}
+        aria-describedby="modal-custom-icon-description"
+        actions={[
+          dataLoaded ? (
+            <Button key="confirm" variant="danger" onClick={onDelete} isDisabled={!isDeleteCheck} aria-label="Delete">
+              Delete {elementsTypeName}
+            </Button>
+          ) : (
+            <Skeleton width="100px" key="confirm-skeleton" />
+          ),
+          <Button key="cancel" variant="link" onClick={onClose} aria-label="Cancel">
+            Cancel
+          </Button>,
+        ]}
+        variant="small"
+      >
+        {dataLoaded ? (
+          <span id="modal-custom-icon-description">
+            Deleting {isPlural ? "these" : "this"}{" "}
+            <b>{isPlural ? selectedWorkspaceIds.length : firstSelectedWorkspaceName}</b> {elementsTypeName}
+            {selectedFoldersCount ? ` removes the ${elementsTypeName} and all the models inside.` : "."}
+          </span>
+        ) : (
+          <Skeleton width="80%" />
+        )}
+        <br />
+        <br />
+        <Checkbox
+          label="I understand that this action cannot be undone."
+          id="delete-model-check"
+          isChecked={isDeleteCheck}
+          onChange={onDeleteCheckChange}
+          aria-label="Confirm checkbox delete model"
+        />
+      </Modal>
+
+      <Modal
+        title={`Error retrieving data`}
+        titleIconVariant={"danger"}
+        isOpen={isOpen && fetchError}
+        onClose={onClose}
+        aria-describedby="modal-custom-icon-description"
+        variant="small"
+      >
+        <span id="modal-custom-icon-description">An error occurred while loading the data!</span>
+      </Modal>
+    </>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/homepage/recentModels/RecentModels.tsx b/packages/serverless-logic-web-tools/src/homepage/recentModels/RecentModels.tsx
new file mode 100644
index 0000000000..964fce3616
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/homepage/recentModels/RecentModels.tsx
@@ -0,0 +1,209 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { PromiseStateWrapper } from "@kie-tools-core/react-hooks/dist/PromiseState";
+import { useWorkspaces } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+import { useWorkspaceDescriptorsPromise } from "@kie-tools-core/workspaces-git-fs/dist/hooks/WorkspacesHooks";
+import { WorkspaceDescriptor } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceDescriptor";
+import { PerPageOptions } from "@patternfly/react-core/dist/js/components/Pagination";
+import { Alert, AlertActionCloseButton, AlertProps } from "@patternfly/react-core/dist/js/components/Alert";
+import { AlertGroup } from "@patternfly/react-core/dist/js/components/AlertGroup";
+import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
+import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
+import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
+import { Title } from "@patternfly/react-core/dist/js/components/Title";
+import { Bullseye } from "@patternfly/react-core/dist/js/layouts/Bullseye";
+import { CubesIcon } from "@patternfly/react-icons/dist/js/icons/cubes-icon";
+import * as React from "react";
+import { useCallback, useState } from "react";
+import { ConfirmDeleteModal } from "./ConfirmDeleteModal";
+import { TableToolbar } from "../../table/TableToolbar";
+import { WorkspacesTable } from "./WorkspacesTable";
+import { TablePagination } from "../../table/TablePagination";
+
+const perPageOptions: PerPageOptions[] = [5, 10, 20, 50, 100].map((n) => ({
+  title: n.toString(),
+  value: n,
+}));
+
+export function RecentModels() {
+  const workspaceDescriptorsPromise = useWorkspaceDescriptorsPromise();
+  const [selectedWorkspaceIds, setSelectedWorkspaceIds] = useState<WorkspaceDescriptor["workspaceId"][]>([]);
+  const [isConfirmDeleteModalOpen, setIsConfirmDeleteModalOpen] = useState(false);
+  const [alerts, setAlerts] = useState<Partial<AlertProps>[]>([]);
+  const [searchValue, setSearchValue] = React.useState("");
+  const [page, setPage] = React.useState(1);
+  const [perPage, setPerPage] = React.useState(5);
+  const workspaces = useWorkspaces();
+
+  const onConfirmDeleteModalClose = useCallback(() => setIsConfirmDeleteModalOpen(false), []);
+
+  const addAlert = useCallback(
+    (title: string, variant: AlertProps["variant"], key: React.Key = new Date().getTime()) => {
+      setAlerts((prevAlerts) => [...prevAlerts, { title, variant, key }]);
+    },
+    []
+  );
+
+  const removeAlert = useCallback((key: React.Key) => {
+    setAlerts((prevAlerts) => [...prevAlerts.filter((alert) => alert.key !== key)]);
+  }, []);
+
+  const onConfirmDeleteModalDelete = useCallback(
+    async (workspaceDescriptors: WorkspaceDescriptor[]) => {
+      const modelsWord = selectedWorkspaceIds.length > 1 ? "Models" : "Model";
+      setIsConfirmDeleteModalOpen(false);
+
+      Promise.all(
+        workspaceDescriptors
+          .filter((w) => selectedWorkspaceIds.includes(w.workspaceId))
+          .map((w) => workspaces.deleteWorkspace(w))
+      )
+        .then(() => {
+          addAlert(`${modelsWord} deleted successfully`, "success");
+        })
+        .catch((e) => {
+          console.error(e);
+          addAlert(
+            `Oops, something went wrong while trying to delete the selected ${modelsWord}. Please refresh the page and try again. If the problem persists, you can try deleting site data for this application in your browser's settings.`,
+            "danger"
+          );
+        })
+        .finally(() => {
+          setSelectedWorkspaceIds([]);
+        });
+    },
+    [selectedWorkspaceIds, addAlert, workspaces]
+  );
+
+  const onWsToggle = useCallback((workspaceId: WorkspaceDescriptor["workspaceId"], checked: boolean) => {
+    setSelectedWorkspaceIds((prevSelected) => {
+      const otherSelectedIds = prevSelected.filter((r) => r !== workspaceId);
+      return checked ? [...otherSelectedIds, workspaceId] : otherSelectedIds;
+    });
+  }, []);
+
+  const onToggleAllElements = useCallback((checked: boolean, workspaceDescriptors: WorkspaceDescriptor[]) => {
+    setSelectedWorkspaceIds(checked ? workspaceDescriptors.map((e) => e.workspaceId) : []);
+  }, []);
+
+  const onClearFilters = useCallback(() => {
+    setSearchValue("");
+  }, []);
+
+  return (
+    <PromiseStateWrapper
+      promise={workspaceDescriptorsPromise}
+      rejected={(e) => <>Error fetching workspaces: {e + ""}</>}
+      resolved={(workspaceDescriptors: WorkspaceDescriptor[]) => {
+        const itemCount = workspaceDescriptors.length;
+
+        return (
+          <>
+            <AlertGroup isToast isLiveRegion>
+              {alerts.map(
+                ({ key, variant, title }) =>
+                  key && (
+                    <Alert
+                      variant={variant}
+                      title={title}
+                      timeout
+                      onTimeout={() => removeAlert(key)}
+                      actionClose={
+                        <AlertActionCloseButton
+                          title={title as string}
+                          variantLabel={`${variant} alert`}
+                          onClose={() => removeAlert(key)}
+                        />
+                      }
+                      key={key}
+                    />
+                  )
+              )}
+            </AlertGroup>
+            <Page>
+              <PageSection variant={"light"}>
+                <TextContent>
+                  <Text component={TextVariants.h1}>Recent models</Text>
+                  <Text component={TextVariants.p}>
+                    Use your recent models from GitHub Repository, a GitHub Gist or saved in your browser.
+                  </Text>
+                </TextContent>
+              </PageSection>
+
+              <PageSection isFilled aria-label="workspaces-table-section">
+                <PageSection variant={"light"} padding={{ default: "noPadding" }}>
+                  {itemCount > 0 && (
+                    <>
+                      <TableToolbar
+                        itemCount={itemCount}
+                        onDeleteActionButtonClick={() => setIsConfirmDeleteModalOpen(true)}
+                        onToggleAllElements={(checked) => onToggleAllElements(checked, workspaceDescriptors)}
+                        searchValue={searchValue}
+                        selectedElementsCount={selectedWorkspaceIds.length}
+                        setSearchValue={setSearchValue}
+                        page={page}
+                        perPage={perPage}
+                        perPageOptions={perPageOptions}
+                        setPage={setPage}
+                        setPerPage={setPerPage}
+                      />
+                      <WorkspacesTable
+                        page={page}
+                        perPage={perPage}
+                        onClearFilters={onClearFilters}
+                        onWsToggle={onWsToggle}
+                        searchValue={searchValue}
+                        selectedWorkspaceIds={selectedWorkspaceIds}
+                        workspaceDescriptors={workspaceDescriptors}
+                      />
+                      <TablePagination
+                        itemCount={itemCount}
+                        page={page}
+                        perPage={perPage}
+                        perPageOptions={perPageOptions}
+                        setPage={setPage}
+                        setPerPage={setPerPage}
+                        variant="bottom"
+                      />
+                    </>
+                  )}
+                  {workspaceDescriptors.length === 0 && (
+                    <Bullseye>
+                      <EmptyState>
+                        <EmptyStateIcon icon={CubesIcon} />
+                        <Title headingLevel="h4" size="lg">
+                          {`Nothing here`}
+                        </Title>
+                        <EmptyStateBody>{`Start by adding a new model`}</EmptyStateBody>
+                      </EmptyState>
+                    </Bullseye>
+                  )}
+                </PageSection>
+              </PageSection>
+            </Page>
+            <ConfirmDeleteModal
+              selectedWorkspaceIds={selectedWorkspaceIds}
+              isOpen={isConfirmDeleteModalOpen}
+              onClose={onConfirmDeleteModalClose}
+              onDelete={() => onConfirmDeleteModalDelete(workspaceDescriptors)}
+            />
+          </>
+        );
+      }}
+    />
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/homepage/recentModels/WorkspacesTable.tsx b/packages/serverless-logic-web-tools/src/homepage/recentModels/WorkspacesTable.tsx
new file mode 100644
index 0000000000..9ae35c5f1a
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/homepage/recentModels/WorkspacesTable.tsx
@@ -0,0 +1,232 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import {
+  PromiseStateStatus,
+  PromiseStateWrapper,
+  useLivePromiseState,
+} from "@kie-tools-core/react-hooks/dist/PromiseState";
+import { useWorkspaces, WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+import { WorkspaceDescriptor } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceDescriptor";
+import { WorkspaceKind } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceOrigin";
+import "@patternfly/react-core/dist/styles/base.css";
+import {
+  TableComposable,
+  Tbody,
+  Th,
+  Thead,
+  Tr,
+  ThProps,
+} from "@patternfly/react-table/dist/js/components/TableComposable";
+import * as React from "react";
+import { useCallback, useMemo, useState } from "react";
+import { splitFiles } from "../../extension";
+import { ErrorBoundary } from "../../reactExt/ErrorBoundary";
+import { TablePaginationProps } from "../../table/TablePagination";
+import {
+  WorkspacesTableRow,
+  WorkspacesTableRowEmptyState,
+  WorkspacesTableRowError,
+  workspacesTableRowErrorContent,
+  WorkspacesTableRowLoading,
+} from "./WorkspacesTableRow";
+
+export const columnNames = {
+  name: "Name",
+  type: "Type",
+  created: "Created",
+  lastUpdated: "Last updated",
+  editableFiles: "Editable files",
+  totalFiles: "Total files",
+};
+
+export type WorkspacesTableProps = Pick<TablePaginationProps, "page" | "perPage"> & {
+  onClearFilters: () => void;
+  onWsToggle: (workspaceId: WorkspaceDescriptor["workspaceId"], checked: boolean) => void;
+  searchValue: string;
+  selectedWorkspaceIds: WorkspaceDescriptor["workspaceId"][];
+  workspaceDescriptors: WorkspaceDescriptor[];
+};
+
+export type WorkspacesTableRowData = Pick<
+  WorkspaceDescriptor,
+  "workspaceId" | "origin" | "createdDateISO" | "lastUpdatedDateISO"
+> & {
+  descriptor: WorkspaceDescriptor;
+  editableFiles: WorkspaceFile[];
+  hasErrors: boolean;
+  isWsFolder: boolean;
+  name: string;
+  totalFiles: number;
+};
+
+export function WorkspacesTable(props: WorkspacesTableProps) {
+  const { workspaceDescriptors, selectedWorkspaceIds, onClearFilters, searchValue, page, perPage } = props;
+  const [activeSortIndex, setActiveSortIndex] = useState<number>(3);
+  const [activeSortDirection, setActiveSortDirection] = useState<"asc" | "desc">("desc");
+  const workspaces = useWorkspaces();
+
+  const [allWorkspacePromises] = useLivePromiseState<WorkspaceFile[][]>(
+    useMemo(
+      () => () => Promise.all(workspaceDescriptors.map((w) => workspaces.getFiles(w))),
+      [workspaceDescriptors, workspaces]
+    )
+  );
+
+  const tableData = useMemo<WorkspacesTableRowData[]>(
+    () =>
+      allWorkspacePromises.status !== PromiseStateStatus.RESOLVED
+        ? []
+        : workspaceDescriptors.map((workspace, index) => {
+            const { editableFiles, readonlyFiles } = splitFiles(allWorkspacePromises.data[index] ?? []);
+            const isWsFolder =
+              editableFiles.length > 1 || readonlyFiles.length > 0 || workspace.origin.kind !== WorkspaceKind.LOCAL;
+            const hasErrors = !editableFiles || !editableFiles[0];
+            const name = getWorkspaceName(workspace, isWsFolder, hasErrors, editableFiles);
+
+            return {
+              createdDateISO: workspace.createdDateISO,
+              descriptor: workspace,
+              editableFiles: editableFiles,
+              hasErrors,
+              isWsFolder,
+              lastUpdatedDateISO: workspace.lastUpdatedDateISO,
+              name,
+              origin: workspace.origin,
+              totalFiles: editableFiles.length + readonlyFiles.length,
+              workspaceId: workspace.workspaceId,
+            };
+          }),
+    [workspaceDescriptors, allWorkspacePromises.data, allWorkspacePromises.status]
+  );
+
+  const filteredTableData = useMemo<WorkspacesTableRowData[]>(() => {
+    const searchRegex = new RegExp(searchValue, "i");
+    return searchValue ? tableData.filter((e) => e.name.search(searchRegex) >= 0) : tableData;
+  }, [searchValue, tableData]);
+
+  const sortedTableData = useMemo<WorkspacesTableRowData[]>(
+    () =>
+      // slice() here is needed to create a copy of filteredTableData and sort the data
+      filteredTableData.slice().sort((a, b) => {
+        const aValue = getSortableRowValues(a)[activeSortIndex];
+        const bValue = getSortableRowValues(b)[activeSortIndex];
+        // put items with errors at the top
+        if (a.hasErrors) {
+          return -1;
+        }
+        if (typeof aValue === "number") {
+          return activeSortDirection === "asc"
+            ? (aValue as number) - (bValue as number)
+            : (bValue as number) - (aValue as number);
+        } else {
+          return activeSortDirection === "asc"
+            ? (aValue as string).localeCompare(bValue as string)
+            : (bValue as string).localeCompare(aValue as string);
+        }
+      }),
+    [filteredTableData, activeSortIndex, activeSortDirection]
+  );
+
+  const visibleTableData = useMemo<WorkspacesTableRowData[]>(
+    () => sortedTableData.slice((page - 1) * perPage, page * perPage),
+    [sortedTableData, page, perPage]
+  );
+
+  const getSortParams = useCallback(
+    (columnIndex: number): ThProps["sort"] => ({
+      sortBy: {
+        index: activeSortIndex,
+        direction: activeSortDirection,
+        defaultDirection: "asc",
+      },
+      onSort: (_event, index, direction) => {
+        setActiveSortIndex(index);
+        setActiveSortDirection(direction);
+      },
+      columnIndex,
+    }),
+    [activeSortIndex, activeSortDirection]
+  );
+
+  const isWsCheckboxChecked = useCallback(
+    (workspaceId: WorkspaceDescriptor["workspaceId"]) => selectedWorkspaceIds.includes(workspaceId),
+    [selectedWorkspaceIds]
+  );
+
+  return (
+    <>
+      <TableComposable aria-label="Selectable table">
+        <Thead>
+          <Tr>
+            <Th>&nbsp;</Th>
+            <Th sort={getSortParams(0)}>{columnNames.name}</Th>
+            <Th sort={getSortParams(1)}>{columnNames.type}</Th>
+            <Th sort={getSortParams(2)}>{columnNames.created}</Th>
+            <Th sort={getSortParams(3)}>{columnNames.lastUpdated}</Th>
+            <Th sort={getSortParams(4)}>{columnNames.editableFiles}</Th>
+            <Th sort={getSortParams(5)}>{columnNames.totalFiles}</Th>
+            <Th></Th>
+          </Tr>
+        </Thead>
+        <Tbody>
+          <PromiseStateWrapper
+            promise={allWorkspacePromises}
+            pending={<WorkspacesTableRowLoading />}
+            rejected={() => <>ERROR</>}
+            resolved={() =>
+              !visibleTableData.length ? (
+                <WorkspacesTableRowEmptyState onClearFilters={onClearFilters} />
+              ) : (
+                visibleTableData.map((rowData, rowIndex) => (
+                  <ErrorBoundary key={rowData.workspaceId} error={<WorkspacesTableRowError rowData={rowData} />}>
+                    <WorkspacesTableRow
+                      rowData={rowData}
+                      rowIndex={rowIndex}
+                      isSelected={isWsCheckboxChecked(rowData.workspaceId)}
+                      onToggle={(checked) => props.onWsToggle(rowData.workspaceId, checked)}
+                    />
+                  </ErrorBoundary>
+                ))
+              )
+            }
+          />
+        </Tbody>
+      </TableComposable>
+    </>
+  );
+}
+
+function getSortableRowValues(tableData: WorkspacesTableRowData): (string | number | boolean)[] {
+  const { name, isWsFolder, createdDateISO, lastUpdatedDateISO, editableFiles, totalFiles, descriptor } = tableData;
+  const workspaceType = !editableFiles.length
+    ? ""
+    : isWsFolder
+    ? "d_" + descriptor.origin.toString()
+    : "f_" + editableFiles[0].extension;
+  return [name, workspaceType, createdDateISO, lastUpdatedDateISO, editableFiles.length, totalFiles];
+}
+
+function getWorkspaceName(
+  workspace: WorkspaceDescriptor,
+  isWsFolder: boolean,
+  hasErrors: boolean,
+  editableFiles: WorkspaceFile[]
+) {
+  if (hasErrors) {
+    return workspacesTableRowErrorContent;
+  }
+  return !isWsFolder && editableFiles.length ? editableFiles[0].nameWithoutExtension : workspace.name;
+}
diff --git a/packages/serverless-logic-web-tools/src/homepage/recentModels/WorkspacesTableRow.tsx b/packages/serverless-logic-web-tools/src/homepage/recentModels/WorkspacesTableRow.tsx
new file mode 100644
index 0000000000..68eb97634b
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/homepage/recentModels/WorkspacesTableRow.tsx
@@ -0,0 +1,209 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import * as React from "react";
+import { useMemo } from "react";
+import { useWorkspaces } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+import { Bullseye } from "@patternfly/react-core/dist/js/layouts/Bullseye";
+import { Button } from "@patternfly/react-core/dist/js/components/Button";
+import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
+import { Popover } from "@patternfly/react-core/dist/js/components/Popover";
+import { Title } from "@patternfly/react-core/dist/js/components/Title";
+import { Skeleton } from "@patternfly/react-core/dist/js/components/Skeleton";
+import "@patternfly/react-core/dist/styles/base.css";
+import { ExclamationTriangleIcon, OutlinedQuestionCircleIcon, SearchIcon } from "@patternfly/react-icons/dist/js/icons";
+import { FolderIcon } from "@patternfly/react-icons/dist/js/icons/folder-icon";
+import { TaskIcon } from "@patternfly/react-icons/dist/js/icons/task-icon";
+import { ActionsColumn, Td, Tr } from "@patternfly/react-table/dist/esm";
+import { TdSelectType } from "@patternfly/react-table/dist/esm/components/Table/base";
+import { Link } from "react-router-dom";
+import { RelativeDate } from "../../dates/RelativeDate";
+import { routes } from "../../navigation/Routes";
+import { FileLabel } from "../../workspace/components/FileLabel";
+import { WorkspaceLabel } from "../../workspace/components/WorkspaceLabel";
+import { columnNames, WorkspacesTableRowData } from "./WorkspacesTable";
+import "../../table/Table.css";
+
+export const workspacesTableRowErrorContent = "Error obtaining workspace information";
+
+export type WorkspacesTableRowProps = {
+  rowIndex: TdSelectType["rowIndex"];
+  rowData: WorkspacesTableRowData;
+  isSelected: boolean;
+  /**
+   * event fired when the Checkbox is toggled
+   */
+  onToggle: (selected: boolean) => void;
+};
+
+export function WorkspacesTableRow(props: WorkspacesTableRowProps) {
+  const { isSelected, rowIndex } = props;
+  const { descriptor, editableFiles, totalFiles, name, isWsFolder, workspaceId, createdDateISO, lastUpdatedDateISO } =
+    props.rowData;
+  const workspaces = useWorkspaces();
+
+  const linkTo = useMemo(
+    () =>
+      routes.workspaceWithFilePath.path({
+        workspaceId: editableFiles[0].workspaceId,
+        fileRelativePath: editableFiles[0].relativePathWithoutExtension,
+        extension: editableFiles[0].extension,
+      }),
+    [editableFiles]
+  );
+
+  return (
+    <Tr key={name}>
+      <Td
+        select={{
+          rowIndex,
+          onSelect: (_event, checked) => props.onToggle(checked),
+          isSelected,
+        }}
+      />
+      <Td dataLabel={columnNames.name}>
+        {isWsFolder ? (
+          <>
+            <FolderIcon />
+            &nbsp;&nbsp;&nbsp;{name}
+          </>
+        ) : (
+          <>
+            <TaskIcon />
+            &nbsp;&nbsp;&nbsp;<Link to={linkTo}>{name}</Link>
+          </>
+        )}
+      </Td>
+      <Td dataLabel={columnNames.type}>
+        {isWsFolder ? <WorkspaceLabel descriptor={descriptor} /> : <FileLabel extension={editableFiles[0].extension} />}
+      </Td>
+      <Td dataLabel={columnNames.created}>
+        <RelativeDate date={new Date(createdDateISO ?? "")} />
+      </Td>
+      <Td dataLabel={columnNames.lastUpdated}>
+        <RelativeDate date={new Date(lastUpdatedDateISO ?? "")} />
+      </Td>
+      <Td dataLabel={columnNames.editableFiles}>{editableFiles.length}</Td>
+      <Td dataLabel={columnNames.totalFiles}>{totalFiles}</Td>
+      <Td isActionCell>
+        <ActionsColumn
+          items={[
+            {
+              title: "Delete",
+              onClick: () => workspaces.deleteWorkspace({ workspaceId }),
+            },
+          ]}
+        />
+      </Td>
+    </Tr>
+  );
+}
+
+export function WorkspacesTableRowError(props: { rowData: WorkspacesTableRowData }) {
+  const { rowData } = props;
+  const workspaces = useWorkspaces();
+
+  return (
+    <>
+      <Tr>
+        <Td>&nbsp;</Td>
+        <Td colSpan={Object.keys(columnNames).length}>
+          <ExclamationTriangleIcon />
+          &nbsp;&nbsp;
+          {workspacesTableRowErrorContent}&nbsp;
+          <Popover
+            maxWidth="30%"
+            bodyContent={
+              <>
+                Error obtaining information for the following element:
+                <br />
+                workspace name: <b>{rowData.descriptor.name}</b>
+                <br />
+                workspace id: <b>{rowData.workspaceId}</b>
+                <br />
+                <br />
+                To solve the issue, try deleting the workspace and creating it again.
+              </>
+            }
+          >
+            <OutlinedQuestionCircleIcon className="pf-c-question-circle-icon" />
+          </Popover>
+        </Td>
+        <Td isActionCell>
+          <ActionsColumn
+            items={[
+              {
+                title: "Delete",
+                onClick: () => workspaces.deleteWorkspace({ workspaceId: rowData.workspaceId }),
+              },
+            ]}
+          />
+        </Td>
+      </Tr>
+    </>
+  );
+}
+
+export function WorkspacesTableRowEmptyState(props: { onClearFilters: () => void }) {
+  return (
+    <Tr>
+      <Td colSpan={Object.keys(columnNames).length + 2}>
+        <Bullseye>
+          <EmptyState variant="small">
+            <EmptyStateIcon icon={SearchIcon} />
+            <Title headingLevel="h2" size="lg">
+              No matching modules found
+            </Title>
+            <EmptyStateBody>This filter criteria matches no groups. Try changing your filter settings.</EmptyStateBody>
+            <Button variant="link" onClick={props.onClearFilters}>
+              Clear all filters
+            </Button>
+          </EmptyState>
+        </Bullseye>
+      </Td>
+    </Tr>
+  );
+}
+
+export function WorkspacesTableRowLoading() {
+  return (
+    <tr>
+      <Td>
+        <Skeleton />
+      </Td>
+      <Td>
+        <Skeleton />
+      </Td>
+      <Td>
+        <Skeleton />
+      </Td>
+      <Td>
+        <Skeleton />
+      </Td>
+      <Td>
+        <Skeleton />
+      </Td>
+      <Td>
+        <Skeleton />
+      </Td>
+      <Td>
+        <Skeleton />
+      </Td>
+      <Td>
+        <Skeleton />
+      </Td>
+    </tr>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx b/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx
index 2a2f17cf6e..5885cc544d 100644
--- a/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx
@@ -17,7 +17,7 @@
 import React, { useMemo } from "react";
 import { Switch } from "react-router";
 import { Overview } from "../overView/Overview";
-import { ServerlessModels } from "../serverlessModels/ServerlessModels";
+import { RecentModels } from "../recentModels/RecentModels";
 import { Route } from "react-router-dom";
 import { SampleCatalog } from "../sampleCatalog/SampleCatalog";
 import { useRoutes } from "../../navigation/Hooks";
@@ -54,13 +54,13 @@ export function HomePageRoutes(props: { isNavOpen: boolean }) {
           />
         )}
       </Route>
-      <Route path="/" exact>
+      <Route path={routes.home.path({})} exact>
         <Overview isNavOpen={props.isNavOpen} />
       </Route>
-      <Route path="/ServerlessModels">
-        <ServerlessModels />
+      <Route path={routes.recentModels.path({})}>
+        <RecentModels />
       </Route>
-      <Route path="/SampleCatalog">
+      <Route path={routes.sampleCatalog.path({})}>
         <SampleCatalog />
       </Route>
       <Route component={NoMatchPage} />
diff --git a/packages/serverless-logic-web-tools/src/homepage/serverlessModels/ServerlessModels.tsx b/packages/serverless-logic-web-tools/src/homepage/serverlessModels/ServerlessModels.tsx
deleted file mode 100644
index a2289c29c9..0000000000
--- a/packages/serverless-logic-web-tools/src/homepage/serverlessModels/ServerlessModels.tsx
+++ /dev/null
@@ -1,552 +0,0 @@
-/*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import * as React from "react";
-import { PromiseStateWrapper } from "@kie-tools-core/react-hooks/dist/PromiseState";
-import { useController } from "@kie-tools-core/react-hooks/dist/useController";
-import { useWorkspaces, WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
-import { useWorkspacePromise } from "@kie-tools-core/workspaces-git-fs/dist/hooks/WorkspaceHooks";
-import { useWorkspaceDescriptorsPromise } from "@kie-tools-core/workspaces-git-fs/dist/hooks/WorkspacesHooks";
-import { WorkspaceDescriptor } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceDescriptor";
-import { WorkspaceKind } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceOrigin";
-import {
-  Card,
-  CardActions,
-  CardBody,
-  CardHeader,
-  CardHeaderMain,
-  CardTitle,
-} from "@patternfly/react-core/dist/js/components/Card";
-import {
-  DataList,
-  DataListCell,
-  DataListItem,
-  DataListItemCells,
-  DataListItemRow,
-} from "@patternfly/react-core/dist/js/components/DataList";
-import {
-  Drawer,
-  DrawerActions,
-  DrawerCloseButton,
-  DrawerContent,
-  DrawerContentBody,
-  DrawerHead,
-  DrawerPanelBody,
-  DrawerPanelContent,
-  DrawerSection,
-} from "@patternfly/react-core/dist/js/components/Drawer";
-import { Dropdown, DropdownToggle } from "@patternfly/react-core/dist/js/components/Dropdown";
-import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
-import { ExpandableSection } from "@patternfly/react-core/dist/js/components/ExpandableSection";
-import { Skeleton } from "@patternfly/react-core/dist/js/components/Skeleton";
-import { Spinner } from "@patternfly/react-core/dist/js/components/Spinner";
-import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
-import { Title } from "@patternfly/react-core/dist/js/components/Title";
-import { Bullseye } from "@patternfly/react-core/dist/js/layouts/Bullseye";
-import { Flex, FlexItem } from "@patternfly/react-core/dist/js/layouts/Flex";
-import { Stack, StackItem } from "@patternfly/react-core/dist/js/layouts/Stack";
-import { CubesIcon } from "@patternfly/react-icons/dist/js/icons/cubes-icon";
-import { ExclamationTriangleIcon } from "@patternfly/react-icons/dist/js/icons/exclamation-triangle-icon";
-import { FolderIcon } from "@patternfly/react-icons/dist/js/icons/folder-icon";
-import { PlusIcon } from "@patternfly/react-icons/dist/js/icons/plus-icon";
-import { TaskIcon } from "@patternfly/react-icons/dist/js/icons/task-icon";
-import { useCallback, useEffect, useMemo, useState } from "react";
-import { useHistory } from "react-router";
-import { Link } from "react-router-dom";
-import { Alerts, AlertsController } from "../../alerts/Alerts";
-import { RelativeDate } from "../../dates/RelativeDate";
-import { DeleteDropdownWithConfirmation } from "../../editor/DeleteDropdownWithConfirmation";
-import { NewFileDropdownMenu } from "../../editor/NewFileDropdownMenu";
-import { isEditable, splitFiles } from "../../extension";
-import { useRoutes } from "../../navigation/Hooks";
-import { QueryParams } from "../../navigation/Routes";
-import { useQueryParam, useQueryParams } from "../../queryParams/QueryParamsContext";
-import { ErrorBoundary } from "../../reactExt/ErrorBoundary";
-import { FileLabel } from "../../workspace/components/FileLabel";
-import { WorkspaceLabel } from "../../workspace/components/WorkspaceLabel";
-
-export function ServerlessModels() {
-  const routes = useRoutes();
-  const history = useHistory();
-  const workspaceDescriptorsPromise = useWorkspaceDescriptorsPromise();
-  const expandedWorkspaceId = useQueryParam(QueryParams.EXPAND);
-  const queryParams = useQueryParams();
-
-  const closeExpandedWorkspace = useCallback(() => {
-    history.replace({
-      pathname: "/ServerlessModels",
-      search: queryParams.without(QueryParams.EXPAND).toString(),
-    });
-  }, [history, queryParams]);
-
-  const expandWorkspace = useCallback(
-    (workspaceId: string) => {
-      const expand = workspaceId !== expandedWorkspaceId ? workspaceId : undefined;
-      if (!expand) {
-        closeExpandedWorkspace();
-        return;
-      }
-
-      history.replace({
-        pathname: "/ServerlessModels",
-        search: routes.home.queryString({ expand }),
-      });
-    },
-    [closeExpandedWorkspace, history, routes, expandedWorkspaceId]
-  );
-
-  useEffect(() => {
-    if (
-      workspaceDescriptorsPromise.data &&
-      !workspaceDescriptorsPromise.data.map((f) => f.workspaceId).includes(expandedWorkspaceId!)
-    ) {
-      closeExpandedWorkspace();
-    }
-  }, [workspaceDescriptorsPromise, closeExpandedWorkspace, expandedWorkspaceId]);
-
-  return (
-    <PromiseStateWrapper
-      promise={workspaceDescriptorsPromise}
-      rejected={(e) => <>Error fetching workspaces: {e + ""}</>}
-      resolved={(workspaceDescriptors) => {
-        return (
-          <Drawer isExpanded={!!expandedWorkspaceId} isInline={true}>
-            <DrawerSection>
-              <TextContent>
-                <Text component={TextVariants.h1}>Recent models</Text>
-              </TextContent>
-              <br />
-            </DrawerSection>
-            <DrawerContent
-              panelContent={
-                <WorkspacesListDrawerPanelContent workspaceId={expandedWorkspaceId} onClose={closeExpandedWorkspace} />
-              }
-            >
-              <DrawerContentBody>
-                {workspaceDescriptors.length > 0 && (
-                  <Stack hasGutter={true} style={{ padding: "10px" }}>
-                    {workspaceDescriptors
-                      .sort((a, b) => (new Date(a.lastUpdatedDateISO) < new Date(b.lastUpdatedDateISO) ? 1 : -1))
-                      .map((workspace) => (
-                        <StackItem key={workspace.workspaceId}>
-                          <ErrorBoundary error={<WorkspaceCardError workspace={workspace} />}>
-                            <WorkspaceCard
-                              workspaceId={workspace.workspaceId}
-                              onSelect={() => expandWorkspace(workspace.workspaceId)}
-                              isSelected={workspace.workspaceId === expandedWorkspaceId}
-                            />
-                          </ErrorBoundary>
-                        </StackItem>
-                      ))}
-                  </Stack>
-                )}
-                {workspaceDescriptors.length === 0 && (
-                  <Bullseye>
-                    <EmptyState>
-                      <EmptyStateIcon icon={CubesIcon} />
-                      <Title headingLevel="h4" size="lg">
-                        {`Nothing here`}
-                      </Title>
-                      <EmptyStateBody>{`Start by adding a new model`}</EmptyStateBody>
-                    </EmptyState>
-                  </Bullseye>
-                )}
-              </DrawerContentBody>
-            </DrawerContent>
-          </Drawer>
-        );
-      }}
-    />
-  );
-}
-
-export function WorkspacesListDrawerPanelContent(props: { workspaceId: string | undefined; onClose: () => void }) {
-  const routes = useRoutes();
-  const workspacePromise = useWorkspacePromise(props.workspaceId);
-
-  const readonlyFiles = useMemo(
-    () =>
-      (workspacePromise.data?.files ?? [])
-        .sort((a, b) => a.relativePath.localeCompare(b.relativePath))
-        .filter((file) => !isEditable(file.relativePath)),
-    [workspacePromise.data?.files]
-  );
-
-  const editableFiles = useMemo(
-    () =>
-      (workspacePromise.data?.files ?? [])
-        .sort((a, b) => a.relativePath.localeCompare(b.relativePath))
-        .filter((file) => isEditable(file.relativePath)),
-    [workspacePromise.data?.files]
-  );
-
-  const [isNewFileDropdownMenuOpen, setNewFileDropdownMenuOpen] = useState(false);
-  const [alerts, alertsRef] = useController<AlertsController>();
-
-  return (
-    <DrawerPanelContent isResizable={true} minSize={"40%"} maxSize={"80%"}>
-      <PromiseStateWrapper
-        promise={workspacePromise}
-        pending={
-          <DrawerPanelBody>
-            <Bullseye>
-              <Spinner />
-            </Bullseye>
-          </DrawerPanelBody>
-        }
-        resolved={(workspace) => (
-          <>
-            <Alerts width={"100%"} ref={alertsRef} />
-            <DrawerHead>
-              <Flex>
-                <FlexItem>
-                  <TextContent>
-                    <Text
-                      component={TextVariants.h3}
-                    >{`Editable files in '${workspacePromise.data?.descriptor.name}'`}</Text>
-                  </TextContent>
-                </FlexItem>
-                <FlexItem>
-                  <Dropdown
-                    isPlain={true}
-                    position={"left"}
-                    isOpen={isNewFileDropdownMenuOpen}
-                    toggle={
-                      <DropdownToggle
-                        className={"kie-tools--masthead-hoverable"}
-                        toggleIndicator={null}
-                        onToggle={setNewFileDropdownMenuOpen}
-                      >
-                        <PlusIcon />
-                      </DropdownToggle>
-                    }
-                  >
-                    <NewFileDropdownMenu
-                      alerts={alerts}
-                      workspaceId={workspace.descriptor.workspaceId}
-                      destinationDirPath={""}
-                      onAddFile={async () => setNewFileDropdownMenuOpen(false)}
-                    />
-                  </Dropdown>
-                </FlexItem>
-              </Flex>
-              {(workspace.descriptor.origin.kind === WorkspaceKind.GITHUB_GIST ||
-                workspace.descriptor.origin.kind === WorkspaceKind.GIT) && (
-                <TextContent>
-                  <Text component={TextVariants.small}>
-                    <i>{workspace.descriptor.origin.url.toString()}</i>
-                  </Text>
-                </TextContent>
-              )}
-              <DrawerActions>
-                <DrawerCloseButton onClick={props.onClose} />
-              </DrawerActions>
-            </DrawerHead>
-            <DrawerPanelBody>
-              <DataList aria-label="models-data-list">
-                {editableFiles.map((file) => (
-                  <Link
-                    key={file.relativePath}
-                    to={routes.workspaceWithFilePath.path({
-                      workspaceId: workspace.descriptor.workspaceId ?? "",
-                      fileRelativePath: file.relativePathWithoutExtension,
-                      extension: file.extension,
-                    })}
-                  >
-                    <FileDataListItem file={file} />
-                  </Link>
-                ))}
-              </DataList>
-              <br />
-              {readonlyFiles.length > 0 && (
-                <ExpandableSection
-                  toggleTextCollapsed="View readonly files"
-                  toggleTextExpanded="Hide readonly files"
-                  className={"plain"}
-                >
-                  <DataList aria-label="readonly-files-data-list">
-                    {readonlyFiles.map((file) => (
-                      <Link
-                        key={file.relativePath}
-                        to={routes.workspaceWithFilePath.path({
-                          workspaceId: workspace.descriptor.workspaceId ?? "",
-                          fileRelativePath: file.relativePathWithoutExtension,
-                          extension: file.extension,
-                        })}
-                      >
-                        <FileDataListItem key={file.relativePath} file={file} />
-                      </Link>
-                    ))}
-                  </DataList>
-                </ExpandableSection>
-              )}
-            </DrawerPanelBody>
-          </>
-        )}
-      />
-    </DrawerPanelContent>
-  );
-}
-
-export function WorkspaceLoadingCard() {
-  return (
-    <Card>
-      <CardBody>
-        <Skeleton fontSize={"sm"} width={"40%"} />
-        <br />
-        <Skeleton fontSize={"sm"} width={"70%"} />
-      </CardBody>
-    </Card>
-  );
-}
-
-export function WorkspaceCardError(props: { workspace: WorkspaceDescriptor }) {
-  const workspaces = useWorkspaces();
-  return (
-    <Card isSelected={false} isSelectable={true} isHoverable={true} isCompact={true}>
-      <CardHeader>
-        <CardHeaderMain>
-          <Flex>
-            <FlexItem>
-              <CardTitle>
-                <TextContent>
-                  <Text component={TextVariants.h3}>
-                    <ExclamationTriangleIcon />
-                    &nbsp;&nbsp;
-                    {`There was an error obtaining information for '${props.workspace.workspaceId}'`}
-                  </Text>
-                </TextContent>
-              </CardTitle>
-            </FlexItem>
-          </Flex>
-        </CardHeaderMain>
-        <CardActions>
-          <DeleteDropdownWithConfirmation
-            onDelete={() => {
-              workspaces.deleteWorkspace({ workspaceId: props.workspace.workspaceId });
-            }}
-            item={
-              <>
-                Delete <b>{`"${props.workspace.name}"`}</b>
-              </>
-            }
-          />
-        </CardActions>
-      </CardHeader>
-    </Card>
-  );
-}
-
-export function WorkspaceCard(props: { workspaceId: string; isSelected: boolean; onSelect: () => void }) {
-  const routes = useRoutes();
-  const history = useHistory();
-  const workspaces = useWorkspaces();
-  const [isHovered, setHovered] = useState(false);
-  const workspacePromise = useWorkspacePromise(props.workspaceId);
-
-  const { editableFiles, readonlyFiles } = useMemo(
-    () => splitFiles(workspacePromise.data?.files ?? []),
-    [workspacePromise.data?.files]
-  );
-
-  const workspaceName = useMemo(() => {
-    return workspacePromise.data ? workspacePromise.data.descriptor.name : null;
-  }, [workspacePromise.data]);
-
-  return (
-    <PromiseStateWrapper
-      promise={workspacePromise}
-      pending={<WorkspaceLoadingCard />}
-      rejected={() => <>ERROR</>}
-      resolved={(workspace) => (
-        <>
-          {(editableFiles.length === 1 &&
-            readonlyFiles.length === 0 &&
-            workspace.descriptor.origin.kind === WorkspaceKind.LOCAL && (
-              <Card
-                isSelected={props.isSelected}
-                isSelectable={true}
-                onMouseOver={() => setHovered(true)}
-                onMouseLeave={() => setHovered(false)}
-                isHoverable={true}
-                isCompact={true}
-                style={{ cursor: "pointer" }}
-                onClick={() => {
-                  history.push({
-                    pathname: routes.workspaceWithFilePath.path({
-                      workspaceId: editableFiles[0].workspaceId,
-                      fileRelativePath: editableFiles[0].relativePathWithoutExtension,
-                      extension: editableFiles[0].extension,
-                    }),
-                  });
-                }}
-              >
-                <CardHeader>
-                  <Link
-                    to={routes.workspaceWithFilePath.path({
-                      workspaceId: editableFiles[0].workspaceId,
-                      fileRelativePath: editableFiles[0].relativePathWithoutExtension,
-                      extension: editableFiles[0].extension,
-                    })}
-                  >
-                    <CardHeaderMain style={{ width: "100%" }}>
-                      <Flex>
-                        <FlexItem>
-                          <CardTitle>
-                            <TextContent>
-                              <Text
-                                component={TextVariants.h3}
-                                style={{ textOverflow: "ellipsis", overflow: "hidden" }}
-                              >
-                                <TaskIcon />
-                                &nbsp;&nbsp;
-                                {editableFiles[0].nameWithoutExtension}
-                              </Text>
-                            </TextContent>
-                          </CardTitle>
-                        </FlexItem>
-                        <FlexItem>
-                          <b>
-                            <FileLabel extension={editableFiles[0].extension} />
-                          </b>
-                        </FlexItem>
-                      </Flex>
-                    </CardHeaderMain>
-                  </Link>
-                  <CardActions>
-                    {isHovered && (
-                      <DeleteDropdownWithConfirmation
-                        onDelete={() => {
-                          workspaces.deleteWorkspace({ workspaceId: props.workspaceId });
-                        }}
-                        item={
-                          <Flex flexWrap={{ default: "nowrap" }}>
-                            <FlexItem>
-                              Delete <b>{`"${editableFiles[0].nameWithoutExtension}"`}</b>
-                            </FlexItem>
-                            <FlexItem>
-                              <b>
-                                <FileLabel extension={editableFiles[0].extension} />
-                              </b>
-                            </FlexItem>
-                          </Flex>
-                        }
-                      />
-                    )}
-                  </CardActions>
-                </CardHeader>
-                <CardBody>
-                  <TextContent>
-                    <Text component={TextVariants.p}>
-                      <b>{`Created: `}</b>
-                      <RelativeDate date={new Date(workspacePromise.data?.descriptor.createdDateISO ?? "")} />
-                      <b>{`, Last updated: `}</b>
-                      <RelativeDate date={new Date(workspacePromise.data?.descriptor.lastUpdatedDateISO ?? "")} />
-                    </Text>
-                  </TextContent>
-                </CardBody>
-              </Card>
-            )) || (
-            <Card
-              isSelected={props.isSelected}
-              isSelectable={true}
-              onMouseOver={() => setHovered(true)}
-              onMouseLeave={() => setHovered(false)}
-              isHoverable={true}
-              isCompact={true}
-              style={{ cursor: "pointer" }}
-              onClick={props.onSelect}
-            >
-              <CardHeader>
-                <CardHeaderMain style={{ width: "100%" }}>
-                  <Flex>
-                    <FlexItem>
-                      <CardTitle>
-                        <TextContent>
-                          <Text component={TextVariants.h3} style={{ textOverflow: "ellipsis", overflow: "hidden" }}>
-                            <FolderIcon />
-                            &nbsp;&nbsp;
-                            {workspaceName}
-                            &nbsp;&nbsp;
-                            <WorkspaceLabel descriptor={workspacePromise.data?.descriptor} />
-                          </Text>
-                        </TextContent>
-                      </CardTitle>
-                    </FlexItem>
-                    <FlexItem>
-                      <Text component={TextVariants.p}>
-                        {`${editableFiles?.length} editable files(s) in ${workspace.files.length} file(s)`}
-                      </Text>
-                    </FlexItem>
-                  </Flex>
-                </CardHeaderMain>
-
-                <CardActions>
-                  {isHovered && (
-                    <DeleteDropdownWithConfirmation
-                      onDelete={() => {
-                        workspaces.deleteWorkspace({ workspaceId: props.workspaceId });
-                      }}
-                      item={
-                        <>
-                          Delete <b>{`"${workspacePromise.data?.descriptor.name}"`}</b>
-                        </>
-                      }
-                    />
-                  )}
-                </CardActions>
-              </CardHeader>
-              <CardBody>
-                <TextContent>
-                  <Text component={TextVariants.p}>
-                    <b>{`Created: `}</b>
-                    <RelativeDate date={new Date(workspacePromise.data?.descriptor.createdDateISO ?? "")} />
-                    <b>{`, Last updated: `}</b>
-                    <RelativeDate date={new Date(workspacePromise.data?.descriptor.lastUpdatedDateISO ?? "")} />
-                  </Text>
-                </TextContent>
-              </CardBody>
-            </Card>
-          )}
-        </>
-      )}
-    />
-  );
-}
-
-export function FileDataListItem(props: { file: WorkspaceFile }) {
-  return (
-    <DataListItem>
-      <DataListItemRow>
-        <DataListItemCells
-          dataListCells={[
-            <DataListCell key="link" isFilled={false}>
-              <Flex flexWrap={{ default: "nowrap" }}>
-                <FlexItem>{props.file.nameWithoutExtension}</FlexItem>
-                <FlexItem>
-                  <FileLabel extension={props.file.extension} />
-                </FlexItem>
-              </Flex>
-              <TextContent>
-                <Text component={TextVariants.small}>{props.file.relativeDirPath.split("/").join(" > ")}</Text>
-              </TextContent>
-            </DataListCell>,
-          ]}
-        />
-      </DataListItemRow>
-    </DataListItem>
-  );
-}
diff --git a/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx b/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx
index 6e3bdb8945..209a55f0d7 100644
--- a/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx
@@ -18,6 +18,7 @@ import * as React from "react";
 import { Nav, NavItem, NavList } from "@patternfly/react-core/dist/js/components/Nav";
 import { Link } from "react-router-dom";
 import { ExternalLinkAltIcon } from "@patternfly/react-icons/dist/js/icons";
+import { routes } from "../../navigation/Routes";
 
 export function HomePageNav(props: { pathname: string }) {
   return (
@@ -25,25 +26,23 @@ export function HomePageNav(props: { pathname: string }) {
       <div className="chr-c-app-title">Serverless Logic Web Tools</div>
       <Nav aria-label="Global NAV" theme="dark">
         <NavList>
-          <NavItem itemId={0} key={"Overview-nav"} isActive={props.pathname === "/"}>
-            <Link to="/">Overview</Link>
+          <NavItem itemId={0} key={"Overview-nav"} isActive={props.pathname === routes.home.path({})}>
+            <Link to={routes.home.path({})}>Overview</Link>
           </NavItem>
 
-          <NavItem itemId={1} key={"Serverless-models-nav"} isActive={props.pathname === "/ServerlessModels"}>
-            <Link to="/ServerlessModels">Serverless Models</Link>
+          <NavItem itemId={1} key={"Recent-models-nav"} isActive={props.pathname === routes.recentModels.path({})}>
+            <Link to={routes.recentModels.path({})}>Recent Models</Link>
           </NavItem>
 
-          <NavItem itemId={2} key={"SampleCatalog-nav"} isActive={props.pathname === "/SampleCatalog"}>
-            <Link to="/SampleCatalog">Sample Catalog</Link>
+          <NavItem itemId={2} key={"SampleCatalog-nav"} isActive={props.pathname === routes.sampleCatalog.path({})}>
+            <Link to={routes.sampleCatalog.path({})}>Sample Catalog</Link>
           </NavItem>
 
-          <NavItem
-            itemId={3}
-            key={"Documentation-nav"}
-            className="chr-c-navigation__additional-links"
-            isActive={props.pathname === "/Documentation"}
-          >
-            <a href="https://kiegroup.github.io/kogito-docs/serverlessworkflow/latest/index.html" target="_blank">
+          <NavItem itemId={3} key={"Documentation-nav"} className="chr-c-navigation__additional-links">
+            <a
+              href="https://kiegroup.github.io/kogito-docs/serverlessworkflow/latest/tooling/serverless-logic-web-tools/serverless-logic-web-tools-overview.html"
+              target="_blank"
+            >
               Documentation
               <ExternalLinkAltIcon />
             </a>
diff --git a/packages/serverless-logic-web-tools/src/navigation/Routes.ts b/packages/serverless-logic-web-tools/src/navigation/Routes.ts
index b62375e791..b821ee0a80 100644
--- a/packages/serverless-logic-web-tools/src/navigation/Routes.ts
+++ b/packages/serverless-logic-web-tools/src/navigation/Routes.ts
@@ -129,6 +129,9 @@ export const routes = {
       `/${workspaceId}/file/${fileRelativePath}${extension ? "." + extension : ""}`
   ),
 
+  recentModels: new Route<{}>(() => `/RecentModels`),
+  sampleCatalog: new Route<{}>(() => `/SampleCatalog`),
+
   settings: {
     home: new Route<{}>(() => SETTINGS_ROUTE),
     github: new Route<{}>(() => `${SETTINGS_ROUTE}/github`),
diff --git a/packages/serverless-logic-web-tools/src/table/Table.css b/packages/serverless-logic-web-tools/src/table/Table.css
new file mode 100644
index 0000000000..bf887a88c0
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/table/Table.css
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.pf-c-question-circle-icon {
+  color: var(--pf-global--palette--black-600);
+  margin-left: var(--pf-global--spacer--sm);
+  cursor: pointer;
+}
diff --git a/packages/serverless-logic-web-tools/src/table/TablePagination.tsx b/packages/serverless-logic-web-tools/src/table/TablePagination.tsx
new file mode 100644
index 0000000000..d438703838
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/table/TablePagination.tsx
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import * as React from "react";
+import { OnPerPageSelect, Pagination, PaginationProps } from "@patternfly/react-core/dist/js/components/Pagination";
+import "@patternfly/react-core/dist/styles/base.css";
+import { useCallback } from "react";
+
+export type TablePaginationProps = Pick<PaginationProps, "variant" | "isCompact" | "perPageOptions"> & {
+  itemCount: number;
+  page: number;
+  perPage: number;
+  setPage: (newPage: number) => void;
+  setPerPage: (newPerPage: number) => void;
+};
+
+export function TablePagination(props: TablePaginationProps) {
+  const { isCompact, itemCount, page, perPage, perPageOptions, setPage, setPerPage, variant } = props;
+
+  const onPerPageSelect: OnPerPageSelect = useCallback(
+    (_e, v) => {
+      // When changing the number of results per page, keep the start row approximately the same
+      const firstRow = (page - 1) * perPage;
+      setPage(Math.floor(firstRow / v) + 1);
+      setPerPage(v);
+    },
+    [page, perPage, setPage, setPerPage]
+  );
+
+  return (
+    <Pagination
+      isCompact={isCompact}
+      itemCount={itemCount}
+      onPerPageSelect={onPerPageSelect}
+      onSetPage={(_e, v) => setPage(v)}
+      page={page}
+      perPage={perPage}
+      perPageOptions={perPageOptions}
+      variant={variant}
+    />
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/table/TableToolbar.tsx b/packages/serverless-logic-web-tools/src/table/TableToolbar.tsx
new file mode 100644
index 0000000000..84286b5f64
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/table/TableToolbar.tsx
@@ -0,0 +1,161 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import {
+  Dropdown,
+  DropdownItem,
+  DropdownToggle,
+  DropdownToggleCheckbox,
+  KebabToggle,
+} from "@patternfly/react-core/dist/js/components/Dropdown";
+import { SearchInput } from "@patternfly/react-core/dist/js/components/SearchInput";
+import { Toolbar, ToolbarContent, ToolbarItem } from "@patternfly/react-core/dist/js/components/Toolbar";
+import "@patternfly/react-core/dist/styles/base.css";
+import * as React from "react";
+import { useCallback, useMemo, useState } from "react";
+import { TablePagination, TablePaginationProps } from "./TablePagination";
+
+export type TableToolbarProps = TablePaginationProps & {
+  onDeleteActionButtonClick: () => void;
+  onToggleAllElements: (checked: boolean) => void;
+  searchValue: string;
+  selectedElementsCount: number;
+  setSearchValue: React.Dispatch<React.SetStateAction<string>>;
+};
+
+export function TableToolbar(props: TableToolbarProps) {
+  const {
+    itemCount: itemCount,
+    onDeleteActionButtonClick: onDeleteActionButtonClick,
+    selectedElementsCount,
+    searchValue,
+    setSearchValue,
+    onToggleAllElements,
+    page,
+    perPage,
+    perPageOptions,
+    setPage,
+    setPerPage,
+  } = props;
+  const [isBulkDropDownOpen, setIsBulkDropDownOpen] = useState(false);
+  const [isActionDropdownOpen, setIsActionDropdownOpen] = React.useState(false);
+
+  const isBulkCheckBoxChecked = useMemo(
+    () => (itemCount === selectedElementsCount ? true : selectedElementsCount === 0 ? false : null),
+    [itemCount, selectedElementsCount]
+  );
+
+  const onBulkDropDownSelect = useCallback(() => setIsBulkDropDownOpen(false), []);
+
+  const onBulkDropDownToggle = useCallback((isOpen: boolean) => setIsBulkDropDownOpen(isOpen), []);
+
+  const onActionDropdownToggle = useCallback(() => {
+    setIsActionDropdownOpen(!isActionDropdownOpen);
+  }, [isActionDropdownOpen]);
+
+  const actionDropdownItems = useMemo(() => {
+    return [
+      <DropdownItem
+        key={"delete-dropdown-item"}
+        isDisabled={!selectedElementsCount}
+        onClick={onDeleteActionButtonClick}
+        ouiaId={"delete-action-button"}
+        aria-label="Open confirm delete modal"
+      >
+        Delete
+      </DropdownItem>,
+    ];
+  }, [selectedElementsCount, onDeleteActionButtonClick]);
+
+  const bulkDropDownItems = useMemo(
+    () => [
+      <DropdownItem onClick={() => onToggleAllElements(false)} key="none" aria-label="Select none">
+        Select none (0)
+      </DropdownItem>,
+      <DropdownItem onClick={() => onToggleAllElements(true)} key="all" aria-label="Select All">
+        Select all({itemCount})
+      </DropdownItem>,
+    ],
+    [itemCount, onToggleAllElements]
+  );
+
+  const onSearchChange = useCallback(
+    (value: string) => {
+      setSearchValue(value);
+    },
+    [setSearchValue]
+  );
+
+  return (
+    <Toolbar>
+      <ToolbarContent style={{ paddingLeft: "10px", paddingRight: "10px" }}>
+        <ToolbarItem alignment={{ default: "alignLeft" }}>
+          <Dropdown
+            onSelect={onBulkDropDownSelect}
+            toggle={
+              <DropdownToggle
+                splitButtonItems={[
+                  <DropdownToggleCheckbox
+                    onChange={(checked) => onToggleAllElements(checked)}
+                    isChecked={isBulkCheckBoxChecked}
+                    id="split-button-text-checkbox"
+                    key="bulk-check-box"
+                    aria-label="Select all"
+                  >
+                    {selectedElementsCount ? `${selectedElementsCount} selected` : ""}
+                  </DropdownToggleCheckbox>,
+                ]}
+                onToggle={onBulkDropDownToggle}
+                id="toggle-split-button-text"
+              />
+            }
+            isOpen={isBulkDropDownOpen}
+            dropdownItems={bulkDropDownItems}
+            aria-label="Bulk selection dropdown"
+          />
+        </ToolbarItem>
+        <ToolbarItem variant="search-filter">
+          <SearchInput
+            placeholder="Filter by name"
+            value={searchValue}
+            onChange={(_event, value) => onSearchChange(value)}
+            onClear={() => onSearchChange("")}
+          />
+        </ToolbarItem>
+        <ToolbarItem>
+          <Dropdown
+            onSelect={onActionDropdownToggle}
+            toggle={<KebabToggle id="toggle-kebab" onToggle={onActionDropdownToggle} />}
+            isOpen={isActionDropdownOpen}
+            isPlain
+            dropdownItems={actionDropdownItems}
+          />
+        </ToolbarItem>
+        <ToolbarItem variant="pagination">
+          <TablePagination
+            itemCount={itemCount}
+            page={page}
+            perPage={perPage}
+            perPageOptions={perPageOptions}
+            setPage={setPage}
+            setPerPage={setPerPage}
+            variant="top"
+            isCompact
+          />
+        </ToolbarItem>
+      </ToolbarContent>
+    </Toolbar>
+  );
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 45c346fa5c..f2678e932e 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -5442,6 +5442,9 @@ importers:
       "@patternfly/react-icons":
         specifier: ^4.93.6
         version: 4.93.6(react-dom@17.0.2)(react@17.0.2)
+      "@patternfly/react-table":
+        specifier: ^4.112.39
+        version: 4.112.39(react-dom@17.0.2)(react@17.0.2)
       "@patternfly/react-tokens":
         specifier: ^4.94.6
         version: 4.94.6
@@ -5457,9 +5460,6 @@ importers:
       buffer:
         specifier: ^6.0.3
         version: 6.0.3
-      dexie:
-        specifier: ^3.2.2
-        version: 3.2.2
       history:
         specifier: ^4.9.0
         version: 4.10.1


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 17/27: Merge remote-tracking branch 'upstream/main' into KOGITO-8015-feature-preview

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit e54a2a18cd4ec0c9c47544434b63cf93ccbcb024
Merge: 1ec2244016 e1cf6a8573
Author: fantonangeli <fa...@gmail.com>
AuthorDate: Fri May 5 15:07:25 2023 +0200

    Merge remote-tracking branch 'upstream/main' into KOGITO-8015-feature-preview

 .ci/jenkins/Jenkinsfile.vscode                     |   66 +-
 .github/workflows/daily_dev_publish.yml            |   18 +-
 .github/workflows/release_build.yml                |   47 +-
 .github/workflows/staging_build.yml                |   43 +-
 .gitignore                                         |    7 +-
 README.md                                          |    8 +-
 .../base64png-editor-vscode-extension/package.json |    2 +-
 examples/base64png-editor/package.json             |    1 -
 examples/base64png-editor/src/Base64PngEditor.tsx  |    2 -
 .../src/Base64PngEditorInterface.tsx               |   10 -
 .../todo-list-view-vscode-extension/package.json   |    2 +-
 packages/backend-extended-services/index.js        |   33 -
 .../kogito-extended-services-quarkus/pom.xml       |   71 -
 .../main/resources/META-INF/resources/index.html   |   24 -
 .../src/main/resources/application.properties      |    2 -
 packages/backend-extended-services/package.json    |   40 -
 packages/backend-extended-services/pom.xml         |  220 -
 packages/backend/src/vscode/commands/index.ts      |   17 -
 .../src/vscode/commands/runTestScenarioCommand.ts  |  103 -
 packages/backend/src/vscode/index.ts               |    1 -
 packages/boxed-expression-component/package.json   |    2 +-
 .../.vscode/launch.json                            |    0
 .../.vscode/settings.json                          |    0
 .../.vscode/tasks.json                             |    0
 .../CHANGELOG.md                                   |   11 +
 .../LICENSE                                        |    0
 .../README.md                                      |    0
 .../env/index.js                                   |    0
 .../gifs/bpmn.gif                                  |  Bin
 .../icon.png                                       |  Bin
 .../package.json                                   |   10 +-
 .../src/extension/extension.ts                     |    2 +-
 .../src/webview/BpmnEditorEnvelopeApp.ts           |    0
 .../static/svg-icon-dark.png                       |  Bin
 .../static/svg-icon-light.png                      |  Bin
 .../tsconfig.json                                  |    0
 .../webpack.config.js                              |    0
 packages/dashbuilder-editor/package.json           |    1 -
 .../src/editor/DashbuilderEditor.tsx               |    8 +-
 .../src/editor/DashbuilderEditorView.tsx           |    5 -
 .../src/impl/DashbuilderEditorChannelApiImpl.ts    |    8 +-
 .../src/monaco/augmentation/commands/index.ts      |    4 +-
 packages/dashbuilder-language-service/package.json |    2 +
 .../api/DashbuilderLanguageServiceChannelApi.ts    |   29 +-
 .../src/channel/DashbuilderLanguageService.ts      |  274 +-
 .../DashbuilderLanguageServiceCodeCompletion.ts    |   53 +-
 .../DashbuilderLanguageServiceCodeLenses.ts        |   39 +-
 .../src/channel/DashbuilderYamlLanguageService.ts  |  125 +
 .../src/channel/index.ts                           |    1 +
 .../src/channel/types.ts                           |   33 +-
 ...t.ts => DashbuilderYamlLanguageService.test.ts} |   13 +-
 ...=> DashbuilderYamlLanguageService.test.ts.snap} |    0
 .../tests/testUtils.ts                             |    4 +-
 packages/dashbuilder-viewer/package.json           |    1 -
 .../src/envelope/DashbuilderViewerView.tsx         |    5 -
 .../client/editor/DisplayerDragComponent.java      |   19 +-
 .../external/ExternalDataSetClientProvider.java    |    9 +-
 .../client/external/SupportedMimeType.java         |   23 +-
 .../client/external/csv/CSVColumnsFunction.java    |   48 +
 .../client/external/{ => csv}/CSVParser.java       |    6 +-
 .../external/metrics/MetricsColumnsFunction.java   |   39 +
 .../external/{ => metrics}/MetricsParser.java      |    2 +-
 .../services/RuntimeDataSetClientServices.java     |  162 +-
 .../client/widgets/view/SampleCardView.java        |    2 +-
 .../external/csv/CSVColumnsFunctionTest.java       |   61 +
 .../client/external/{ => csv}/CSVParserTest.java   |    4 +-
 .../external/{ => metrics}/MetricsParserTest.java  |    2 +-
 .../marshalling/LayoutTemplateJSONMarshaller.java  |    4 +-
 .../dashbuilder/displayer/DisplayerSettings.java   |   10 +
 .../.vscode/launch.json                            |    0
 .../.vscode/settings.json                          |    0
 .../.vscode/tasks.json                             |    0
 .../CHANGELOG.md                                   |   12 +
 .../{guided-tour => dmn-vscode-extension}/LICENSE  |    0
 .../README.md                                      |    0
 .../env/index.js                                   |    0
 .../gifs/dmn.gif                                   |  Bin
 .../gifs/scesim.gif                                |  Bin
 .../icon.png                                       |  Bin
 .../package.json                                   |   10 +-
 .../src/extension/extension.ts                     |    2 +-
 .../src/webview/DmnEditorEnvelopeApp.ts            |    0
 .../src/webview/SceSimEditorEnvelopeApp.ts         |    0
 .../static/svg-icon-dark.png                       |  Bin
 .../static/svg-icon-light.png                      |  Bin
 .../tsconfig.json                                  |    0
 .../webpack.config.js                              |    0
 packages/editor/package.json                       |    1 -
 packages/editor/src/api/Editor.ts                  |    2 -
 packages/editor/src/api/KogitoEditorChannelApi.ts  |    4 +-
 packages/editor/src/api/KogitoEditorEnvelopeApi.ts |    3 +-
 .../src/embedded/embedded/EmbeddedEditor.tsx       |   11 +-
 .../embedded/EmbeddedEditorChannelApiImpl.ts       |   10 -
 .../src/envelope/KogitoEditorEnvelopeApiImpl.ts    |    5 -
 .../tests/embedded/stateControl/Hooks.test.ts      |    1 -
 packages/editor/tests/envelope/DummyEditor.tsx     |    5 -
 packages/extended-services-api/src/jsonSchema.ts   |    1 +
 packages/guided-tour/package.json                  |   49 -
 .../guided-tour/src/api/GuidedTourChannelApi.ts    |   23 -
 .../guided-tour/src/api/GuidedTourEnvelopeApi.ts   |   21 -
 packages/guided-tour/src/api/Mode.ts               |   38 -
 packages/guided-tour/src/api/Rect.ts               |   37 -
 packages/guided-tour/src/api/Step.ts               |   36 -
 packages/guided-tour/src/api/Tutorial.ts           |   21 -
 packages/guided-tour/src/api/UserInteraction.ts    |   19 -
 packages/guided-tour/src/api/index.ts              |   23 -
 packages/guided-tour/src/channel/Hooks.ts          |   34 -
 packages/guided-tour/src/components/Colors.sass    |   18 -
 packages/guided-tour/src/components/Dialog.sass    |   55 -
 packages/guided-tour/src/components/Dialog.tsx     |  141 -
 packages/guided-tour/src/components/GuidedTour.tsx |   64 -
 .../guided-tour/src/components/HighlightLayer.sass |   25 -
 .../guided-tour/src/components/HighlightLayer.tsx  |   73 -
 .../src/components/NavigationControls.sass         |   52 -
 .../src/components/NavigationControls.tsx          |   76 -
 .../src/components/utils/GuidedTourBusListeners.ts |   52 -
 .../src/components/utils/GuidedTourContent.tsx     |  139 -
 .../components/utils/GuidedTourSelectorHandler.ts  |   58 -
 .../src/components/utils/GuidedTourStepsHelper.ts  |   46 -
 .../components/utils/GuidedTourUserInteractions.ts |   92 -
 .../src/components/utils/PositionCalculator.ts     |   56 -
 packages/guided-tour/src/components/utils/index.ts |   22 -
 .../src/contexts/CurrentTutorialContext.ts         |   38 -
 packages/guided-tour/src/contexts/index.ts         |   17 -
 .../guided-tour/src/core/GuidedTourDomUtils.ts     |   49 -
 .../guided-tour/src/core/GuidedTourEventBus.ts     |   66 -
 packages/guided-tour/src/core/index.ts             |   18 -
 packages/guided-tour/src/i18n/GuidedTourI18n.ts    |   30 -
 packages/guided-tour/src/i18n/index.ts             |   18 -
 packages/guided-tour/src/i18n/locales/en.ts        |   28 -
 packages/guided-tour/src/i18n/locales/index.ts     |   17 -
 packages/guided-tour/src/i18n/setup.ts             |   30 -
 packages/guided-tour/src/index.tsx                 |  133 -
 packages/guided-tour/tests/__mocks__/styleMock.js  |    1 -
 .../guided-tour/tests/components/Dialog.test.tsx   |  209 -
 .../tests/components/GuidedTour.test.tsx           |   27 -
 .../tests/components/HighlightLayer.test.tsx       |   97 -
 .../tests/components/NavigationControls.test.tsx   |  123 -
 .../components/__snapshots__/Dialog.test.tsx.snap  |  776 ---
 .../__snapshots__/GuidedTour.test.tsx.snap         |   66 -
 .../__snapshots__/HighlightLayer.test.tsx.snap     |   75 -
 .../__snapshots__/NavigationControls.test.tsx.snap |  426 --
 .../utils/GuidedTourBusListeners.test.ts           |   74 -
 .../utils/GuidedTourSelectorHandler.test.ts        |  104 -
 .../components/utils/GuidedTourStepsHelper.test.ts |   59 -
 .../utils/GuidedTourUserInteractions.test.ts       |  142 -
 .../components/utils/PositionCalculator.test.ts    |   73 -
 .../tests/core/GuidedTourDomUtils.test.ts          |   55 -
 .../tests/core/GuidedTourEventBus.test.ts          |  137 -
 .../__snapshots__/GuidedTourDomUtils.test.ts.snap  |   14 -
 packages/guided-tour/tests/index.test.tsx          |  140 -
 packages/guided-tour/tests/test_context.tsx        |   76 -
 packages/guided-tour/tests/utils.ts                |   67 -
 .../LICENSE                                        |    0
 packages/json-yaml-language-service/README.md      |   17 +
 .../env/index.js                                   |    2 +-
 .../jest.config.js                                 |    5 +-
 .../package.json                                   |    4 +-
 .../src/api/EditorLanguageServiceChannelApi.ts     |   34 +
 .../src/api/index.ts                               |   26 +-
 .../src/channel/EditorJsonLanguageService.ts}      |  131 +-
 .../src/channel/EditorLanguageService.ts           |  202 +
 .../channel/EditorLanguageServiceCodeCompletion.ts |   84 +
 .../src/channel/EditorLanguageServiceCodeLenses.ts |  141 +
 .../src/channel/EditorYamlLanguageService.ts}      |  110 +-
 .../src/channel/findNodesAtLocation.ts             |   10 +-
 .../src/channel/getLineContentFromOffset.ts        |    2 +-
 .../src/channel/getNodeFormat.ts                   |    4 +-
 .../src/channel/indentText.ts                      |    0
 .../src/channel/index.ts                           |   20 +-
 .../src/channel/matchNodeWithLocation.ts           |   10 +-
 .../src/channel/nodeUpUntilType.ts                 |    7 +-
 .../src/channel/refValidation.ts                   |   28 +-
 .../src/channel/types.ts                           |  116 +
 .../tests/EditorJsonLanguageService.test.ts        |  628 +++
 .../tests/EditorYamlLanguageService.test.ts        |  677 +++
 .../EditorJsonLanguageService.test.ts.snap         |  537 ++
 .../EditorYamlLanguageService.test.ts.snap         | 5362 ++++++++++++++++++++
 .../tests/findNodesAtLocation.test.ts              |  125 +-
 .../tests/getFileLanguage.test.ts                  |   52 +
 .../tests/getLineContentFromOffset.test.ts         |    2 +-
 .../tests/getNodeFormat.test.ts                    |   63 +-
 .../tests/indentText.test.ts                       |    0
 .../tests/matchNodeWithLocation.test.ts            |  114 +-
 .../tests/nodeUpUntilType.test.ts                  |   27 +-
 .../tests/refValidations.test.ts                   |  155 +
 .../testLanguageService/TestJsonLanguageService.ts |  114 +
 .../testLanguageService/TestLanguageService.ts     |  160 +
 .../TestLanguageServiceCodeLenses.ts               |   42 +
 .../testLanguageService/TestYamlLanguageService.ts |  115 +
 .../tests/testLanguageService}/index.ts            |   11 +-
 .../testLanguageService/testRefValidationMap.ts    |   57 +
 .../tests/testLanguageService/workflow.ts          | 2398 +++++++++
 .../tests/testUtils.ts                             |   32 +-
 .../tsconfig.json                                  |    3 +-
 packages/kie-bc-editors/package.json               |    1 -
 .../kie-bc-editors/src/common/GwtEditorWrapper.tsx |    6 +-
 .../src/common/GwtEditorWrapperFactory.ts          |   14 -
 .../GwtAppFormerConsumedInteropApi.ts              |   13 -
 .../GuidedTourExposedInteropApi.ts                 |   28 -
 .../src/common/exposedInteropApi/index.ts          |    1 -
 packages/kie-bc-editors/tests/DummyEditor.tsx      |    5 -
 .../.mocharc.json                                  |    0
 .../.vscode/launch.json                            |    0
 .../.vscode/settings.json                          |    0
 .../.vscode/tasks.json                             |    0
 .../.vscodeignore                                  |    0
 .../LICENSE                                        |    0
 .../README.md                                      |    0
 .../env/index.js                                   |    0
 .../it-tests/extension-editors-bpmn.test.ts        |    0
 .../it-tests/extension-editors-dmn.test.ts         |    0
 .../it-tests/extension-editors-scesim.test.ts      |    0
 .../it-tests/extension-editors-smoke.test.ts       |    0
 .../it-tests/helpers/CommonAsserts.ts              |    0
 .../it-tests/helpers/CommonLocators.ts             |    0
 .../it-tests/helpers/PmmlEditorTestHelper.ts       |    0
 .../it-tests/helpers/ScesimEditorTestHelper.ts     |    0
 .../it-tests/helpers/VSCodeTestHelper.ts           |   16 +-
 .../it-tests/helpers/bpmn/BpmnEditorTestHelper.ts  |    0
 .../it-tests/helpers/bpmn/BpmnLocators.ts          |    0
 .../it-tests/helpers/bpmn/Correlation.ts           |    0
 .../helpers/bpmn/CorrelationModalHelper.ts         |    0
 .../helpers/bpmn/DataAssignmentsModalHelper.ts     |    0
 .../it-tests/helpers/bpmn/DataInputAssignment.ts   |    0
 .../it-tests/helpers/bpmn/DiagramExplorerHelper.ts |    0
 .../helpers/bpmn/ImplementationExecutionHelper.ts  |    0
 .../it-tests/helpers/bpmn/ProcessVariable.ts       |    0
 .../helpers/bpmn/ProcessVariablesWidgetHelper.ts   |    0
 .../it-tests/helpers/bpmn/PropertiesPanelHelper.ts |    0
 .../it-tests/helpers/dmn/BuiltInType.ts            |    0
 .../helpers/dmn/DecisionNavigatorHelper.ts         |    0
 .../it-tests/helpers/dmn/DmnEditorTestHelper.ts    |    0
 .../it-tests/helpers/dmn/EditorTabs.ts             |    0
 .../it-tests/helpers/dmn/ExpressionEditorHelper.ts |    0
 .../it-tests/helpers/dmn/ExpressionType.ts         |    0
 .../it-tests/helpers/dmn/PropertiesPanelHelper.ts  |    0
 .../resources/MultipleInstanceSubprocess.bpmn      |    0
 .../resources/ProcessWithCollaboration.bpmn        |    0
 .../it-tests/resources/ProcessWithGenerics.bpmn    |    0
 .../it-tests/resources/ReuseDataTypeTest.bpmn      |    0
 .../it-tests/resources/SaveAssetTest.bpmn          |    0
 .../it-tests/resources/UserTask.bpmn               |    0
 .../it-tests/resources/demo-dmn.scesim             |    0
 .../it-tests/resources/demo-expression.dmn         |    0
 .../it-tests/resources/demo.bpmn                   |    0
 .../it-tests/resources/demo.dmn                    |    0
 .../it-tests/resources/demo.pmml                   |    0
 .../it-tests/resources/demo.scesim                 |    0
 .../it-tests/resources/example.bpmn                |    0
 .../it-tests/resources/example.txt                 |    0
 .../it-tests/resources/global/default-global.wid   |    0
 .../it-tests/resources/reusable-model.dmn          |    0
 .../resources/src/main/java/org/kie/Log.wid        |    0
 .../src/main/java/org/kie/businessapp/Email.wid    |    0
 .../main/java/org/kie/businessapp/process-wid.bpmn |    0
 .../it-tests/settings.json                         |    0
 .../jest.config.js                                 |    0
 .../mocha-reporter-config.json                     |    2 +-
 .../package.json                                   |    6 +-
 .../src/extension/extension.ts                     |   15 +-
 .../src/webview/BpmnEditorEnvelopeApp.ts           |    0
 .../src/webview/DmnEditorEnvelopeApp.ts            |    0
 .../src/webview/PMMLEditorEnvelopeApp.ts           |    0
 .../src/webview/SceSimEditorEnvelopeApp.ts         |    0
 .../static/svg-icon-dark.png                       |  Bin
 .../static/svg-icon-light.png                      |  Bin
 .../tsconfig.it-tests.json                         |    0
 .../tsconfig.json                                  |    0
 .../webpack.config.js                              |    0
 packages/kie-editors-standalone/README.md          |    1 -
 packages/kie-editors-standalone/package.json       |    3 +-
 .../kie-editors-standalone/src/common/Editor.ts    |    1 -
 .../StandaloneEditorsEditorChannelApiImpl.ts       |    9 -
 packages/kn-plugin-workflow/env/index.js           |    2 +-
 packages/kn-plugin-workflow/pkg/command/create.go  |    2 +-
 .../kn-plugin-workflow/pkg/metadata/constants.go   |    2 +-
 .../it-tests/e2e/DMNDocumentation.cy.ts            |    3 -
 .../it-tests/e2e/DMNExpressionEditor.cy.ts         |   24 -
 .../online-editor/it-tests/e2e/DMNGuidedTour.cy.ts |   42 -
 .../online-editor/it-tests/e2e/DMNRunner.cy.ts     |    3 -
 packages/online-editor/it-tests/e2e/NewFile.cy.ts  |    3 -
 .../it-tests/e2e/OpenFromSource.cy.ts              |    3 -
 .../online-editor/it-tests/e2e/TrySample.cy.ts     |    3 -
 .../online-editor/it-tests/e2e/UploadFile.cy.ts    |    6 -
 packages/online-editor/package.json                |    3 +-
 .../src/dmnRunner/DmnRunnerContextProvider.tsx     |  207 +-
 .../src/dmnRunner/DmnRunnerDrawer.tsx              |   10 +-
 .../src/dmnRunner/DmnRunnerDrawerPanelContent.tsx  |  347 +-
 .../src/dmnRunner/DmnRunnerErrorBoundary.tsx       |   77 +
 .../online-editor/src/dmnRunner/DmnRunnerTable.tsx |   98 +-
 packages/online-editor/src/editor/EditorPage.tsx   |   48 +-
 .../src/editor/EditorPageDockContextProvider.tsx   |   18 +-
 .../src/editor/EditorPageDockDrawer.tsx            |    7 +-
 packages/online-editor/src/i18n/OnlineI18n.ts      |   41 +-
 packages/online-editor/src/i18n/locales/en.ts      |   54 +-
 .../online-editor/src/jsonSchema/dereference.ts    |   67 +
 .../online-editor/src/settings/SettingsContext.tsx |   32 +-
 .../src/tour/GuidedTourInitializer.tsx             |  145 -
 packages/online-editor/src/tour/index.ts           |   17 -
 packages/pmml-editor/package.json                  |    3 +-
 .../pmml-editor/src/editor/PMMLEditorInterface.tsx |    5 -
 .../.vscode/launch.json                            |    0
 .../.vscode/settings.json                          |    0
 .../.vscode/tasks.json                             |    0
 .../CHANGELOG.md                                   |    8 +
 .../LICENSE                                        |    0
 .../README.md                                      |    0
 .../env/index.js                                   |    0
 .../gifs/pmml.gif                                  |  Bin
 .../icon.png                                       |  Bin
 .../package.json                                   |   10 +-
 .../src/extension/extension.ts                     |    2 +-
 .../src/webview/PmmlEditorEnvelopeApp.ts           |    0
 .../tsconfig.json                                  |    0
 .../webpack.config.js                              |    0
 packages/serverless-logic-web-tools/package.json   |    2 +-
 .../Deploy/ConfirmOptions/SwfDeployOptions.tsx     |   26 +-
 .../src/editor/WebToolsEmbeddedEditor.tsx          |    4 +-
 .../DashbuilderLanguageServiceChannelApiImpl.ts    |    4 +-
 .../src/editor/channel/DashChannelComponent.tsx    |    4 +-
 .../strategies/DashboardSingleModelDeployment.ts   |    1 -
 .../strategies/DashboardWorkspaceDeployment.ts     |    1 -
 .../deploy/strategies/KogitoProjectDeployment.ts   |    1 -
 .../deploy/strategies/KogitoSwfModelDeployment.ts  |    1 -
 .../src/openshift/deploy/types.ts                  |   20 +-
 .../src/openshift/hooks/useDeploymentStrategy.ts   |   18 +-
 .../openshift/pipelines/KnativeBuilderPipeline.ts  |   48 -
 .../src/settings/SettingsContext.tsx               |   14 -
 .../src/settings/kafka/ApacheKafkaSettings.tsx     |  320 --
 .../src/settings/kafka/KafkaSettingsConfig.tsx     |   70 -
 .../package.json                                   |    1 -
 .../ServerlessWorkflowCombinedEditorView.tsx       |    5 -
 ...erverlessWorkflowDiagramEditorChannelApiImpl.ts |    9 -
 .../ServerlessWorkflowTextEditorChannelApiImpl.ts  |    9 -
 .../src/impl/SwfCombinedEditorChannelApiImpl.ts    |    9 -
 .../package.json                                   |    1 -
 .../client/guided/tour/GuidedTourBridge.java       |  101 -
 .../GuidedTourCustomSelectorPositionProvider.java  |  108 -
 .../client/guided/tour/GuidedTourObserver.java     |   51 -
 .../guided/tour/observers/GlobalHTMLObserver.java  |  117 -
 .../guided/tour/service/GuidedTourService.java     |   66 -
 .../tour/service/GuidedTourServiceEnvelope.java    |   45 -
 .../service/GuidedTourServiceNativeEnvelope.java   |   35 -
 .../tour/service/GuidedTourServiceProducer.java    |   45 -
 .../client/guided/tour/service/api/AutoMode.java   |   32 -
 .../client/guided/tour/service/api/BlockMode.java  |   36 -
 .../client/guided/tour/service/api/DemoMode.java   |   29 -
 .../client/guided/tour/service/api/Mode.java       |   27 -
 .../client/guided/tour/service/api/Rect.java       |   58 -
 .../client/guided/tour/service/api/Step.java       |   54 -
 .../guided/tour/service/api/SubTutorialMode.java   |   32 -
 .../client/guided/tour/service/api/Tutorial.java   |   36 -
 .../guided/tour/service/api/UserInteraction.java   |   35 -
 .../client/guided/tour/GuidedTourBridgeTest.java   |  137 -
 ...idedTourCustomSelectorPositionProviderTest.java |  107 -
 .../client/guided/tour/GuidedTourObserverTest.java |   65 -
 .../tour/observers/GlobalHTMLObserverTest.java     |  130 -
 .../service/GuidedTourServiceEnvelopeTest.java     |   74 -
 .../service/GuidedTourServiceProducerTest.java     |   71 -
 .../items/tooltip/PrimitiveTextTooltip.java        |   29 +-
 .../client/core/shape/wires/WiresManager.java      |    6 +-
 .../items/tooltip/PrimitiveTextTooltipTest.java    |   19 +-
 .../client/core/shape/wires/WiresShapeTest.java    |    6 +-
 .../stunner/sw/resources/i18n/SWConstants.java     |   15 +
 .../sw/resources/i18n/SWConstants.properties       |   10 +-
 .../shapes/HasConditionsAndHasDataFilter.java      |   65 +
 .../client/shapes/ServerlessWorkflowShapeView.java |    3 -
 .../stunner/sw/client/shapes/StateShapeView.java   |    3 -
 .../stunner/sw/client/shapes/SwitchStateShape.java |   14 +-
 .../sw/client/shapes/icons/BottomDepiction.java    |    2 -
 .../stunner/sw/client/shapes/icons/BottomText.java |   15 -
 .../stunner/sw/client/shapes/icons/CornerIcon.java |   21 +-
 .../stunner/sw/client/shapes/icons/IconPath.java   |    1 +
 .../shapes/HasConditionsAndHasDataFilterTest.java  |  156 +
 .../package.json                                   |    1 +
 .../src/api/SwfLanguageServiceChannelApi.ts        |   33 +-
 .../src/api/SwfOffsetsApi.ts                       |  133 -
 .../src/api/index.ts                               |   20 +-
 .../assets/code-completions/states-completions.ts  |    2 +-
 .../code-completions/workflow-completions.ts       |    2 +-
 .../src/channel/SwfJsonLanguageService.ts          |  132 +-
 .../src/channel/SwfLanguageService.ts              |  238 +-
 .../channel/SwfLanguageServiceCodeCompletion.ts    |   96 +-
 .../src/channel/SwfLanguageServiceCodeLenses.ts    |  278 +-
 .../src/channel/SwfYamlLanguageService.ts          |  312 +-
 .../src/channel/indentText.ts                      |   37 -
 .../src/channel/index.ts                           |    7 -
 .../src/channel/modelQueries.ts                    |   15 +-
 .../src/channel/swfRefValidationMap.ts             |   13 +-
 .../src/channel/types.ts                           |   66 +-
 .../src/editor/SwfJsonOffsets.ts                   |   40 +-
 .../src/editor/SwfOffsets.ts                       |   92 +
 .../src/editor/SwfYamlOffsets.ts                   |   50 +-
 .../src/editor/index.ts                            |   24 +-
 .../tests/SwfJsonLanguageService.test.ts           |  500 +-
 .../tests/SwfJsonOffsets.test.ts                   |  160 +-
 .../tests/SwfYamlLanguageService.test.ts           |  559 +-
 .../tests/SwfYamlOffsets.test.ts                   |  156 +-
 .../SwfJsonLanguageService.test.ts.snap            |  146 -
 .../SwfYamlLanguageService.test.ts.snap            | 4983 ------------------
 .../tests/refValidations.test.ts                   |  218 +-
 .../tests/testUtils.ts                             |   18 +-
 .../package.json                                   |    1 -
 .../viewer/ServerlessWorkflowMermaidViewerView.tsx |    5 -
 .../README.md                                      |    1 -
 .../package.json                                   |    1 -
 .../src/common/Editor.ts                           |    1 -
 .../StandaloneEditorsEditorChannelApiImpl.ts       |    9 -
 ...neServerlessWorkflowCombinedEditorChannelApi.ts |    9 -
 .../channel/SwfTextEditorChannelApiImpl.ts         |    9 -
 .../serverless-workflow-text-editor/package.json   |    1 -
 .../editor/ServerlessWorkflowTextEditorView.tsx    |    5 -
 .../editor/textEditor/SwfTextEditorController.ts   |   36 +-
 .../textEditor/augmentation/commands/index.tsx     |    4 +-
 .../.mocharc.json                                  |    0
 .../.vscode/launch.json                            |    0
 .../.vscode/settings.json                          |    0
 .../.vscode/tasks.json                             |    0
 .../CHANGELOG.md                                   |   24 +
 .../LICENSE                                        |    0
 .../README.md                                      |    2 +-
 .../env/index.js                                   |    0
 .../icon.png                                       |  Bin
 .../it-tests/helpers/CommonAsserts.ts              |    0
 .../it-tests/helpers/VSCodeTestHelper.ts           |   12 +-
 .../it-tests/helpers/swf/SwfEditorTestHelper.ts    |  182 +
 .../helpers/swf/SwfTextEditorTestHelper.ts}        |   22 +-
 .../autocompletion/autocompletion.sw.json          |   15 +
 .../autocompletion/autocompletion.sw.json.result   |   28 +
 .../autocompletion/autocompletion.sw.yaml          |   16 +
 .../autocompletion/autocompletion.sw.yaml.result   |   27 +
 .../emptyfile_autocompletion.sw.json}              |    0
 .../emptyfile_autocompletion.sw.json.result        |   41 +
 .../emptyfile_autocompletion.sw.yaml}              |    0
 .../emptyfile_autocompletion.sw.yaml.result        |   25 +
 .../emptyworkflow_autocompletion.sw.json}          |    0
 .../emptyworkflow_autocompletion.sw.json.result    |   11 +
 .../resources/autocompletion/specs/api.yaml        |   15 +
 .../resources/basic-operations/greet.sw.json       |   67 +
 .../resources/basic-operations/hello-world.sw.json |   18 +
 .../applicant-request-decision.sw.json             |   59 +
 .../resources/expression/expression.sw.json        |   35 +
 .../resources/expression/expression.sw.yaml        |   22 +
 .../resources/expression/schema/schema.json        |   24 +
 .../resources/expression/specs/openapi.json        |   49 +
 .../it-tests/resources/functions/function.sw.json  |   14 +
 .../resources/functions/function.sw.json.result    |   30 +
 .../it-tests/resources/functions/function.sw.yaml  |   10 +
 .../resources/functions/function.sw.yaml.result    |   18 +
 .../it-tests/resources/functions/routes/camel.json |   29 +
 .../it-tests/resources/functions/routes/camel.yaml |   12 +
 .../resources/functions/specs/asyncapi.json        |   17 +
 .../resources/functions/specs/asyncapi.yaml        |   10 +
 .../resources/functions/specs/openapi.json         |   41 +
 .../resources/functions/specs/openapi.yaml         |   25 +
 .../it-tests/resources/greeting-flow/.dockerignore |    5 +
 .../it-tests/resources/greeting-flow/.gitignore    |   39 +
 .../it-tests/resources/greeting-flow/pom.xml       |  144 +
 .../org/kie/tools/it/tests/GreetingResource.java   |   16 +
 .../src/main/resources/application.properties      |    1 +
 .../src/main/resources/greetings.sw.json           |   81 +
 .../greeting-flow/src/main/resources/openapi.yaml  |   37 +
 .../org/kie/tools/it/tests/GreetingResourceIT.java |    9 +
 .../kie/tools/it/tests/GreetingResourceTest.java   |   21 +
 .../syntax-highlight-hello-world.sw.json           |   18 +
 ...orkflow-editor-extension-autocompletion.test.ts |  255 +
 ...kflow-editor-extension-basic-operations.test.ts |  141 +
 ...low-editor-extension-diagram-navigation.test.ts |   84 +
 ...ss-workflow-editor-extension-expression.test.ts |   85 +
 ...ess-workflow-editor-extension-functions.test.ts |  177 +
 ...erless-workflow-editor-extension-smoke.test.ts} |   37 +-
 ...kflow-editor-extension-syntax-highlight.test.ts |   96 +
 .../it-tests/settings.json                         |    3 +-
 .../jsonLanguageConfiguration.json                 |    0
 .../yamlLanguageConfiguration.json                 |    0
 .../mocha-reporter-config.json                     |    6 +-
 .../package.json                                   |   11 +-
 .../src/debounce.ts}                               |   16 +-
 .../src/extension/RedHatAuthExtensionStateStore.ts |   53 +
 ...erverlessWorkflowDiagramEditorChannelApiImpl.ts |   39 +-
 ...rlessWorkflowDiagramEditorChannelApiProducer.ts |   70 +
 .../builtInVsCodeEditorSwfContributions.ts         |   17 +-
 .../src/extension/commandIds.ts                    |    0
 .../src/extension/configuration.ts                 |    0
 .../src/extension/extension.ts                     |    2 +-
 .../fs/JqExpressionsReadSchemaFromFs.ts            |   62 +
 .../SwfLanguageServiceChannelApiImpl.ts}           |   28 +-
 .../languageService/VsCodeSwfLanguageService.ts    |  212 +
 .../SwfServiceCatalogChannelApiImpl.ts             |   63 +
 .../serviceCatalog/SwfServiceCatalogStore.ts       |   71 +
 .../SwfServiceCatalogSupportActions.ts             |   74 +
 .../fs/FsWatchingServiceCatalogRelativeStore.ts    |  220 +
 .../src/extension/serviceCatalog/fs}/index.ts      |    7 +-
 .../serviceRegistry/ServiceRegistriesStore.ts      |  174 +
 .../ServiceRegistryInstanceClient.ts               |   88 +
 .../serviceRegistry/auth/AuthProvider.ts}          |   17 +-
 .../serviceRegistry/auth/AuthProviderFactory.ts    |   45 +
 .../serviceRegistry/auth/NoOpAuthProvider.ts}      |   30 +-
 .../serviceRegistry/auth/RhhccAuthProvider.ts      |   77 +
 .../serviceCatalog/serviceRegistry/auth}/index.ts  |    7 +-
 .../serviceCatalog/serviceRegistry/index.ts}       |   16 +-
 .../serviceCatalog/serviceRegistryCommands.ts      |   50 +
 .../extension/setupDiagramEditorCompanionTab.ts}   |   46 +-
 .../ServerlessWorkflowDiagramEditorEnvelopeApp.ts  |   44 +
 .../ServerlessWorkflowMermaidViewerEnvelopeApp.ts} |   10 +-
 .../static/svg-icon-dark.png                       |  Bin
 .../static/svg-icon-light.png                      |  Bin
 .../syntaxes/JSON.tmLanguage.json                  |  213 +
 .../syntaxes/YAML.tmLanguage.json                  |    0
 .../tsconfig.it-tests.json                         |    0
 .../tsconfig.json                                  |    0
 .../webpack.config.js                              |   34 +-
 .../appformer-kogito-bridge/pom.xml                |   15 -
 .../client/guided/tour/GuidedTourBridge.java       |  101 -
 .../GuidedTourCustomSelectorPositionProvider.java  |  108 -
 .../client/guided/tour/GuidedTourObserver.java     |   51 -
 .../guided/tour/observers/GlobalHTMLObserver.java  |  117 -
 .../guided/tour/service/GuidedTourService.java     |   66 -
 .../tour/service/GuidedTourServiceEnvelope.java    |   45 -
 .../service/GuidedTourServiceNativeEnvelope.java   |   35 -
 .../tour/service/GuidedTourServiceProducer.java    |   45 -
 .../client/guided/tour/service/api/AutoMode.java   |   32 -
 .../client/guided/tour/service/api/BlockMode.java  |   36 -
 .../client/guided/tour/service/api/DemoMode.java   |   29 -
 .../client/guided/tour/service/api/Mode.java       |   27 -
 .../client/guided/tour/service/api/Rect.java       |   58 -
 .../client/guided/tour/service/api/Step.java       |   54 -
 .../guided/tour/service/api/SubTutorialMode.java   |   32 -
 .../client/guided/tour/service/api/Tutorial.java   |   36 -
 .../guided/tour/service/api/UserInteraction.java   |   35 -
 .../client/guided/tour/GuidedTourBridgeTest.java   |  137 -
 ...idedTourCustomSelectorPositionProviderTest.java |  107 -
 .../client/guided/tour/GuidedTourObserverTest.java |   65 -
 .../tour/observers/GlobalHTMLObserverTest.java     |  130 -
 .../service/GuidedTourServiceEnvelopeTest.java     |   74 -
 .../service/GuidedTourServiceProducerTest.java     |   71 -
 .../README.md                                      |    4 +-
 .../README.md                                      |    4 +-
 .../stunner-editors/kie-wb-common-dmn/README.md    |    2 +-
 .../expressions/ExpressionEditorViewImpl.java      |   11 +-
 .../expressions/SaveCurrentStateCommand.java       |    9 -
 .../editors/expressions/util/ExpressionState.java  |    9 -
 .../expressions/ExpressionEditorViewImplTest.java  |   11 +-
 .../expressions/SaveCurrentStateCommandTest.java   |    2 -
 .../expressions/util/ExpressionStateTest.java      |    8 +-
 .../client/editor/AbstractDMNDiagramEditor.java    |    5 -
 .../client/tour/GuidedTourBridgeInitializer.java   |   79 -
 .../client/tour/common/GuidedTourActions.java      |   21 -
 .../common/client/tour/common/GuidedTourUtils.java |   60 -
 .../tour/observers/GuidedTourGraphObserver.java    |   80 -
 .../tour/observers/GuidedTourGridObserver.java     |   84 -
 .../GraphElementsPositionProviderFactory.java      |  122 -
 .../HTMLElementsPositionProviderFactory.java       |   72 -
 .../tour/providers/PositionProviderFactory.java    |   24 -
 .../common/client/tour/tutorial/DMNTutorial.java   |  170 -
 .../client/tour/tutorial/DMNTutorialView.html      |  118 -
 .../client/tour/tutorial/DMNTutorialView.java      |   35 -
 .../editor/AbstractDMNDiagramEditorTest.java       |    8 -
 .../tour/GuidedTourBridgeInitializerTest.java      |   76 -
 .../client/tour/common/GuidedTourUtilsTest.java    |  104 -
 .../observers/GuidedTourGraphObserverTest.java     |  124 -
 .../tour/observers/GuidedTourGridObserverTest.java |  119 -
 .../GraphElementsPositionProviderFactoryTest.java  |  141 -
 .../HTMLElementsPositionProviderFactoryTest.java   |   73 -
 .../showcase/client/editor/DMNDiagramEditor.java   |    3 -
 .../command/impl/KogitoKeyEventHandlerImpl.java    |    3 -
 packages/text-editor/package.json                  |    1 -
 packages/text-editor/src/editor/TextEditorView.tsx |    5 -
 packages/unitables/src/Unitables.tsx               |    1 -
 packages/unitables/src/bee/UnitablesBeeTable.tsx   |    3 -
 packages/vscode-extension-backend/.vscodeignore    |   12 -
 packages/vscode-extension-backend/README.md        |    1 -
 packages/vscode-extension-backend/jest.config.js   |   34 -
 packages/vscode-extension-backend/package.json     |  111 -
 .../src/extension/extension.ts                     |   44 -
 .../vscode-extension-backend/webpack.config.js     |   47 -
 .../CHANGELOG.md                                   |   13 +
 .../it-tests/helpers/VSCodeTestHelper.ts           |   12 +-
 .../package.json                                   |    3 +-
 .../src/api/DashbuilderViewerChannelApiImpl.ts     |    7 -
 .../builtInVsCodeEditorDashbuilderContributions.ts |    6 +-
 .../VsCodeDashbuilderLanguageService.ts            |   10 +-
 .../vscode-extension-kie-ba-bundle/CHANGELOG.md    |   16 +
 .../vscode-extension-kie-ba-bundle/package.json    |    6 +-
 .../vscode-extension-kogito-bundle/CHANGELOG.md    |   43 +
 .../vscode-extension-kogito-bundle/package.json    |    8 +-
 .../vscode-extension-pmml-editor/tsconfig.json     |    8 -
 .../CHANGELOG.md                                   |  472 --
 .../LICENSE                                        |  201 -
 .../README.md                                      |   22 -
 .../env/index.js                                   |   24 -
 .../gifs/bpmn.gif                                  |  Bin 1076785 -> 0 bytes
 .../gifs/dmn.gif                                   |  Bin 1233525 -> 0 bytes
 .../package.json                                   |   56 -
 .../src/extension/extension.ts                     |   22 -
 .../tsconfig.json                                  |    8 -
 .../webpack.config.js                              |   36 -
 .../CHANGELOG.md                                   |   20 +
 .../README.md                                      |    5 +-
 .../it-tests/helpers/VSCodeTestHelper.ts           |   12 +-
 .../package.json                                   |    8 +-
 ...erverlessWorkflowDiagramEditorChannelApiImpl.ts |   41 +-
 .../builtInVsCodeEditorSwfContributions.ts         |   18 +-
 .../src/extension/commandIds.ts                    |    1 +
 .../src/extension/configuration.ts                 |   11 +
 .../src/extension/extension.ts                     |    6 +
 .../extension/languageService/initSwfOffsetsApi.ts |   34 -
 .../src/extension/setupDeprecationNotification.ts  |   49 +
 packages/vscode-extension-yard-editor/LICENSE      |  201 -
 packages/vscode-extension-yard-editor/env/index.js |   24 -
 packages/vscode-extension/package.json             |    1 -
 .../src/DefaultVsCodeKieEditorChannelApiImpl.ts    |    9 -
 .../src/VsCodeKieEditorController.ts               |    4 -
 .../README.md                                      |    2 +-
 .../index.js                                       |    4 +-
 .../pom.xml                                        |    7 +-
 .../internal/handlers/GetAccessorsHandler.java     |   37 +-
 .../core/internal/handlers/GetClassesHandler.java  |   12 +-
 .../internal/handlers/GetClassesHandlerTest.java   |   50 -
 packages/workspaces-git-fs/package.json            |    2 +-
 .../src/services/WorkspaceService.tsx              |    9 +-
 packages/yard-editor/package.json                  |    1 -
 packages/yard-editor/src/editor/YardEditorView.tsx |    5 -
 .../.mocharc.json                                  |    0
 .../.vscode/launch.json                            |    0
 .../.vscode/settings.json                          |    0
 .../.vscode/tasks.json                             |    0
 .../.vscodeignore                                  |    0
 .../CHANGELOG.md                                   |    0
 .../LICENSE                                        |    0
 .../README.md                                      |    0
 .../env/index.js                                   |    0
 .../icon.png                                       |  Bin
 .../it-tests/helpers/CommonAsserts.ts              |    0
 .../it-tests/helpers/VSCodeTestHelper.ts           |   12 +-
 .../it-tests/helpers/yard/YardEditorTestHelper.ts  |    0
 .../helpers/yard/YardTextEditorTestHelper.ts       |    0
 .../it-tests/resources/empty.yard.json             |    0
 .../it-tests/resources/empty.yard.yaml             |    0
 .../it-tests/resources/empty.yard.yml              |    0
 .../it-tests/settings.json                         |    0
 .../it-tests/yard-editor.test.ts                   |    0
 .../jsonLanguageConfiguration.json                 |    0
 .../yamlLanguageConfiguration.json                 |    0
 .../mocha-reporter-config.json                     |    2 +-
 .../package.json                                   |    9 +-
 .../src/extension/commandIds.ts                    |    0
 .../src/extension/configuration.ts                 |    0
 .../src/extension/extension.ts                     |    2 +-
 .../src/extension/setupDiagramEditorControls.ts    |    0
 .../src/webview/YardEditorEnvelopeApp.ts           |    0
 .../syntaxes/YAML.tmLanguage.json                  |    0
 .../tsconfig.it-tests.json                         |    0
 .../tsconfig.json                                  |    0
 .../webpack.config.js                              |    0
 pnpm-lock.yaml                                     | 1432 ++++--
 repo/graph.dot                                     |   83 +-
 repo/graph.json                                    |  184 +-
 659 files changed, 18654 insertions(+), 22050 deletions(-)



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 27/27: NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1668)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit 90c94c2d80551a47cf1e339c112139d62a58dce8
Merge: 1e1e5ebb9a 20b87604b1
Author: Guilherme Caponetto <63...@users.noreply.github.com>
AuthorDate: Thu May 25 17:17:12 2023 -0300

    NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1668)

 .ci/jenkins/Jenkinsfile.vscode                     |   4 -
 .github/workflows/daily_dev_publish.yml            |  22 +-
 .github/workflows/release_build.yml                |  77 ++-
 .github/workflows/release_dry_run.yml              |   2 +-
 .github/workflows/release_publish.yml              |   2 +-
 .github/workflows/staging_build.yml                |  26 +-
 .gitignore                                         |   3 +
 .../external/ExternalDataSetClientProvider.java    |   5 +
 .../client/external/metrics/MetricsParser.java     |   7 +-
 .../client/external/metrics/MetricsParserTest.java |  45 +-
 .../dataset/def/ExternalDataSetDef.java            |  17 +-
 .../dataset/def/ExternalServiceType.java           |  57 ++
 .../dataset/json/ExternalDefJSONMarshaller.java    |  18 +-
 .../kie-editors-dev-vscode-extension/package.json  |   4 +-
 packages/kie-sandbox-distribution/README.md        |  57 ++
 .../kie-sandbox-distribution/docker-compose.yaml   |  26 +
 packages/kie-sandbox-distribution/env/index.js     |  93 +++
 packages/kie-sandbox-distribution/package.json     |  30 +
 .../src/resources/kubernetes/Deployment.ts         |  18 +
 .../src/resources/openshift/Route.ts               |  14 +
 .../env/index.js                                   |  20 +-
 .../install.js}                                    |  15 +-
 .../package.json                                   |  40 ++
 .../pom.xml                                        | 164 ++++++
 .../src/main/java/org/kie/kogito/AppStartup.java   |  67 +++
 .../org/kie/kogito/FileStructureConstants.java     |  36 ++
 .../java/org/kie/kogito/HotReloadResource.java     | 103 ++++
 .../org/kie/kogito/StaticContentCachingFilter.java |  48 ++
 .../main/java/org/kie/kogito/api/FileService.java  |  44 ++
 .../java/org/kie/kogito/api/FileValidation.java}   |  13 +-
 .../java/org/kie/kogito/api/UploadService.java}    |  16 +-
 .../main/java/org/kie/kogito/api/ZipService.java}  |  16 +-
 .../kie/kogito/health/LivenessHealthCheck.java}    |  20 +-
 .../kie/kogito/health/ReadinessHealthCheck.java}   |  20 +-
 .../org/kie/kogito/health/StartupHealthCheck.java} |  20 +-
 .../main/java/org/kie/kogito/model/FileType.java}  |  11 +-
 .../org/kie/kogito/model/FileValidationResult.java |  71 +++
 .../org/kie/kogito/model/UploadException.java}     |  12 +-
 .../org/kie/kogito/model/ValidationException.java} |  20 +-
 .../org/kie/kogito/service/FileServiceImpl.java    | 189 +++++++
 .../org/kie/kogito/service/UploadServiceImpl.java  | 135 +++++
 .../org/kie/kogito/service/ZipServiceImpl.java     |  60 ++
 .../kie/kogito/validation/OpenApiValidation.java   |  69 +++
 .../kogito/validation/PropertiesValidation.java    |  41 ++
 .../validation/ServerlessWorkflowValidation.java   |  65 +++
 .../src/main/resources/application.properties      |  12 +
 .../src/main/resources/hello.sw.json               |  26 +
 .../org/kie/kogito/service/FileServiceTest.java    | 210 +++++++
 .../org/kie/kogito/service/ZipServiceTest.java     |  52 ++
 .../src/test/resources/test-with-invalid.zip       | Bin 0 -> 1943 bytes
 .../src/test/resources/test.zip                    | Bin 0 -> 1415 bytes
 .../env/index.js                                   |  43 ++
 .../package.json                                   |  18 +
 .../.dockerignore                                  |   4 +
 .../Containerfile                                  |  46 ++
 .../Dockerfile                                     |   1 +
 .../env/index.js                                   |  41 ++
 .../package.json                                   |  34 ++
 .../build/defaultEnvJson.ts}                       |  25 +-
 packages/serverless-logic-web-tools/env/index.js   |  43 +-
 packages/serverless-logic-web-tools/package.json   |  10 +-
 packages/serverless-logic-web-tools/src/App.tsx    |  19 +-
 .../serverless-logic-web-tools/src/AppConstants.ts |   4 +
 .../src/ResponsiveDropdown/ResponsiveDropdown.tsx  |   1 +
 .../src/accelerator/Accelerators.ts                |  43 ++
 .../src/accelerator/useAccelerator.tsx             | 272 +++++++++
 .../src/alerts/Alerts.tsx                          |  10 +-
 .../src/alerts/GlobalAlertsContext.tsx             | 122 ++++
 .../src/editor/CreateGitHubRepositoryModal.tsx     | 170 +++---
 .../src/editor/Deploy/ConfirmDeployModal.tsx       |   9 +-
 .../src/editor/Deploy/DeployDropdownItems.tsx      | 154 -----
 .../src/editor/EditorPage.tsx                      |  16 +-
 .../src/editor/EditorToolbar.tsx                   |  68 +--
 .../KieSandboxExtendedServicesButtons.tsx          |   7 +-
 .../KieSandboxExtendedServicesDropdownGroup.tsx    |  11 +-
 .../src/editor/NewFileDropdownMenu.tsx             |   6 +-
 .../editor/api/RemoteServiceRegistryCatalogApi.ts  |   2 +-
 .../src/editor/hooks/EditorContext.tsx             |  49 ++
 .../src/editor/hooks/useDeployDropdownItems.tsx    | 411 ++++++++++++++
 .../src/editor/hooks/useEditorNotifications.tsx    |   8 +-
 .../src/env/EnvContext.tsx                         |  15 +-
 .../src/env/EnvContextProvider.tsx                 |  14 +-
 .../OpenShiftConstants.ts => env/EnvJson.ts}       |  10 +-
 .../src/extension/index.ts                         |  16 +-
 .../src/fetch/index.ts}                            |  17 +-
 .../src/home/sample/{sampleApi.ts => SampleApi.ts} |  46 +-
 .../src/home/sample/SampleCard.tsx                 |   2 +-
 .../src/home/sample/SampleConstants.ts}            |  23 +-
 .../src/home/sample/SamplesCatalog.tsx             |   2 +-
 .../src/home/sample/hooks/SampleContext.tsx        |  22 +-
 .../src/homepage/recentModels/RecentModels.tsx     |  10 +-
 .../recentModels/workspaceFiles/WorkspaceFiles.tsx |  11 +-
 .../serverless-logic-web-tools/src/i18n/AppI18n.ts |  70 ---
 .../src/i18n/locales/en.ts                         |  78 +--
 .../KieSandboxExtendedServicesContextProvider.tsx  |  58 +-
 .../KieSandboxExtendedServicesIcon.tsx             |   2 +-
 .../KieSandboxExtendedServicesModal.tsx            |  12 +-
 .../src/openshift/DeployConstants.ts}              |  14 +-
 .../src/openshift/OpenShiftConstants.ts            |   4 +
 .../src/openshift/OpenShiftContext.tsx             |   6 +-
 .../src/openshift/OpenShiftContextProvider.tsx     |  55 +-
 .../src/openshift/deploy/BaseContainerImages.ts    |  11 +-
 .../src/openshift/deploy/DeploymentStrategy.ts     |  17 -
 .../strategies/DashboardSingleModelDeployment.ts   |   3 +-
 .../strategies/DashboardWorkspaceDeployment.ts     |   3 +-
 .../deploy/strategies/KogitoProjectDeployment.ts   |   3 +-
 .../deploy/strategies/KogitoSwfModelDeployment.ts  |   3 +-
 .../src/openshift/deploy/types.ts                  |  14 +-
 .../dropdown/OpenShiftDeploymentDropdownItem.tsx   |  77 ++-
 .../dropdown/OpenshiftDeploymentsDropdown.tsx      | 188 +++++--
 .../src/openshift/hooks/useDeploymentStrategy.ts   |   3 +-
 .../pipelines/DevModeDeploymentLoaderPipeline.ts   | 123 ++++
 .../pipelines/KnativeDeploymentLoaderPipeline.ts   |   1 +
 .../openshift/pipelines/RestartDevModePipeline.ts  | 112 ++++
 .../openshift/pipelines/SpinUpDevModePipeline.ts   | 241 ++++++++
 .../src/openshift/swfDevMode/DevModeConstants.ts   |  83 +++
 .../src/openshift/swfDevMode/DevModeContext.tsx    | 292 ++++++++++
 .../src/settings/SettingsContext.tsx               |  29 +-
 .../src/settings/openshift/OpenShiftSettings.tsx   |   9 +-
 .../settings/openshift/OpenShiftSettingsConfig.tsx |  10 +
 .../openshift/OpenShiftSettingsSimpleConfig.tsx    |  50 +-
 .../src/settings/storage/StorageSettings.tsx       |  10 +-
 .../src/upgrade/UpgradeContext.tsx                 |  67 +++
 .../components/NewWorkspaceFromSample.tsx          |   4 +-
 .../hooks/WebToolsWorkspaceContextProvider.tsx     |  30 +
 .../src/workspace/worker/sharedWorker.ts           |   6 +-
 .../src/zip/index.ts}                              |  21 +-
 .../serverless-logic-web-tools/static/env.json     |   2 +-
 .../static/resources/style.css                     | 100 +---
 packages/serverless-logic-web-tools/tsconfig.json  |  11 +-
 .../serverless-logic-web-tools/webpack.config.js   | 302 ----------
 .../serverless-logic-web-tools/webpack.config.ts   | 328 +++++++++++
 .../package.json                                   |   1 +
 .../ServerlessWorkflowCombinedEditorChannelApi.ts  |   6 +
 ...ServerlessWorkflowCombinedEditorEnvelopeApi.ts} |  13 +-
 .../editor/ServerlessWorkflowCombinedEditor.tsx    |  28 +
 .../ServerlessWorkflowCombinedEditorView.tsx       |  14 +-
 .../src/editor/helpers/ColorNodes.ts               |  45 ++
 ...verlessWorkflowCombinedEditorEnvelopeApiImpl.ts |  52 ++
 .../src/impl/SwfCombinedEditorChannelApiImpl.ts    |   4 +
 .../src/impl/index.ts                              |   1 +
 .../ServerlessWorkflowDiagramEditorEnvelopeApi.ts  |   4 +-
 .../src/api/StunnerAPI.ts                          |  76 +++
 .../src/api/StunnerEditorEnvelopeAPI.ts            | 107 ++++
 .../src/api/StunnerEditorEnvelopeAPIFactory.ts     |  48 ++
 .../src/api/SwfStunnerEditorAPI.ts                 | 182 ++++++
 .../envelope/ServerlessWorkflowDiagramEditor.ts    |  93 ++-
 ...rverlessWorkflowDiagramEditorEnvelopeApiImpl.ts | 110 +++-
 .../envelope/ServerlessWorkflowStunnerEditor.ts    | 108 ++++
 .../canvas/controls/ControlPointControlImpl.java   |   2 +-
 .../client/widgets/editor/StunnerEditor.java       |   1 +
 .../common/stunner/core/graph/content/Bound.java   |   7 +-
 .../common/stunner/core/graph/content/Bounds.java  |   7 +-
 .../core/graph/content/view/ControlPoint.java      |   9 +-
 .../stunner/core/graph/content/view/Point2D.java   |   9 +-
 .../stunner/core/client/api/JsStunnerEditor.java   |   2 +
 .../stunner/core/client/api/JsStunnerSession.java  |  21 +-
 .../common/stunner/core/client/api/JsWindow.java   |   1 +
 .../core/graph/content/view/MagnetConnection.java  |   9 +-
 .../core/graph/content/view/Point2DConnection.java |   7 +-
 .../core/graph/content/view/ViewConnectorImpl.java |   9 +-
 .../stunner/core/graph/content/view/ViewImpl.java  |   7 +-
 .../common/stunner/core/graph/impl/NodeImpl.java   |   8 +-
 .../impl/AbstractControlPointCommandTest.java      |   6 +-
 .../com/ait/lienzo/client/core/types/JsCanvas.java |   5 +
 .../stunner/sw/client/editor/DiagramEditor.java    |   2 +-
 .../common/stunner/sw/KogitoSWEditor.gwt.xml       |   2 +-
 .../sw/client/editor/DiagramEditorTest.java        |   6 +-
 ...neServerlessWorkflowCombinedEditorChannelApi.ts |   4 +
 .../src/main/resources}/hello-world.sw.json        |   0
 ...-workflow-editor-extension-svg-filepath.test.ts | 123 ++++
 .../package.json                                   |   4 +-
 packages/stunner-editors/pom.xml                   |   4 +-
 .../package.json                                   |   4 +-
 .../src/VSCodeTestHelper.ts                        |  40 ++
 .../package.json                                   |   2 +-
 .../.mocharc.json                                  |   7 -
 .../.vscode/launch.json                            |  24 -
 .../.vscode/settings.json                          |   9 -
 .../.vscode/tasks.json                             |  18 -
 .../CHANGELOG.md                                   | 149 -----
 .../LICENSE                                        | 201 -------
 .../README.md                                      |  86 ---
 .../icon.png                                       | Bin 22915 -> 0 bytes
 .../it-tests/helpers/swf/SwfEditorTestHelper.ts    | 174 ------
 .../autocompletion/autocompletion.sw.json          |  15 -
 .../autocompletion/autocompletion.sw.json.result   |  28 -
 .../autocompletion/autocompletion.sw.yaml          |  16 -
 .../autocompletion/autocompletion.sw.yaml.result   |  27 -
 .../emptyfile_autocompletion.sw.json               |   0
 .../emptyfile_autocompletion.sw.json.result        |  41 --
 .../emptyfile_autocompletion.sw.yaml               |   0
 .../emptyfile_autocompletion.sw.yaml.result        |  25 -
 .../emptyworkflow_autocompletion.sw.json           |   0
 .../emptyworkflow_autocompletion.sw.json.result    |  11 -
 .../resources/autocompletion/specs/api.yaml        |  15 -
 .../resources/basic-operations/greet.sw.json       |  67 ---
 .../applicant-request-decision.sw.json             |  59 --
 .../resources/expression/expression.sw.json        |  35 --
 .../resources/expression/expression.sw.yaml        |  22 -
 .../resources/expression/schema/schema.json        |  24 -
 .../resources/expression/specs/openapi.json        |  49 --
 .../it-tests/resources/functions/function.sw.json  |  14 -
 .../resources/functions/function.sw.json.result    |  30 -
 .../it-tests/resources/functions/function.sw.yaml  |  10 -
 .../resources/functions/function.sw.yaml.result    |  18 -
 .../it-tests/resources/functions/routes/camel.json |  29 -
 .../it-tests/resources/functions/routes/camel.yaml |  12 -
 .../resources/functions/specs/asyncapi.json        |  17 -
 .../resources/functions/specs/asyncapi.yaml        |  10 -
 .../resources/functions/specs/openapi.json         |  41 --
 .../resources/functions/specs/openapi.yaml         |  25 -
 .../it-tests/resources/greeting-flow/.dockerignore |   5 -
 .../it-tests/resources/greeting-flow/.gitignore    |  39 --
 .../it-tests/resources/greeting-flow/pom.xml       | 144 -----
 .../org/kie/tools/it/tests/GreetingResource.java   |  16 -
 .../src/main/resources/application.properties      |   1 -
 .../src/main/resources/greetings.sw.json           |  81 ---
 .../greeting-flow/src/main/resources/openapi.yaml  |  37 --
 .../org/kie/tools/it/tests/GreetingResourceIT.java |   9 -
 .../kie/tools/it/tests/GreetingResourceTest.java   |  21 -
 .../syntax-highlight-hello-world.sw.json           |  18 -
 ...orkflow-editor-extension-autocompletion.test.ts | 255 ---------
 ...kflow-editor-extension-basic-operations.test.ts | 141 -----
 ...low-editor-extension-diagram-navigation.test.ts |  84 ---
 ...ss-workflow-editor-extension-expression.test.ts |  85 ---
 ...ess-workflow-editor-extension-functions.test.ts | 177 ------
 ...verless-workflow-editor-extension-smoke.test.ts |  62 --
 ...kflow-editor-extension-syntax-highlight.test.ts |  96 ----
 .../it-tests/settings.json                         |  14 -
 .../jsonLanguageConfiguration.json                 |  23 -
 .../yamlLanguageConfiguration.json                 |  38 --
 .../mocha-reporter-config.json                     |  15 -
 .../package.json                                   | 388 -------------
 .../src/extension/RedHatAuthExtensionStateStore.ts |  53 --
 ...erverlessWorkflowDiagramEditorChannelApiImpl.ts | 261 ---------
 ...rlessWorkflowDiagramEditorChannelApiProducer.ts |  70 ---
 .../builtInVsCodeEditorSwfContributions.ts         | 320 -----------
 .../src/extension/commandIds.ts                    |  30 -
 .../src/extension/configuration.ts                 | 152 -----
 .../src/extension/extension.ts                     | 138 -----
 .../fs/JqExpressionsReadSchemaFromFs.ts            |  62 --
 .../SwfLanguageServiceChannelApiImpl.ts            |  45 --
 .../languageService/VsCodeSwfLanguageService.ts    | 212 -------
 .../SwfServiceCatalogChannelApiImpl.ts             |  63 ---
 .../serviceCatalog/SwfServiceCatalogStore.ts       |  71 ---
 .../SwfServiceCatalogSupportActions.ts             |  74 ---
 .../fs/FsWatchingServiceCatalogRelativeStore.ts    | 220 --------
 .../serviceRegistry/ServiceRegistriesStore.ts      | 174 ------
 .../ServiceRegistryInstanceClient.ts               |  88 ---
 .../serviceRegistry/auth/AuthProviderFactory.ts    |  45 --
 .../serviceRegistry/auth/RhhccAuthProvider.ts      |  77 ---
 .../serviceCatalog/serviceRegistryCommands.ts      |  50 --
 .../src/extension/setupDeprecationNotification.ts  |  49 --
 .../extension/setupDiagramEditorCompanionTab.ts    | 142 -----
 .../ServerlessWorkflowDiagramEditorEnvelopeApp.ts  |  44 --
 .../ServerlessWorkflowMermaidViewerEnvelopeApp.ts  |  28 -
 .../static/svg-icon-dark.png                       | Bin 656 -> 0 bytes
 .../static/svg-icon-light.png                      | Bin 362 -> 0 bytes
 .../syntaxes/JSON.tmLanguage.json                  | 213 -------
 .../syntaxes/YAML.tmLanguage.json                  | 621 ---------------------
 .../tsconfig.it-tests.json                         |  11 -
 .../tsconfig.json                                  |   9 -
 .../webpack.config.js                              |  72 ---
 .../pom.xml                                        |   7 +-
 .../internal/handlers/GetAccessorsHandler.java     |  12 +-
 .../src/textEditor/YardTextEditorController.ts     |   2 +
 .../augmentation/language/schemas/yardSchema.ts    | 187 +++++++
 .../augmentation/language/yaml/index.ts}           |  37 +-
 packages/yard-vscode-extension/package.json        |  13 +-
 pnpm-lock.yaml                                     | 339 +++++------
 repo/graph.dot                                     |  22 +-
 repo/graph.json                                    |  86 +--
 scripts/build-env/src/bin.ts                       |  20 +
 scripts/sparse-checkout/run.sh                     |   2 +-
 275 files changed, 6682 insertions(+), 8118 deletions(-)


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 08/27: NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1461)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit 9bc804ea709147694e994ae30f250a390606785d
Author: Fabrizio Antonangeli <fa...@gmail.com>
AuthorDate: Wed Feb 15 10:07:14 2023 +0100

    NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1461)
    
    Co-authored-by: Gianluca <gi...@gmail.com>
    Co-authored-by: Gianluca <gz...@redhat.com>
    Co-authored-by: Wojtek Trocki <wt...@redhat.com>
    Co-authored-by: renovate[bot] <29...@users.noreply.github.com>
    Co-authored-by: Renovate Bot <bo...@renovateapp.com>
    Co-authored-by: Luiz Motta <lu...@gmail.com>
    Co-authored-by: Riccardo Forina <rf...@redhat.com>
    Co-authored-by: Rachel Yordán <ka...@users.noreply.github.com>
    Co-authored-by: Jozef Marko <jo...@redhat.com>
    Co-authored-by: Wagner Scholl Lemos <jo...@gmail.com>
    Co-authored-by: Kumar Aditya Raj <se...@gmail.com>
    Co-authored-by: Thiago Lugli <th...@users.noreply.github.com>
    Co-authored-by: Tiago Bento <15...@users.noreply.github.com>
    Co-authored-by: Yeser Amer <ya...@redhat.com>
    Co-authored-by: Kirill Gaevskii <kg...@redhat.com>
    Co-authored-by: Jaime Enriquez <ja...@inodesoft.com>
    Co-authored-by: Pere Fernández <pe...@users.noreply.github.com>
---
 .github/actions/setup-env/action.yml               |    2 +-
 README.md                                          |    2 +-
 .../uniforms-patternfly/env/index.js               |   24 +-
 examples/uniforms-patternfly/package.json          |   44 +
 examples/uniforms-patternfly/src/App.tsx           |   55 +
 .../uniforms-patternfly/src/CodeBlock.tsx          |   27 +-
 examples/uniforms-patternfly/src/Form.tsx          |   53 +
 .../uniforms-patternfly/src/index.tsx              |   10 +-
 .../uniforms-patternfly/src/schemas/json-schema.ts |  113 ++
 .../src/schemas/simple-schema-2.ts                 |   80 +
 examples/uniforms-patternfly/static/index.html     |   29 +
 examples/uniforms-patternfly/static/logo.png       |  Bin 0 -> 30305 bytes
 .../static/resources/styles.css                    |   17 +-
 examples/uniforms-patternfly/tsconfig.json         |    9 +
 examples/uniforms-patternfly/webpack.config.js     |   49 +
 package.json                                       |    4 +-
 .../dashbuilder-component-table/static/index.css   |    4 +-
 .../dashbuilder-component-uniforms/package.json    |    6 +-
 .../src/Uniforms.tsx                               |    2 +-
 packages/form-dmn/package.json                     |    6 +-
 .../form-dmn/src/uniforms/DmnAutoFieldProvider.tsx |    2 +-
 packages/form-dmn/tests/DmnForm.test.tsx           |   10 +-
 .../tests/__snapshots__/DmnForm.test.tsx.snap      |   60 +-
 packages/form-generation-tool/package.json         |    4 +-
 packages/form/package.json                         |    6 +-
 packages/form/src/FormBase.tsx                     |    4 +-
 packages/kn-plugin-workflow/README.md              |    2 +-
 .../src/devDeployments/DevDeploymentsDropdown.tsx  |    4 +-
 packages/online-editor/src/index.tsx               |    3 -
 .../src/workspace/startupBlockers/FsChanged.tsx    |  148 --
 .../startupBlockers/IncompatibleBrowser.tsx        |    3 +-
 packages/serverless-logic-web-tools/src/index.tsx  |    3 -
 .../src/workspace/startupBlockers/FsChanged.tsx    |  145 --
 .../startupBlockers/IncompatibleBrowser.tsx        |    3 +-
 .../core/shape/toolbox/items/tooltip/Tooltip.java  |    6 +-
 .../org/kie/lienzo/client/BasicWiresExample.java   |   81 +-
 .../java/org/kie/lienzo/client/EventExample.java   |   61 +-
 .../org/kie/lienzo/client/WiresDockingExample.java |    3 -
 .../common/stunner/sw/definition/ModelUtils.java   |    1 -
 .../stunner/sw/definition/ParallelStateBranch.java |   12 +-
 .../common/stunner/sw/definition/State.java        |   28 +-
 .../common/stunner/sw/definition/Timeout.java      |    1 -
 .../stunner/sw/marshall/StateMarshalling.java      |    8 -
 .../stunner/sw/marshall/StateMarshallingTest.java  |    5 +-
 .../common/stunner/sw/client/ShapeFactory.java     |    2 +-
 .../sw/client/shapes/CallbackStateShape.java       |   58 +
 .../common/stunner/sw/client/shapes/EndShape.java  |    5 +-
 .../stunner/sw/client/shapes/EndShapeView.java     |    2 +-
 .../stunner/sw/client/shapes/EventStateShape.java  |   58 +
 .../sw/client/shapes/ForEachStateShape.java        |   57 +
 .../stunner/sw/client/shapes/InjectStateShape.java |   39 +
 .../sw/client/shapes/OperationStateShape.java      |   57 +
 .../sw/client/shapes/ParallelStateShape.java       |   57 +
 .../sw/client/shapes/ServerlessWorkflowShape.java  |   55 +
 ...Shape.java => ServerlessWorkflowShapeView.java} |   68 +-
 .../stunner/sw/client/shapes/SleepStateShape.java  |   53 +
 .../stunner/sw/client/shapes/StartShape.java       |    5 +-
 .../stunner/sw/client/shapes/StartShapeView.java   |    2 +-
 .../stunner/sw/client/shapes/StateShape.java       |  190 ++-
 .../stunner/sw/client/shapes/StateShapeView.java   |   10 +-
 .../stunner/sw/client/shapes/SwitchStateShape.java |   57 +
 .../stunner/sw/client/shapes/TransitionView.java   |    8 +-
 .../stunner/sw/client/shapes/icons/CornerIcon.java |   80 +
 .../stunner/sw/client/shapes/icons/IconPath.java   |   21 +
 .../common/stunner/sw/client/shapes/StateNode.java |   73 +
 .../stunner/sw/client/shapes/StateShapeTest.java   |  297 +++-
 .../common/stunner/sw/client/shapes/StateView.java |   49 +
 .../ast/visitor/ASTHeuristicCheckerVisitor.java    |   72 +
 .../kie-wb-common-dmn-client/pom.xml               |   14 +-
 .../DecisionTableEditorDefinitionEnricher.java     |    2 +-
 .../actions/AbstractActionsToolboxView.java        |    1 +
 .../customproperties/AssociationList.java          |   21 +-
 .../processes/ProcessConverterDelegate.java        |   43 +-
 packages/uniforms-bootstrap4-codegen/package.json  |    4 +-
 .../src/__tests__/_createContext.ts                |   12 +-
 .../src/uniforms/BootstrapCodeGenContext.tsx       |   12 +-
 packages/uniforms-patternfly-codegen/package.json  |    4 +-
 .../src/__tests__/_createContext.ts                |   12 +-
 .../src/uniforms/CodeGenContext.tsx                |   12 +-
 packages/uniforms-patternfly/.vscode/launch.json   |   29 +
 packages/uniforms-patternfly/README.md             |   97 ++
 .../uniforms-patternfly/__mocks__/styleMock.js     |    1 +
 .../env/index.js}                                  |   13 +-
 packages/uniforms-patternfly/jest.config.js        |   34 +
 .../package.json                                   |   39 +-
 .../src}/AutoField.tsx                             |   32 +-
 packages/uniforms-patternfly/src/AutoFields.tsx    |   40 +
 .../src/AutoForm.tsx}                              |   15 +-
 packages/uniforms-patternfly/src/BaseForm.tsx      |   39 +
 packages/uniforms-patternfly/src/BoolField.tsx     |   56 +
 packages/uniforms-patternfly/src/DateField.tsx     |  184 +++
 packages/uniforms-patternfly/src/ErrorField.tsx    |   47 +
 packages/uniforms-patternfly/src/ErrorsField.tsx   |   50 +
 packages/uniforms-patternfly/src/HiddenField.tsx   |   46 +
 packages/uniforms-patternfly/src/ListAddField.tsx  |   60 +
 packages/uniforms-patternfly/src/ListDelField.tsx  |   54 +
 packages/uniforms-patternfly/src/ListField.tsx     |  105 ++
 packages/uniforms-patternfly/src/ListItemField.tsx |   48 +
 packages/uniforms-patternfly/src/LongTextField.tsx |   60 +
 packages/uniforms-patternfly/src/NestField.tsx     |   50 +
 packages/uniforms-patternfly/src/NumField.tsx      |   60 +
 packages/uniforms-patternfly/src/QuickForm.tsx     |   43 +
 packages/uniforms-patternfly/src/RadioField.tsx    |   56 +
 .../src/SelectCheckboxField.tsx                    |   67 +
 packages/uniforms-patternfly/src/SelectField.tsx   |   53 +
 .../uniforms-patternfly/src/SelectInputsField.tsx  |  133 ++
 packages/uniforms-patternfly/src/SubmitField.tsx   |   41 +
 packages/uniforms-patternfly/src/TextField.tsx     |  187 +++
 .../src/ValidatedForm.tsx}                         |   15 +-
 .../src/ValidatedQuickForm.tsx}                    |    8 +-
 .../src/__tests__/AutoField.test.tsx               |  107 ++
 .../src/__tests__/AutoFields.test.tsx              |  105 ++
 .../src/__tests__/AutoForm.test.tsx}               |   12 +-
 .../src/__tests__/BaseForm.test.tsx}               |   12 +-
 .../src/__tests__/BoolField.test.tsx               |  108 ++
 .../src/__tests__/DateField.test.tsx               |  188 +++
 .../src/__tests__/ErrorField.test.tsx              |   51 +
 .../src/__tests__/ErrorsField.test.tsx             |   58 +
 .../src/__tests__/HiddenField.test.tsx             |  131 ++
 .../src/__tests__/ListAddField.test.tsx            |   56 +
 .../src/__tests__/ListDelField.test.tsx            |   56 +
 .../src/__tests__/ListField.test.tsx               |   93 ++
 .../src/__tests__/ListItemField.test.tsx           |   55 +
 .../src/__tests__/LongTextField.test.tsx           |  129 ++
 .../src/__tests__/NestField.test.tsx               |   70 +
 .../src/__tests__/NumField.test.tsx                |  240 +++
 .../src/__tests__/QuickForm.test.tsx}              |   12 +-
 .../src/__tests__/RadioField.test.tsx              |  218 +++
 .../src/__tests__/SelectField.test.tsx             |  498 ++++++
 .../src/__tests__/SubmitField.test.tsx             |   40 +
 .../src/__tests__/TextField.test.tsx               |  357 +++++
 .../src/__tests__/ValidateQuickForm.test.tsx}      |   12 +-
 .../src/__tests__/ValidatedForm.test.tsx}          |   12 +-
 .../src/__tests__/index.test.ts                    |   45 +
 .../src/__tests__/jest.setup.ts}                   |    6 +-
 .../src/__tests__/test-utils.tsx                   |   62 +
 packages/uniforms-patternfly/src/index.ts          |   39 +
 packages/uniforms-patternfly/src/wrapField.tsx     |   71 +
 packages/uniforms-patternfly/tsconfig.cjs.json     |   13 +
 packages/uniforms-patternfly/tsconfig.esm.json     |   13 +
 packages/unitables-dmn/package.json                |    5 +-
 packages/unitables/package.json                    |    6 +-
 packages/unitables/src/uniforms/AutoField.tsx      |    2 +-
 pnpm-lock.yaml                                     | 1594 +++++++++++++++++---
 repo/graph.dot                                     |   15 +-
 repo/graph.json                                    |   25 +-
 146 files changed, 7972 insertions(+), 957 deletions(-)

diff --git a/.github/actions/setup-env/action.yml b/.github/actions/setup-env/action.yml
index 9afb7a6b1f..f1bde8db42 100644
--- a/.github/actions/setup-env/action.yml
+++ b/.github/actions/setup-env/action.yml
@@ -25,7 +25,7 @@ runs:
     - name: "Setup Node"
       uses: actions/setup-node@v2
       with:
-        node-version: 16.13.2
+        node-version: 18.14.0
 
     - name: "Setup JDK 11"
       uses: actions/setup-java@de1bb2b0c5634f0fc4438d7aa9944e68f9bf86cc
diff --git a/README.md b/README.md
index de610ee98a..7ae9f768e4 100644
--- a/README.md
+++ b/README.md
@@ -22,7 +22,7 @@ This repository contains tooling applications and libraries for KIE projects.
 
 To start building the KIE Tools project, you're going to need:
 
-- Node `16` _(To install, follow these instructions: https://nodejs.org/en/download/package-manager/)_
+- Node `18` _(To install, follow these instructions: https://nodejs.org/en/download/package-manager/)_
 - pnpm `7.26.3` _(To install, follow these instructions: https://pnpm.io/installation)_
 - Maven `3.8.6`
 - Java `11`
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/StartShape.java b/examples/uniforms-patternfly/env/index.js
similarity index 56%
copy from packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/StartShape.java
copy to examples/uniforms-patternfly/env/index.js
index 06bac41e46..00d6364f4d 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/StartShape.java
+++ b/examples/uniforms-patternfly/env/index.js
@@ -1,11 +1,11 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ *        http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,13 +14,15 @@
  * limitations under the License.
  */
 
-package org.kie.workbench.common.stunner.sw.client.shapes;
+const { varsWithName, composeEnv } = require("@kie-tools-scripts/build-env");
 
-import org.kie.workbench.common.stunner.core.client.shape.impl.NodeShapeImpl;
-
-public class StartShape extends NodeShapeImpl {
-
-    public StartShape() {
-        super(new StartShapeView().asAbstractShape());
-    }
-}
+module.exports = composeEnv([require("@kie-tools/root-env/env")], {
+  vars: varsWithName({}),
+  get env() {
+    return {
+      exampleUniformsPatternflyPort: {
+        port: 9101,
+      },
+    };
+  },
+});
diff --git a/examples/uniforms-patternfly/package.json b/examples/uniforms-patternfly/package.json
new file mode 100644
index 0000000000..234e211670
--- /dev/null
+++ b/examples/uniforms-patternfly/package.json
@@ -0,0 +1,44 @@
+{
+  "private": true,
+  "name": "@kie-tools-examples/uniforms-patternfly",
+  "version": "0.0.0",
+  "license": "Apache-2.0",
+  "scripts": {
+    "build": "rimraf dist && webpack",
+    "build:dev": "run-script-if --bool \"$(build-env examples.build)\" --then \"pnpm build --env dev\"",
+    "build:prod": "run-script-if --bool \"$(build-env examples.build)\" --then \"pnpm build\"",
+    "start": "webpack serve --host 0.0.0.0 --env dev"
+  },
+  "dependencies": {
+    "@kie-tools-core/patternfly-base": "workspace:*",
+    "@kie-tools/uniforms-patternfly": "workspace:*",
+    "@patternfly/react-core": "^4.157.3",
+    "@patternfly/react-icons": "^4.11.17",
+    "ajv": "^6.12.6",
+    "react": "^17.0.2",
+    "react-dom": "^17.0.2",
+    "simpl-schema": "^1.12.0",
+    "uniforms": "^3.10.2",
+    "uniforms-bridge-json-schema": "^3.10.2",
+    "uniforms-bridge-simple-schema": "^3.10.2",
+    "uniforms-bridge-simple-schema-2": "^3.10.2"
+  },
+  "devDependencies": {
+    "@kie-tools-core/webpack-base": "workspace:*",
+    "@kie-tools/root-env": "workspace:*",
+    "@kie-tools/tsconfig": "workspace:*",
+    "@types/react": "^17.0.6",
+    "@types/react-dom": "^17.0.5",
+    "@types/react-router": "^5.1.14",
+    "@types/react-router-dom": "^5.1.7",
+    "@types/simpl-schema": "^1.12.0",
+    "copy-webpack-plugin": "^11.0.0",
+    "react-router-dom": "^5.2.1",
+    "rimraf": "^3.0.2",
+    "typescript": "^4.4.2",
+    "webpack": "^5.36.2",
+    "webpack-cli": "^4.10.0",
+    "webpack-dev-server": "^4.7.3",
+    "webpack-merge": "^5.8.0"
+  }
+}
\ No newline at end of file
diff --git a/examples/uniforms-patternfly/src/App.tsx b/examples/uniforms-patternfly/src/App.tsx
new file mode 100644
index 0000000000..1edc8c61c0
--- /dev/null
+++ b/examples/uniforms-patternfly/src/App.tsx
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import "@patternfly/react-core/dist/styles/base.css";
+import * as React from "react";
+import "../static/resources/styles.css";
+import { useState } from "react";
+import { Brand, Nav, NavItem, NavList, Page, PageHeader } from "@patternfly/react-core";
+import { Form } from "./Form";
+
+export enum SchemaType {
+  JsonSchema,
+  SimpleSchema,
+}
+
+export function App() {
+  const [schemaType, setSchemaType] = useState<SchemaType>(SchemaType.JsonSchema);
+
+  return (
+    <Page
+      header={
+        <PageHeader
+          logo={<Brand src={"logo.png"} alt="Logo" />}
+          topNav={
+            <Nav onSelect={(e) => setSchemaType(e.itemId as SchemaType)} aria-label="Nav" variant="horizontal">
+              <NavList>
+                <NavItem itemId={SchemaType.JsonSchema} isActive={schemaType === SchemaType.JsonSchema}>
+                  JSON Schema
+                </NavItem>
+                <NavItem itemId={SchemaType.SimpleSchema} isActive={schemaType === SchemaType.SimpleSchema}>
+                  Simple Schema
+                </NavItem>
+              </NavList>
+            </Nav>
+          }
+        />
+      }
+    >
+      <Form schemaType={schemaType} />
+    </Page>
+  );
+}
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/StartShape.java b/examples/uniforms-patternfly/src/CodeBlock.tsx
similarity index 51%
copy from packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/StartShape.java
copy to examples/uniforms-patternfly/src/CodeBlock.tsx
index 06bac41e46..d52c96189c 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/StartShape.java
+++ b/examples/uniforms-patternfly/src/CodeBlock.tsx
@@ -1,11 +1,11 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ *        http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,13 +14,24 @@
  * limitations under the License.
  */
 
-package org.kie.workbench.common.stunner.sw.client.shapes;
+import * as React from "react";
 
-import org.kie.workbench.common.stunner.core.client.shape.impl.NodeShapeImpl;
+interface Props {
+  model: any;
+}
 
-public class StartShape extends NodeShapeImpl {
+export function CodeBlock(props: Props) {
+  if (!props.model)
+    return (
+      <>
+        <span></span>
+      </>
+    );
 
-    public StartShape() {
-        super(new StartShapeView().asAbstractShape());
-    }
+  return (
+    <div style={{ marginBottom: "1em" }}>
+      <h2>Result:</h2>
+      <pre style={{ background: "#eee", padding: "1rem" }}>{JSON.stringify(props.model, null, 2)}</pre>
+    </div>
+  );
 }
diff --git a/examples/uniforms-patternfly/src/Form.tsx b/examples/uniforms-patternfly/src/Form.tsx
new file mode 100644
index 0000000000..ac9f495f22
--- /dev/null
+++ b/examples/uniforms-patternfly/src/Form.tsx
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { useState, useMemo } from "react";
+import { SchemaType } from "./App";
+import { bridge as jsonSchema } from "./schemas/json-schema";
+import { bridge as simpleSchema } from "./schemas/simple-schema-2";
+import { CodeBlock } from "./CodeBlock";
+import AutoForm from "@kie-tools/uniforms-patternfly/dist/esm/AutoForm";
+
+interface Props {
+  schemaType: SchemaType;
+}
+
+export function Form(props: Props) {
+  const [model, setModel] = useState<any>(undefined);
+
+  const schema = useMemo(() => {
+    if (props.schemaType === SchemaType.SimpleSchema) {
+      return simpleSchema;
+    }
+    return jsonSchema;
+  }, [props.schemaType]);
+
+  return (
+    <div className={"form--page"}>
+      <div className={"form--container"}>
+        <CodeBlock model={model} />
+        <AutoForm
+          placeholder
+          model={model}
+          schema={schema}
+          onSubmit={(model: any) => setModel(model)}
+          showInlineError
+        />
+      </div>
+    </div>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts b/examples/uniforms-patternfly/src/index.tsx
similarity index 65%
copy from packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts
copy to examples/uniforms-patternfly/src/index.tsx
index 7f7980f259..148f255eab 100644
--- a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts
+++ b/examples/uniforms-patternfly/src/index.tsx
@@ -1,11 +1,11 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *       http://www.apache.org/licenses/LICENSE-2.0
+ *        http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,4 +14,8 @@
  * limitations under the License.
  */
 
-export const LATEST_VERSION_COMPATIBLE_WITH_LFS = "0.25.0";
+import * as React from "react";
+import * as ReactDOM from "react-dom";
+import { App } from "./App";
+
+ReactDOM.render(<App />, document.getElementById("app"));
diff --git a/examples/uniforms-patternfly/src/schemas/json-schema.ts b/examples/uniforms-patternfly/src/schemas/json-schema.ts
new file mode 100644
index 0000000000..22bd1408ba
--- /dev/null
+++ b/examples/uniforms-patternfly/src/schemas/json-schema.ts
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as Ajv from "ajv";
+import { JSONSchemaBridge } from "uniforms-bridge-json-schema";
+
+const ajv = new Ajv({ allErrors: true, useDefaults: true });
+
+function createValidator(schema: any) {
+  const validator = ajv.compile(schema);
+  return (model: any) => {
+    validator(model);
+    if (validator.errors && validator.errors.length) {
+      throw { details: validator.errors };
+    }
+  };
+}
+
+const schema = {
+  type: "object",
+  properties: {
+    flight: {
+      type: "object",
+      properties: {
+        flightNumber: {
+          type: "string",
+        },
+        seat: {
+          type: "string",
+        },
+        gate: {
+          type: "string",
+        },
+        departure: {
+          type: "string",
+          format: "date-time",
+        },
+        arrival: {
+          type: "string",
+          format: "date-time",
+        },
+      },
+      disabled: true,
+    },
+    hotel: {
+      type: "object",
+      properties: {
+        name: {
+          type: "string",
+        },
+        addresses: {
+          type: "array",
+          items: {
+            $ref: "#/definitions/address",
+          },
+        },
+        phone: {
+          type: "string",
+        },
+        bookingNumber: {
+          type: "string",
+        },
+        room: {
+          type: "string",
+        },
+        numberOfBeds: {
+          placeholder: "Select...",
+          enum: [1, 2, 3],
+          type: "number",
+        },
+      },
+    },
+  },
+  definitions: {
+    address: {
+      type: "object",
+      properties: {
+        street: {
+          type: "string",
+        },
+        city: {
+          type: "string",
+        },
+        zipCode: {
+          type: "string",
+        },
+        country: {
+          placeholder: "Select...",
+          enum: ["Brazil", "Ireland", "USA"],
+          type: "string",
+        },
+      },
+    },
+  },
+  phases: ["complete", "release"],
+};
+
+const schemaValidator = createValidator(schema);
+
+export const bridge = new JSONSchemaBridge(schema, schemaValidator);
diff --git a/examples/uniforms-patternfly/src/schemas/simple-schema-2.ts b/examples/uniforms-patternfly/src/schemas/simple-schema-2.ts
new file mode 100644
index 0000000000..284777d046
--- /dev/null
+++ b/examples/uniforms-patternfly/src/schemas/simple-schema-2.ts
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import SimpleSchema2Bridge from "uniforms-bridge-simple-schema-2";
+import SimpleSchema from "simpl-schema";
+
+const schema = new SimpleSchema({
+  date: {
+    type: Date,
+    defaultValue: new Date(),
+  },
+
+  adult: {
+    type: Boolean,
+  },
+
+  size: {
+    type: String,
+    defaultValue: "m",
+    allowedValues: ["xs", "s", "m", "l", "xl"],
+  },
+
+  rating: {
+    type: Number,
+    allowedValues: [1, 2, 3, 4, 5],
+    uniforms: {
+      checkboxes: true,
+    },
+  },
+
+  hello: {
+    type: Object,
+  },
+
+  "hello.something": {
+    type: String,
+  },
+
+  "hello.somethingelse": {
+    type: String,
+  },
+
+  friends: {
+    type: Array,
+    minCount: 1,
+  },
+
+  "friends.$": {
+    type: Object,
+    uniforms: {
+      label: false,
+    },
+  },
+
+  "friends.$.name": {
+    type: String,
+    min: 3,
+  },
+
+  "friends.$.age": {
+    type: Number,
+    min: 0,
+    max: 150,
+  },
+} as any);
+
+export const bridge = new SimpleSchema2Bridge(schema);
diff --git a/examples/uniforms-patternfly/static/index.html b/examples/uniforms-patternfly/static/index.html
new file mode 100644
index 0000000000..bf8755ddf9
--- /dev/null
+++ b/examples/uniforms-patternfly/static/index.html
@@ -0,0 +1,29 @@
+<!--
+  ~ Copyright 2020 Red Hat, Inc. and/or its affiliates.
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~       http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<!DOCTYPE html>
+<html lang="en" class="pf-m-redhat-font">
+  <head>
+    <title>Uniforms Patternfly Examples</title>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+  </head>
+  <body>
+    <div id="app" style="height: 100vh"></div>
+    <script src="index.js"></script>
+  </body>
+</html>
diff --git a/examples/uniforms-patternfly/static/logo.png b/examples/uniforms-patternfly/static/logo.png
new file mode 100644
index 0000000000..3691516354
Binary files /dev/null and b/examples/uniforms-patternfly/static/logo.png differ
diff --git a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts b/examples/uniforms-patternfly/static/resources/styles.css
similarity index 64%
copy from packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts
copy to examples/uniforms-patternfly/static/resources/styles.css
index 7f7980f259..a45a12fe6a 100644
--- a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts
+++ b/examples/uniforms-patternfly/static/resources/styles.css
@@ -1,11 +1,11 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *       http://www.apache.org/licenses/LICENSE-2.0
+ *        http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,4 +14,15 @@
  * limitations under the License.
  */
 
-export const LATEST_VERSION_COMPATIBLE_WITH_LFS = "0.25.0";
+.form--page {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 100vw;
+}
+
+.form--container {
+  width: 60%;
+  background-color: white;
+  padding: 20px;
+}
diff --git a/examples/uniforms-patternfly/tsconfig.json b/examples/uniforms-patternfly/tsconfig.json
new file mode 100644
index 0000000000..12548a6f43
--- /dev/null
+++ b/examples/uniforms-patternfly/tsconfig.json
@@ -0,0 +1,9 @@
+{
+  "extends": "@kie-tools/tsconfig/tsconfig.json",
+  "compilerOptions": {
+    "declaration": false,
+    "declarationMap": false,
+    "moduleResolution": "node",
+    "target": "es6"
+  }
+}
diff --git a/examples/uniforms-patternfly/webpack.config.js b/examples/uniforms-patternfly/webpack.config.js
new file mode 100644
index 0000000000..4249153f0c
--- /dev/null
+++ b/examples/uniforms-patternfly/webpack.config.js
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+const path = require("path");
+const CopyPlugin = require("copy-webpack-plugin");
+const patternflyBase = require("@kie-tools-core/patternfly-base");
+const common = require("@kie-tools-core/webpack-base/webpack.common.config");
+const { merge } = require("webpack-merge");
+const { env } = require("./env");
+const buildEnv = env;
+
+module.exports = (env) => [
+  merge(common(env), {
+    entry: {
+      index: "./src/index.tsx",
+    },
+    output: {
+      publicPath: "/",
+    },
+    module: {
+      rules: [...patternflyBase.webpackModuleRules],
+    },
+    plugins: [
+      new CopyPlugin({
+        patterns: [{ from: "./static", to: "." }],
+      }),
+    ],
+    devServer: {
+      historyApiFallback: false,
+      static: [{ directory: path.join(__dirname, "./dist") }, { directory: path.join(__dirname, "./static") }],
+      compress: true,
+      port: buildEnv.exampleUniformsPatternflyPort.port,
+    },
+    ignoreWarnings: [/Failed to parse source map/],
+  }),
+];
diff --git a/package.json b/package.json
index 1c1ff4e362..b3f35b0a6d 100644
--- a/package.json
+++ b/package.json
@@ -19,7 +19,7 @@
     "@kie-tools-scripts/sparse-checkout": "workspace:*",
     "@kie-tools-scripts/update-version": "workspace:*",
     "@nice-move/prettier-plugin-package-json": "^0.6.1",
-    "@types/node": "^15.0.2",
+    "@types/node": "^18.13.0",
     "filemanager-webpack-plugin": "^7.0.0",
     "husky": "^6.0.0",
     "postinstall-postinstall": "^2.1.0",
@@ -31,7 +31,7 @@
     "react-dropzone": "^11.4.2"
   },
   "engines": {
-    "node": ">=16",
+    "node": ">=18",
     "pnpm": "7.26.3"
   },
   "pnpm": {
diff --git a/packages/dashbuilder-component-table/static/index.css b/packages/dashbuilder-component-table/static/index.css
index 3661509f9b..b6c2e78cd3 100644
--- a/packages/dashbuilder-component-table/static/index.css
+++ b/packages/dashbuilder-component-table/static/index.css
@@ -42,7 +42,9 @@
   --pf-global--BackgroundColor--100: #100c2a !important;
 }
 
-[mode="dark"] .pf-c-options-menu__menu {
+[mode="dark"] .pf-c-options-menu__menu,
+[mode="dark"] .pf-c-pagination__nav,
+[mode="dark"] .pf-c-pagination__total-items {
   background-color: #100c2a !important;
   color: #eef1fa;
 }
diff --git a/packages/dashbuilder-component-uniforms/package.json b/packages/dashbuilder-component-uniforms/package.json
index ebe8499ac6..94b5f30ba3 100644
--- a/packages/dashbuilder-component-uniforms/package.json
+++ b/packages/dashbuilder-component-uniforms/package.json
@@ -24,15 +24,15 @@
   "dependencies": {
     "@kie-tools-core/patternfly-base": "workspace:*",
     "@kie-tools/dashbuilder-component-api": "workspace:*",
+    "@kie-tools/uniforms-patternfly": "workspace:*",
     "@patternfly/react-core": "^4.157.3",
     "@patternfly/react-table": "^4.27.15",
     "ajv": "^6.12.6",
     "lodash": "^4.17.21",
     "react": "^17.0.2",
     "react-dom": "^17.0.2",
-    "uniforms": "^3.5.5",
-    "uniforms-bridge-json-schema": "^3.5.5",
-    "uniforms-patternfly": "^4.7.9"
+    "uniforms": "^3.10.2",
+    "uniforms-bridge-json-schema": "^3.10.2"
   },
   "devDependencies": {
     "@babel/core": "^7.16.0",
diff --git a/packages/dashbuilder-component-uniforms/src/Uniforms.tsx b/packages/dashbuilder-component-uniforms/src/Uniforms.tsx
index 10520f1308..55ad7b8017 100644
--- a/packages/dashbuilder-component-uniforms/src/Uniforms.tsx
+++ b/packages/dashbuilder-component-uniforms/src/Uniforms.tsx
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 import { JSONSchemaBridge } from "uniforms-bridge-json-schema";
-import { AutoForm } from "uniforms-patternfly/dist/es6";
+import { AutoForm } from "@kie-tools/uniforms-patternfly/dist/esm";
 import * as Ajv from "ajv";
 import * as React from "react";
 import { useCallback } from "react";
diff --git a/packages/form-dmn/package.json b/packages/form-dmn/package.json
index cd493340ce..dc3e4670f9 100644
--- a/packages/form-dmn/package.json
+++ b/packages/form-dmn/package.json
@@ -29,6 +29,7 @@
     "@kie-tools-core/notifications": "workspace:*",
     "@kie-tools/form": "workspace:*",
     "@kie-tools/i18n-common-dictionary": "workspace:*",
+    "@kie-tools/uniforms-patternfly": "workspace:*",
     "@patternfly/react-core": "^4.157.3",
     "@patternfly/react-icons": "^4.11.17",
     "ajv": "^6.12.6",
@@ -37,9 +38,8 @@
     "lodash": "^4.17.21",
     "react": "^17.0.2",
     "react-dom": "^17.0.2",
-    "uniforms": "^3.5.5",
-    "uniforms-bridge-json-schema": "^3.5.5",
-    "uniforms-patternfly": "^4.7.9"
+    "uniforms": "^3.10.2",
+    "uniforms-bridge-json-schema": "^3.10.2"
   },
   "devDependencies": {
     "@babel/core": "^7.16.0",
diff --git a/packages/form-dmn/src/uniforms/DmnAutoFieldProvider.tsx b/packages/form-dmn/src/uniforms/DmnAutoFieldProvider.tsx
index d34ae060fd..b94d5ac826 100644
--- a/packages/form-dmn/src/uniforms/DmnAutoFieldProvider.tsx
+++ b/packages/form-dmn/src/uniforms/DmnAutoFieldProvider.tsx
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-import { AutoField, AutoFields } from "uniforms-patternfly";
+import { AutoField, AutoFields } from "@kie-tools/uniforms-patternfly/dist/esm";
 import { DmnFeelContextField } from "./DmnFeelContextField";
 import * as React from "react";
 import { FEEL_CONTEXT } from "./DmnFormJsonSchemaBridge";
diff --git a/packages/form-dmn/tests/DmnForm.test.tsx b/packages/form-dmn/tests/DmnForm.test.tsx
index 27a2d6e3a7..47470c10ee 100644
--- a/packages/form-dmn/tests/DmnForm.test.tsx
+++ b/packages/form-dmn/tests/DmnForm.test.tsx
@@ -58,7 +58,7 @@ describe("DmnForm tests", () => {
 
     const { findByTestId } = render(<DmnForm {...newProps} />);
 
-    expect(await findByTestId("base-form")).toMatchSnapshot();
+    expect(await findByTestId("form-base")).toMatchSnapshot();
   });
 
   it("should submit the formData", async () => {
@@ -68,7 +68,7 @@ describe("DmnForm tests", () => {
 
     const { findByTestId } = render(<DmnForm {...props} onSubmit={onSubmit} formRef={formRef} formInputs={formData} />);
 
-    expect(await findByTestId("base-form")).toMatchSnapshot();
+    expect(await findByTestId("form-base")).toMatchSnapshot();
 
     await act(async () => {
       formRef.current?.submit();
@@ -84,7 +84,7 @@ describe("DmnForm tests", () => {
 
     const { findByTestId } = render(<DmnForm {...props} onSubmit={onSubmit} formRef={formRef} formInputs={formData} />);
 
-    expect(await findByTestId("base-form")).toMatchSnapshot();
+    expect(await findByTestId("form-base")).toMatchSnapshot();
 
     await act(async () => {
       formRef.current?.submit();
@@ -102,7 +102,7 @@ describe("DmnForm tests", () => {
       <DmnForm {...props} formRef={formRef} onValidate={onValidate} formInputs={formData} />
     );
 
-    expect(await findByTestId("base-form")).toMatchSnapshot();
+    expect(await findByTestId("form-base")).toMatchSnapshot();
 
     await act(async () => {
       formRef.current?.submit();
@@ -120,7 +120,7 @@ describe("DmnForm tests", () => {
       <DmnForm {...props} formRef={formRef} onValidate={onValidate} formInputs={formData} />
     );
 
-    expect(await findByTestId("base-form")).toMatchSnapshot();
+    expect(await findByTestId("form-base")).toMatchSnapshot();
 
     await act(async () => {
       formRef.current?.submit();
diff --git a/packages/form-dmn/tests/__snapshots__/DmnForm.test.tsx.snap b/packages/form-dmn/tests/__snapshots__/DmnForm.test.tsx.snap
index ad6e340733..03d8a34534 100644
--- a/packages/form-dmn/tests/__snapshots__/DmnForm.test.tsx.snap
+++ b/packages/form-dmn/tests/__snapshots__/DmnForm.test.tsx.snap
@@ -19,15 +19,17 @@ exports[`DmnForm tests should have placeholder 1`] = `
 exports[`DmnForm tests should remove require parameter 1`] = `
 <div>
   <div
-    data-testid="base-form"
+    data-testid="form-base"
   >
     <form
       class="pf-c-form"
+      data-testid="base-form"
       novalidate=""
     >
       <div>
         <div
           class="pf-c-form__group"
+          data-testid="wrapper-field"
         >
           <div
             class="pf-c-form__group-label"
@@ -53,6 +55,7 @@ exports[`DmnForm tests should remove require parameter 1`] = `
               data-ouia-component-id="OUIA-Generated-TextInputBase-22"
               data-ouia-component-type="PF4/TextInput"
               data-ouia-safe="true"
+              data-testid="text-field"
               id="uniforms-0007-0001"
               name="name"
               placeholder=""
@@ -70,15 +73,17 @@ exports[`DmnForm tests should remove require parameter 1`] = `
 
 exports[`DmnForm tests should render the DMN Form 1`] = `
 <div
-  data-testid="base-form"
+  data-testid="form-base"
 >
   <form
     class="pf-c-form"
+    data-testid="base-form"
     novalidate=""
   >
     <div>
       <div
         class="pf-c-form__group"
+        data-testid="wrapper-field"
       >
         <div
           class="pf-c-form__group-label"
@@ -104,6 +109,7 @@ exports[`DmnForm tests should render the DMN Form 1`] = `
             data-ouia-component-id="OUIA-Generated-TextInputBase-1"
             data-ouia-component-type="PF4/TextInput"
             data-ouia-safe="true"
+            data-testid="text-field"
             id="uniforms-0000-0001"
             name="name"
             placeholder=""
@@ -115,6 +121,7 @@ exports[`DmnForm tests should render the DMN Form 1`] = `
       </div>
       <div
         class="pf-c-form__group"
+        data-testid="wrapper-field"
       >
         <div
           class="pf-c-form__group-label"
@@ -140,6 +147,7 @@ exports[`DmnForm tests should render the DMN Form 1`] = `
             data-ouia-component-id="OUIA-Generated-TextInputBase-2"
             data-ouia-component-type="PF4/TextInput"
             data-ouia-safe="true"
+            data-testid="text-field"
             id="uniforms-0000-0003"
             name="lastName"
             placeholder=""
@@ -151,6 +159,7 @@ exports[`DmnForm tests should render the DMN Form 1`] = `
       </div>
       <div
         class="pf-c-form__group"
+        data-testid="wrapper-field"
       >
         <div
           class="pf-c-form__group-label"
@@ -176,6 +185,7 @@ exports[`DmnForm tests should render the DMN Form 1`] = `
             data-ouia-component-id="OUIA-Generated-TextInputBase-3"
             data-ouia-component-type="PF4/TextInput"
             data-ouia-safe="true"
+            data-testid="text-field"
             id="uniforms-0000-0005"
             name="daysAndTimeDuration"
             placeholder=""
@@ -187,6 +197,7 @@ exports[`DmnForm tests should render the DMN Form 1`] = `
       </div>
       <div
         class="pf-c-form__group"
+        data-testid="wrapper-field"
       >
         <div
           class="pf-c-form__group-label"
@@ -212,6 +223,7 @@ exports[`DmnForm tests should render the DMN Form 1`] = `
             data-ouia-component-id="OUIA-Generated-TextInputBase-4"
             data-ouia-component-type="PF4/TextInput"
             data-ouia-safe="true"
+            data-testid="text-field"
             id="uniforms-0000-0007"
             name="yearsAndMonthDuration"
             placeholder=""
@@ -228,15 +240,17 @@ exports[`DmnForm tests should render the DMN Form 1`] = `
 
 exports[`DmnForm tests should submit the formData 1`] = `
 <div
-  data-testid="base-form"
+  data-testid="form-base"
 >
   <form
     class="pf-c-form"
+    data-testid="base-form"
     novalidate=""
   >
     <div>
       <div
         class="pf-c-form__group"
+        data-testid="wrapper-field"
       >
         <div
           class="pf-c-form__group-label"
@@ -262,6 +276,7 @@ exports[`DmnForm tests should submit the formData 1`] = `
             data-ouia-component-id="OUIA-Generated-TextInputBase-5"
             data-ouia-component-type="PF4/TextInput"
             data-ouia-safe="true"
+            data-testid="text-field"
             id="uniforms-0001-0001"
             name="name"
             placeholder=""
@@ -273,6 +288,7 @@ exports[`DmnForm tests should submit the formData 1`] = `
       </div>
       <div
         class="pf-c-form__group"
+        data-testid="wrapper-field"
       >
         <div
           class="pf-c-form__group-label"
@@ -298,6 +314,7 @@ exports[`DmnForm tests should submit the formData 1`] = `
             data-ouia-component-id="OUIA-Generated-TextInputBase-6"
             data-ouia-component-type="PF4/TextInput"
             data-ouia-safe="true"
+            data-testid="text-field"
             id="uniforms-0001-0003"
             name="lastName"
             placeholder=""
@@ -309,6 +326,7 @@ exports[`DmnForm tests should submit the formData 1`] = `
       </div>
       <div
         class="pf-c-form__group"
+        data-testid="wrapper-field"
       >
         <div
           class="pf-c-form__group-label"
@@ -334,6 +352,7 @@ exports[`DmnForm tests should submit the formData 1`] = `
             data-ouia-component-id="OUIA-Generated-TextInputBase-7"
             data-ouia-component-type="PF4/TextInput"
             data-ouia-safe="true"
+            data-testid="text-field"
             id="uniforms-0001-0005"
             name="daysAndTimeDuration"
             placeholder=""
@@ -345,6 +364,7 @@ exports[`DmnForm tests should submit the formData 1`] = `
       </div>
       <div
         class="pf-c-form__group"
+        data-testid="wrapper-field"
       >
         <div
           class="pf-c-form__group-label"
@@ -370,6 +390,7 @@ exports[`DmnForm tests should submit the formData 1`] = `
             data-ouia-component-id="OUIA-Generated-TextInputBase-8"
             data-ouia-component-type="PF4/TextInput"
             data-ouia-safe="true"
+            data-testid="text-field"
             id="uniforms-0001-0007"
             name="yearsAndMonthDuration"
             placeholder=""
@@ -386,15 +407,17 @@ exports[`DmnForm tests should submit the formData 1`] = `
 
 exports[`DmnForm tests should validate the formData - invalid 1`] = `
 <div
-  data-testid="base-form"
+  data-testid="form-base"
 >
   <form
     class="pf-c-form"
+    data-testid="base-form"
     novalidate=""
   >
     <div>
       <div
         class="pf-c-form__group"
+        data-testid="wrapper-field"
       >
         <div
           class="pf-c-form__group-label"
@@ -420,6 +443,7 @@ exports[`DmnForm tests should validate the formData - invalid 1`] = `
             data-ouia-component-id="OUIA-Generated-TextInputBase-17"
             data-ouia-component-type="PF4/TextInput"
             data-ouia-safe="true"
+            data-testid="text-field"
             id="uniforms-0004-0001"
             name="name"
             placeholder=""
@@ -431,6 +455,7 @@ exports[`DmnForm tests should validate the formData - invalid 1`] = `
       </div>
       <div
         class="pf-c-form__group"
+        data-testid="wrapper-field"
       >
         <div
           class="pf-c-form__group-label"
@@ -456,6 +481,7 @@ exports[`DmnForm tests should validate the formData - invalid 1`] = `
             data-ouia-component-id="OUIA-Generated-TextInputBase-18"
             data-ouia-component-type="PF4/TextInput"
             data-ouia-safe="true"
+            data-testid="text-field"
             id="uniforms-0004-0003"
             name="lastName"
             placeholder=""
@@ -467,6 +493,7 @@ exports[`DmnForm tests should validate the formData - invalid 1`] = `
       </div>
       <div
         class="pf-c-form__group"
+        data-testid="wrapper-field"
       >
         <div
           class="pf-c-form__group-label"
@@ -492,6 +519,7 @@ exports[`DmnForm tests should validate the formData - invalid 1`] = `
             data-ouia-component-id="OUIA-Generated-TextInputBase-19"
             data-ouia-component-type="PF4/TextInput"
             data-ouia-safe="true"
+            data-testid="text-field"
             id="uniforms-0004-0005"
             name="daysAndTimeDuration"
             placeholder=""
@@ -509,6 +537,7 @@ exports[`DmnForm tests should validate the formData - invalid 1`] = `
       </div>
       <div
         class="pf-c-form__group"
+        data-testid="wrapper-field"
       >
         <div
           class="pf-c-form__group-label"
@@ -534,6 +563,7 @@ exports[`DmnForm tests should validate the formData - invalid 1`] = `
             data-ouia-component-id="OUIA-Generated-TextInputBase-20"
             data-ouia-component-type="PF4/TextInput"
             data-ouia-safe="true"
+            data-testid="text-field"
             id="uniforms-0004-0007"
             name="yearsAndMonthDuration"
             placeholder=""
@@ -550,15 +580,17 @@ exports[`DmnForm tests should validate the formData - invalid 1`] = `
 
 exports[`DmnForm tests should validate the formData - success 1`] = `
 <div
-  data-testid="base-form"
+  data-testid="form-base"
 >
   <form
     class="pf-c-form"
+    data-testid="base-form"
     novalidate=""
   >
     <div>
       <div
         class="pf-c-form__group"
+        data-testid="wrapper-field"
       >
         <div
           class="pf-c-form__group-label"
@@ -584,6 +616,7 @@ exports[`DmnForm tests should validate the formData - success 1`] = `
             data-ouia-component-id="OUIA-Generated-TextInputBase-13"
             data-ouia-component-type="PF4/TextInput"
             data-ouia-safe="true"
+            data-testid="text-field"
             id="uniforms-0003-0001"
             name="name"
             placeholder=""
@@ -595,6 +628,7 @@ exports[`DmnForm tests should validate the formData - success 1`] = `
       </div>
       <div
         class="pf-c-form__group"
+        data-testid="wrapper-field"
       >
         <div
           class="pf-c-form__group-label"
@@ -620,6 +654,7 @@ exports[`DmnForm tests should validate the formData - success 1`] = `
             data-ouia-component-id="OUIA-Generated-TextInputBase-14"
             data-ouia-component-type="PF4/TextInput"
             data-ouia-safe="true"
+            data-testid="text-field"
             id="uniforms-0003-0003"
             name="lastName"
             placeholder=""
@@ -631,6 +666,7 @@ exports[`DmnForm tests should validate the formData - success 1`] = `
       </div>
       <div
         class="pf-c-form__group"
+        data-testid="wrapper-field"
       >
         <div
           class="pf-c-form__group-label"
@@ -656,6 +692,7 @@ exports[`DmnForm tests should validate the formData - success 1`] = `
             data-ouia-component-id="OUIA-Generated-TextInputBase-15"
             data-ouia-component-type="PF4/TextInput"
             data-ouia-safe="true"
+            data-testid="text-field"
             id="uniforms-0003-0005"
             name="daysAndTimeDuration"
             placeholder=""
@@ -667,6 +704,7 @@ exports[`DmnForm tests should validate the formData - success 1`] = `
       </div>
       <div
         class="pf-c-form__group"
+        data-testid="wrapper-field"
       >
         <div
           class="pf-c-form__group-label"
@@ -692,6 +730,7 @@ exports[`DmnForm tests should validate the formData - success 1`] = `
             data-ouia-component-id="OUIA-Generated-TextInputBase-16"
             data-ouia-component-type="PF4/TextInput"
             data-ouia-safe="true"
+            data-testid="text-field"
             id="uniforms-0003-0007"
             name="yearsAndMonthDuration"
             placeholder=""
@@ -708,15 +747,17 @@ exports[`DmnForm tests should validate the formData - success 1`] = `
 
 exports[`DmnForm tests shouldn't submit the formData 1`] = `
 <div
-  data-testid="base-form"
+  data-testid="form-base"
 >
   <form
     class="pf-c-form"
+    data-testid="base-form"
     novalidate=""
   >
     <div>
       <div
         class="pf-c-form__group"
+        data-testid="wrapper-field"
       >
         <div
           class="pf-c-form__group-label"
@@ -742,6 +783,7 @@ exports[`DmnForm tests shouldn't submit the formData 1`] = `
             data-ouia-component-id="OUIA-Generated-TextInputBase-9"
             data-ouia-component-type="PF4/TextInput"
             data-ouia-safe="true"
+            data-testid="text-field"
             id="uniforms-0002-0001"
             name="name"
             placeholder=""
@@ -753,6 +795,7 @@ exports[`DmnForm tests shouldn't submit the formData 1`] = `
       </div>
       <div
         class="pf-c-form__group"
+        data-testid="wrapper-field"
       >
         <div
           class="pf-c-form__group-label"
@@ -778,6 +821,7 @@ exports[`DmnForm tests shouldn't submit the formData 1`] = `
             data-ouia-component-id="OUIA-Generated-TextInputBase-10"
             data-ouia-component-type="PF4/TextInput"
             data-ouia-safe="true"
+            data-testid="text-field"
             id="uniforms-0002-0003"
             name="lastName"
             placeholder=""
@@ -789,6 +833,7 @@ exports[`DmnForm tests shouldn't submit the formData 1`] = `
       </div>
       <div
         class="pf-c-form__group"
+        data-testid="wrapper-field"
       >
         <div
           class="pf-c-form__group-label"
@@ -814,6 +859,7 @@ exports[`DmnForm tests shouldn't submit the formData 1`] = `
             data-ouia-component-id="OUIA-Generated-TextInputBase-11"
             data-ouia-component-type="PF4/TextInput"
             data-ouia-safe="true"
+            data-testid="text-field"
             id="uniforms-0002-0005"
             name="daysAndTimeDuration"
             placeholder=""
@@ -831,6 +877,7 @@ exports[`DmnForm tests shouldn't submit the formData 1`] = `
       </div>
       <div
         class="pf-c-form__group"
+        data-testid="wrapper-field"
       >
         <div
           class="pf-c-form__group-label"
@@ -856,6 +903,7 @@ exports[`DmnForm tests shouldn't submit the formData 1`] = `
             data-ouia-component-id="OUIA-Generated-TextInputBase-12"
             data-ouia-component-type="PF4/TextInput"
             data-ouia-safe="true"
+            data-testid="text-field"
             id="uniforms-0002-0007"
             name="yearsAndMonthDuration"
             placeholder=""
diff --git a/packages/form-generation-tool/package.json b/packages/form-generation-tool/package.json
index d61d7b11b6..bc640fd276 100644
--- a/packages/form-generation-tool/package.json
+++ b/packages/form-generation-tool/package.json
@@ -32,8 +32,8 @@
     "@kie-tools/uniforms-patternfly-codegen": "workspace:*",
     "inquirer": "^8.1.1",
     "lodash": "^4.17.21",
-    "uniforms": "^3.5.5",
-    "uniforms-bridge-json-schema": "^3.5.5"
+    "uniforms": "^3.10.2",
+    "uniforms-bridge-json-schema": "^3.10.2"
   },
   "devDependencies": {
     "@babel/core": "^7.16.0",
diff --git a/packages/form/package.json b/packages/form/package.json
index bbbf464777..57d5a6236e 100644
--- a/packages/form/package.json
+++ b/packages/form/package.json
@@ -27,6 +27,7 @@
     "@kie-tools-core/i18n": "workspace:*",
     "@kie-tools-core/notifications": "workspace:*",
     "@kie-tools/i18n-common-dictionary": "workspace:*",
+    "@kie-tools/uniforms-patternfly": "workspace:*",
     "@patternfly/react-core": "^4.157.3",
     "@patternfly/react-icons": "^4.11.17",
     "ajv": "^6.12.6",
@@ -35,9 +36,8 @@
     "lodash": "^4.17.21",
     "react": "^17.0.2",
     "react-dom": "^17.0.2",
-    "uniforms": "^3.5.5",
-    "uniforms-bridge-json-schema": "^3.5.5",
-    "uniforms-patternfly": "^4.7.9"
+    "uniforms": "^3.10.2",
+    "uniforms-bridge-json-schema": "^3.10.2"
   },
   "devDependencies": {
     "@babel/core": "^7.16.0",
diff --git a/packages/form/src/FormBase.tsx b/packages/form/src/FormBase.tsx
index f91d3aff19..02fe94c9ca 100644
--- a/packages/form/src/FormBase.tsx
+++ b/packages/form/src/FormBase.tsx
@@ -16,7 +16,7 @@
 
 import { AutoGenerationErrorFormStatus, EmptyFormStatus, FormStatus, ValidatorErrorFormStatus } from "./FormStatus";
 import { ErrorBoundary } from "./ErrorBoundary";
-import AutoForm from "uniforms-patternfly/dist/es6/AutoForm";
+import AutoForm from "@kie-tools/uniforms-patternfly/dist/esm/AutoForm";
 import * as React from "react";
 import { FormI18n } from "./i18n";
 import { FormJsonSchemaBridge } from "./uniforms/FormJsonSchemaBridge";
@@ -55,7 +55,7 @@ export function FormBase(props: React.PropsWithChildren<FormBaseProps>) {
       )}
       {props.formStatus === FormStatus.EMPTY && <EmptyFormStatus i18n={props.i18n} />}
       {props.formStatus === FormStatus.WITHOUT_ERROR && (
-        <div data-testid={"base-form"}>
+        <div data-testid={"form-base"}>
           <ErrorBoundary
             ref={props.errorBoundaryRef}
             setHasError={props.setFormError}
diff --git a/packages/kn-plugin-workflow/README.md b/packages/kn-plugin-workflow/README.md
index 21bc65ed5e..8ac70a2d76 100644
--- a/packages/kn-plugin-workflow/README.md
+++ b/packages/kn-plugin-workflow/README.md
@@ -10,7 +10,7 @@ All the commands in this section should be performed in the monorepo root.
 
 ### Prerequisites
 
-- Node `>= 16.13.2` _(To install, follow these instructions: https://nodejs.org/en/download/package-manager/)_
+- Node `>= 18.14.0` _(To install, follow these instructions: https://nodejs.org/en/download/package-manager/)_
 - pnpm `7.26.3` _(To install, follow these instructions: https://pnpm.io/installation)_
 - Go `1.19` _(To install, follow these instructions: https://go.dev/doc/install)_
 
diff --git a/packages/online-editor/src/devDeployments/DevDeploymentsDropdown.tsx b/packages/online-editor/src/devDeployments/DevDeploymentsDropdown.tsx
index 5b99e47485..1ce7260702 100644
--- a/packages/online-editor/src/devDeployments/DevDeploymentsDropdown.tsx
+++ b/packages/online-editor/src/devDeployments/DevDeploymentsDropdown.tsx
@@ -193,14 +193,14 @@ export function DevDeploymentsDropdown() {
       }
     } else {
       return [
-        <>
+        <div key={"empty-deployments"}>
           <EmptyState>
             <EmptyStateIcon icon={PficonSatelliteIcon} />
             <Title headingLevel="h4" size="md" style={{ color: "darkgray" }}>
               {`Choose a Cloud provider to see your Dev deployments.`}
             </Title>
           </EmptyState>
-        </>,
+        </div>,
       ];
     }
   }, [authSession, deleteAllDeployments, deployments.data, deployments.status, i18n]);
diff --git a/packages/online-editor/src/index.tsx b/packages/online-editor/src/index.tsx
index 6a601443be..706e521e06 100644
--- a/packages/online-editor/src/index.tsx
+++ b/packages/online-editor/src/index.tsx
@@ -20,15 +20,12 @@ import * as ReactDOM from "react-dom";
 import { App } from "./App";
 import "../static/resources/style.css";
 import * as incompatibleBrowser from "./workspace/startupBlockers/IncompatibleBrowser";
-import * as fsChanged from "./workspace/startupBlockers/FsChanged";
 
 async function main() {
   const appContainer = document.getElementById("app")!;
 
   if (await incompatibleBrowser.isTrue()) {
     ReactDOM.render(<incompatibleBrowser.Component />, appContainer);
-  } else if (await fsChanged.isTrue()) {
-    ReactDOM.render(<fsChanged.Component />, appContainer);
   } else {
     ReactDOM.render(<App />, appContainer);
   }
diff --git a/packages/online-editor/src/workspace/startupBlockers/FsChanged.tsx b/packages/online-editor/src/workspace/startupBlockers/FsChanged.tsx
deleted file mode 100644
index 980aac6d25..0000000000
--- a/packages/online-editor/src/workspace/startupBlockers/FsChanged.tsx
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import * as React from "react";
-import { useState } from "react";
-import { Modal } from "@patternfly/react-core/dist/js/components/Modal";
-import { ModalVariant } from "@patternfly/react-core/dist/esm/components/Modal";
-import { Button } from "@patternfly/react-core/dist/js/components/Button";
-import ExternalLinkSquareAltIcon from "@patternfly/react-icons/dist/esm/icons/external-link-square-alt-icon";
-import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
-import { StartupBlockerTemplate } from "./StartupBlockerTemplate";
-import { KieIcon } from "./KieIcon";
-import { LATEST_VERSION_COMPATIBLE_WITH_LFS } from "./LatestCompatibleVersion";
-
-const OLD_WORKSPACES_IDB_NAME = "workspaces";
-
-export async function isTrue() {
-  const dbs = await indexedDB.databases();
-  return dbs.map((db) => db.name).indexOf(OLD_WORKSPACES_IDB_NAME) > 0;
-}
-
-export function Component() {
-  const [isDeleteConfirmationModalOpen, setDeleteConfirmationModalOpen] = useState(false);
-  const [isDeleting, setDeleting] = useState(false);
-
-  return (
-    <StartupBlockerTemplate>
-      <Modal
-        variant={ModalVariant.small}
-        isOpen={isDeleteConfirmationModalOpen}
-        showClose={false}
-        titleIconVariant={KieIcon}
-        title={"Please confirm deleting everything"}
-        actions={[
-          <Button
-            key="delete-everything"
-            variant="primary"
-            isLarge={true}
-            style={{ width: "50%", backgroundColor: "var(--pf-c-button--m-danger--BackgroundColor)" }}
-            isLoading={isDeleting}
-            onClick={async () => {
-              setDeleting(true);
-              await Promise.all(
-                (await indexedDB.databases())
-                  .filter((db) => db.name)
-                  .map(async (db) => indexedDB.deleteDatabase(db.name!))
-              );
-              window.location.reload();
-            }}
-          >
-            Delete everything
-            <br />
-            and start fresh
-          </Button>,
-          <Button
-            key="latest-version"
-            variant="tertiary"
-            iconPosition="right"
-            style={{ width: "50%" }}
-            icon={<ExternalLinkSquareAltIcon />}
-            isLarge={true}
-            onClick={() => {
-              window.open(LATEST_VERSION_COMPATIBLE_WITH_LFS);
-            }}
-          >
-            Open latest
-            <br />
-            compatible version
-          </Button>,
-        ]}
-      >
-        <br />
-        <TextContent>
-          <Text component={TextVariants.h4}>This action cannot be undone.</Text>
-        </TextContent>
-        <br />
-        <hr />
-        <br />
-        Continuing will delete all models you have saved on this browser. Please certify that your work is already
-        persisted somewhere else.
-        <br />
-        <br />
-        {`If you're not sure, proceed to the latest compatible version to push or download your models.`}
-      </Modal>
-      <Modal
-        showClose={false}
-        isOpen={!isDeleteConfirmationModalOpen}
-        variant={ModalVariant.small}
-        title={"Oops!"}
-        titleIconVariant={KieIcon}
-        actions={[
-          <Button
-            key="delete-everything"
-            variant="primary"
-            isLarge={true}
-            style={{ width: "50%" }}
-            onClick={() => setDeleteConfirmationModalOpen(true)}
-          >
-            Delete everything
-            <br />
-            and start fresh
-          </Button>,
-          <Button
-            key="latest-version"
-            variant="secondary"
-            iconPosition="right"
-            style={{ width: "50%" }}
-            icon={<ExternalLinkSquareAltIcon />}
-            isLarge={true}
-            onClick={() => {
-              window.open(LATEST_VERSION_COMPATIBLE_WITH_LFS);
-            }}
-          >
-            Open latest
-            <br />
-            compatible version
-          </Button>,
-        ]}
-      >
-        <br />
-        <TextContent>
-          <Text component={TextVariants.h4}>KIE Sandbox has changed the way it saves your models.</Text>
-        </TextContent>
-        <br />
-        <hr />
-        <br />
-        {`If you have work that is not saved outside of this browser yet, proceed to the latest compatible version to push or download your models.`}
-        <br />
-        <br />
-        {`If your work is already safe somewhere else, start fresh by deleting the old models.`}
-        <br />
-      </Modal>
-    </StartupBlockerTemplate>
-  );
-}
diff --git a/packages/online-editor/src/workspace/startupBlockers/IncompatibleBrowser.tsx b/packages/online-editor/src/workspace/startupBlockers/IncompatibleBrowser.tsx
index 033afe714f..81d95665b3 100644
--- a/packages/online-editor/src/workspace/startupBlockers/IncompatibleBrowser.tsx
+++ b/packages/online-editor/src/workspace/startupBlockers/IncompatibleBrowser.tsx
@@ -22,7 +22,8 @@ import * as Bowser from "bowser";
 import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
 import { List, ListItem } from "@patternfly/react-core/dist/js/components/List";
 import { KieIcon } from "./KieIcon";
-import { LATEST_VERSION_COMPATIBLE_WITH_LFS } from "./LatestCompatibleVersion";
+
+export const LATEST_VERSION_COMPATIBLE_WITH_LFS = "0.23.0";
 
 const hasNecessaryApis = window["SharedWorker"] && window["BroadcastChannel"];
 const isCompatibleBrowser = Bowser.getParser(window.navigator.userAgent).satisfies({
diff --git a/packages/serverless-logic-web-tools/src/index.tsx b/packages/serverless-logic-web-tools/src/index.tsx
index db8f193bdd..27441046d8 100644
--- a/packages/serverless-logic-web-tools/src/index.tsx
+++ b/packages/serverless-logic-web-tools/src/index.tsx
@@ -22,15 +22,12 @@ import { App } from "./App";
 import "../static/resources/style.css";
 import "../static/resources/application-services.css";
 import * as incompatibleBrowser from "./workspace/startupBlockers/IncompatibleBrowser";
-import * as fsChanged from "./workspace/startupBlockers/FsChanged";
 
 async function main() {
   const appContainer = document.getElementById("app")!;
 
   if (await incompatibleBrowser.isTrue()) {
     ReactDOM.render(<incompatibleBrowser.Component />, appContainer);
-  } else if (await fsChanged.isTrue()) {
-    ReactDOM.render(<fsChanged.Component />, appContainer);
   } else {
     ReactDOM.render(<App />, appContainer);
   }
diff --git a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/FsChanged.tsx b/packages/serverless-logic-web-tools/src/workspace/startupBlockers/FsChanged.tsx
deleted file mode 100644
index 29200a6a01..0000000000
--- a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/FsChanged.tsx
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import * as React from "react";
-import { useState } from "react";
-import { Modal } from "@patternfly/react-core/dist/js/components/Modal";
-import { ModalVariant } from "@patternfly/react-core/dist/esm/components/Modal";
-import { Button } from "@patternfly/react-core/dist/js/components/Button";
-import ExternalLinkSquareAltIcon from "@patternfly/react-icons/dist/esm/icons/external-link-square-alt-icon";
-import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
-import { StartupBlockerTemplate } from "./StartupBlockerTemplate";
-import { KieIcon } from "./KieIcon";
-import { LATEST_VERSION_COMPATIBLE_WITH_LFS } from "./LatestCompatibleVersion";
-import { APP_NAME } from "../../AppConstants";
-import Dexie from "dexie";
-
-const OLD_WORKSPACES_IDB_NAME = "workspaces";
-
-export async function isTrue() {
-  return await Dexie.exists(OLD_WORKSPACES_IDB_NAME);
-}
-
-export function Component() {
-  const [isDeleteConfirmationModalOpen, setDeleteConfirmationModalOpen] = useState(false);
-  const [isDeleting, setDeleting] = useState(false);
-
-  return (
-    <StartupBlockerTemplate>
-      <Modal
-        variant={ModalVariant.medium}
-        isOpen={isDeleteConfirmationModalOpen}
-        showClose={false}
-        titleIconVariant={KieIcon}
-        title={"Please confirm deleting everything"}
-        actions={[
-          <Button
-            key="delete-everything"
-            variant="primary"
-            isLarge={true}
-            style={{ width: "50%", backgroundColor: "var(--pf-c-button--m-danger--BackgroundColor)" }}
-            isLoading={isDeleting}
-            onClick={async () => {
-              setDeleting(true);
-              await Promise.all((await Dexie.getDatabaseNames()).map(async (dbName) => Dexie.delete(dbName)));
-              window.location.reload();
-            }}
-          >
-            Delete everything
-            <br />
-            and start fresh
-          </Button>,
-          <Button
-            key="latest-version"
-            variant="tertiary"
-            iconPosition="right"
-            style={{ width: "50%" }}
-            icon={<ExternalLinkSquareAltIcon />}
-            isLarge={true}
-            onClick={() => {
-              window.open(LATEST_VERSION_COMPATIBLE_WITH_LFS);
-            }}
-          >
-            Open latest
-            <br />
-            compatible version
-          </Button>,
-        ]}
-      >
-        <br />
-        <TextContent>
-          <Text component={TextVariants.h4}>This action cannot be undone.</Text>
-        </TextContent>
-        <br />
-        <hr />
-        <br />
-        Continuing will delete all models you have saved on this browser. Please certify that your work is already
-        persisted somewhere else.
-        <br />
-        <br />
-        {`If you're not sure, proceed to the latest compatible version to push or download your models.`}
-      </Modal>
-      <Modal
-        showClose={false}
-        isOpen={!isDeleteConfirmationModalOpen}
-        variant={ModalVariant.medium}
-        title={"Oops!"}
-        titleIconVariant={KieIcon}
-        actions={[
-          <Button
-            key="delete-everything"
-            variant="primary"
-            isLarge={true}
-            style={{ width: "50%" }}
-            onClick={() => setDeleteConfirmationModalOpen(true)}
-          >
-            Delete everything
-            <br />
-            and start fresh
-          </Button>,
-          <Button
-            key="latest-version"
-            variant="secondary"
-            iconPosition="right"
-            style={{ width: "50%" }}
-            icon={<ExternalLinkSquareAltIcon />}
-            isLarge={true}
-            onClick={() => {
-              window.open(LATEST_VERSION_COMPATIBLE_WITH_LFS);
-            }}
-          >
-            Open latest
-            <br />
-            compatible version
-          </Button>,
-        ]}
-      >
-        <br />
-        <TextContent>
-          <Text component={TextVariants.h4}>{`${APP_NAME} has changed the way it saves your models.`}</Text>
-        </TextContent>
-        <br />
-        <hr />
-        <br />
-        {`If you have work that is not saved outside of this browser yet, proceed to the latest compatible version to push or download your models.`}
-        <br />
-        <br />
-        {`If your work is already safe somewhere else, start fresh by deleting the old models.`}
-        <br />
-      </Modal>
-    </StartupBlockerTemplate>
-  );
-}
diff --git a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/IncompatibleBrowser.tsx b/packages/serverless-logic-web-tools/src/workspace/startupBlockers/IncompatibleBrowser.tsx
index db9742e797..1f3af7c7bd 100644
--- a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/IncompatibleBrowser.tsx
+++ b/packages/serverless-logic-web-tools/src/workspace/startupBlockers/IncompatibleBrowser.tsx
@@ -21,10 +21,11 @@ import { StartupBlockerTemplate } from "./StartupBlockerTemplate";
 import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
 import { List, ListItem } from "@patternfly/react-core/dist/js/components/List";
 import { KieIcon } from "./KieIcon";
-import { LATEST_VERSION_COMPATIBLE_WITH_LFS } from "./LatestCompatibleVersion";
 import { APP_NAME } from "../../AppConstants";
 import { BROWSER_DETAILS, SUPPORTED_BROWSERS } from "./SupportedBrowsers";
 
+export const LATEST_VERSION_COMPATIBLE_WITH_LFS = "0.25.0";
+
 export async function isTrue() {
   return !BROWSER_DETAILS.isCompatible;
 }
diff --git a/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/toolbox/items/tooltip/Tooltip.java b/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/toolbox/items/tooltip/Tooltip.java
index 9a46dc5221..9121cd0bbd 100644
--- a/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/toolbox/items/tooltip/Tooltip.java
+++ b/packages/serverless-workflow-diagram-editor/lienzo-core/src/main/java/com/ait/lienzo/client/core/shape/toolbox/items/tooltip/Tooltip.java
@@ -26,6 +26,7 @@ import com.ait.lienzo.client.core.shape.Group;
 import com.ait.lienzo.client.core.shape.IPrimitive;
 import com.ait.lienzo.client.core.shape.MultiPath;
 import com.ait.lienzo.client.core.shape.Text;
+import com.ait.lienzo.client.core.shape.TextLineBreakWrap;
 import com.ait.lienzo.client.core.types.BoundingBox;
 import com.ait.lienzo.client.core.types.Point2D;
 import com.ait.lienzo.shared.core.types.Direction;
@@ -53,6 +54,7 @@ public class Tooltip {
                 new Text("")
                         .setFillColor(TEXT_COLOR).
                         setStrokeWidth(TEXT_STROKE_WIDTH);
+        this.text.setWrapper(new TextLineBreakWrap(this.text));
         this.group =
                 new Group()
                         .setAlpha(0)
@@ -213,7 +215,7 @@ public class Tooltip {
             case WEST:
                 path.setRotationDegrees(180);
                 textLoc.setX(-hl - tpw - tw)
-                        .setY((th / 2) - tph);
+                        .setY(((th / 2) - tph) * -1);
                 break;
             case NORTH:
                 path.setRotationDegrees(270);
@@ -228,7 +230,7 @@ public class Tooltip {
             default:
                 path.setRotationDegrees(0);
                 textLoc.setX(hl + tpw)
-                        .setY((th / 2) - tph);
+                        .setY(((th / 2) - tph) * -1);
         }
 
         // Location.
diff --git a/packages/serverless-workflow-diagram-editor/lienzo-webapp/src/main/java/org/kie/lienzo/client/BasicWiresExample.java b/packages/serverless-workflow-diagram-editor/lienzo-webapp/src/main/java/org/kie/lienzo/client/BasicWiresExample.java
index 143538687c..776dc14a40 100644
--- a/packages/serverless-workflow-diagram-editor/lienzo-webapp/src/main/java/org/kie/lienzo/client/BasicWiresExample.java
+++ b/packages/serverless-workflow-diagram-editor/lienzo-webapp/src/main/java/org/kie/lienzo/client/BasicWiresExample.java
@@ -10,6 +10,8 @@ import com.ait.lienzo.client.core.shape.wires.WiresContainer;
 import com.ait.lienzo.client.core.shape.wires.WiresManager;
 import com.ait.lienzo.client.core.shape.wires.WiresShape;
 import com.ait.lienzo.client.core.types.Point2D;
+import com.ait.lienzo.shared.core.types.EventPropagationMode;
+import com.ait.lienzo.tools.client.event.HandlerRegistration;
 
 import static org.kie.lienzo.client.util.WiresUtils.connect;
 
@@ -19,12 +21,11 @@ public class BasicWiresExample extends BaseExample implements Example {
     public static final String BLUE_RECTANGLE = "blueRectangle";
     public static final String CIRCLE = "circle";
     public static final String PARENT = "parent";
-
+    private HandlerRegistration redRectangleMouseEnterHandler;
+    private HandlerRegistration redRectangleMouseExitHandler;
+    private HandlerRegistration parentMouseEnterHandler;
+    private HandlerRegistration parentMouseExitHandler;
     private WiresManager wiresManager;
-    private WiresShape shapeRedRectangle;
-    private WiresShape shapeCircle;
-    private WiresShape shapeBlueRectangle;
-    private WiresShape shapeParent;
 
     public BasicWiresExample(final String title) {
         super(title);
@@ -51,29 +52,44 @@ public class BasicWiresExample extends BaseExample implements Example {
         wiresManager.setLocationAcceptor(ILocationAcceptor.ALL);
         wiresManager.setControlPointsAcceptor(IControlPointsAcceptor.ALL);
 
-        shapeRedRectangle = createShape(RED_RECTANGLE,
-                                        new MultiPath().rect(0, 0, 100, 100)
-                                                .setStrokeColor("#FF0000")
-                                                .setFillColor("#FF0000"),
-                                        new Point2D(100, 50));
-
-        shapeCircle = createShape(CIRCLE,
-                                  new MultiPath().circle(50)
-                                          .setStrokeColor("#FF0000")
-                                          .setFillColor("#FF0000"),
-                                  new Point2D(400, 50));
-
-        shapeBlueRectangle = createShape(BLUE_RECTANGLE,
-                                         new MultiPath().rect(0, 0, 100, 100)
-                                                 .setStrokeColor("#0000FF")
-                                                 .setFillColor("#0000FF"),
-                                         new Point2D(650, 50));
-
-        shapeParent = createShape(PARENT,
-                                  new MultiPath().rect(0, 0, 600, 250)
-                                          .setStrokeColor("#000000")
-                                          .setFillColor("#FFFFFF"),
-                                  new Point2D(50, 300));
+        MultiPath redRectangle = new MultiPath().rect(0, 0, 100, 100)
+                .setStrokeColor("#FF0000")
+                .setFillColor("#FF0000");
+        redRectangleMouseEnterHandler = redRectangle.addNodeMouseEnterHandler(event -> {
+            console.log("red rectangle ENTER");
+        });
+        redRectangleMouseExitHandler = redRectangle.addNodeMouseExitHandler(event -> {
+            console.log("red rectangle EXIT");
+        });
+        redRectangle.setEventPropagationMode(EventPropagationMode.LAST_ANCESTOR);
+        WiresShape shapeRedRectangle = createShape(RED_RECTANGLE,
+                                                   redRectangle,
+                                                   new Point2D(100, 50));
+
+        WiresShape shapeCircle = createShape(CIRCLE,
+                                             new MultiPath().circle(50)
+                                                     .setStrokeColor("#FF0000")
+                                                     .setFillColor("#FF0000"),
+                                             new Point2D(400, 50));
+
+        WiresShape shapeBlueRectangle = createShape(BLUE_RECTANGLE,
+                                                    new MultiPath().rect(0, 0, 100, 100)
+                                                            .setStrokeColor("#0000FF")
+                                                            .setFillColor("#0000FF"),
+                                                    new Point2D(650, 50));
+
+        MultiPath parent = new MultiPath().rect(0, 0, 600, 250)
+                .setStrokeColor("#000000")
+                .setFillColor("#FFFFFF");
+        parentMouseEnterHandler = parent.addNodeMouseEnterHandler(event -> {
+            console.log("PARENT ENTER");
+        });
+        parentMouseExitHandler = parent.addNodeMouseExitHandler(event -> {
+            console.log("PARENT EXIT");
+        });
+        WiresShape shapeParent = createShape(PARENT,
+                                             parent,
+                                             new Point2D(50, 300));
 
         connect(shapeRedRectangle.getMagnets(),
                 3,
@@ -126,4 +142,13 @@ public class BasicWiresExample extends BaseExample implements Example {
         }
         return true;
     }
+
+    @Override
+    public void destroy() {
+        super.destroy();
+        redRectangleMouseEnterHandler.removeHandler();
+        redRectangleMouseExitHandler.removeHandler();
+        parentMouseEnterHandler.removeHandler();
+        parentMouseExitHandler.removeHandler();
+    }
 }
diff --git a/packages/serverless-workflow-diagram-editor/lienzo-webapp/src/main/java/org/kie/lienzo/client/EventExample.java b/packages/serverless-workflow-diagram-editor/lienzo-webapp/src/main/java/org/kie/lienzo/client/EventExample.java
index 2ca9b43891..b5bf359acf 100644
--- a/packages/serverless-workflow-diagram-editor/lienzo-webapp/src/main/java/org/kie/lienzo/client/EventExample.java
+++ b/packages/serverless-workflow-diagram-editor/lienzo-webapp/src/main/java/org/kie/lienzo/client/EventExample.java
@@ -31,10 +31,13 @@ import com.ait.lienzo.client.core.shape.Triangle;
 import com.ait.lienzo.client.core.types.Point2D;
 import com.ait.lienzo.gwtlienzo.event.shared.EventHandler;
 import com.ait.lienzo.shared.core.types.ColorName;
+import com.ait.lienzo.shared.core.types.EventPropagationMode;
 import org.kie.lienzo.client.util.Console;
 
 public class EventExample extends BaseExample implements Example {
 
+    MultiPath container;
+
     public EventExample(final String title) {
         super(title);
     }
@@ -56,16 +59,26 @@ public class EventExample extends BaseExample implements Example {
     }
 
     private void createDragTests() {
-        Rectangle rect = new Rectangle(500, 200);
-        rect.setX(50).setY(50);
-        rect.setFillColor(ColorName.PALEVIOLETRED);
-        rect.setStrokeColor(ColorName.PALEVIOLETRED);
-        rect.setDraggable(true);
-        layer.add(rect);
-
-        addHandlers(rect, NodeDragStartHandler.class, NodeDragMoveHandler.class, NodeDragEndHandler.class);
-
-        rect = new Rectangle(100, 100);
+        container = new MultiPath().rect(50, 50, 500, 200);
+        container.setID("Container");
+        container.setX(50).setY(50);
+        container.setFillColor(ColorName.PALEVIOLETRED);
+        container.setStrokeColor(ColorName.PALEVIOLETRED);
+        container.setEventPropagationMode(EventPropagationMode.NO_ANCESTORS);
+        container.setDraggable(true);
+        layer.add(container);
+
+        addHandlers(container,
+                    NodeDragStartHandler.class,
+                    NodeDragMoveHandler.class,
+                    NodeDragEndHandler.class,
+                    NodeMouseClickHandler.class,
+                    NodeMouseEnterHandler.class,
+                    NodeMouseExitHandler.class,
+                    NodeMouseOutHandler.class,
+                    NodeMouseOverHandler.class);
+
+        Rectangle rect = new Rectangle(100, 100);
         rect.setX(250).setY(100);
         rect.setFillColor(ColorName.DARKGRAY);
         rect.setStrokeColor(ColorName.DARKGRAY);
@@ -77,13 +90,15 @@ public class EventExample extends BaseExample implements Example {
 
     private void createMouseEnterExitTests() {
         Circle circ = new Circle(50);
+        circ.setID("YELLOWGREEN circle");
         circ.setX(150).setY(150);
         circ.setFillColor(ColorName.YELLOWGREEN);
         circ.setStrokeColor(ColorName.YELLOWGREEN);
-        circ.setDraggable(true);
+        circ.setEventPropagationMode(EventPropagationMode.FIRST_ANCESTOR);
+        circ.setDraggable(false);
         layer.add(circ);
 
-        addHandlers(circ, NodeMouseEnterHandler.class, NodeMouseExitHandler.class);
+        addHandlers(circ, NodeMouseEnterHandler.class, NodeMouseExitHandler.class, NodeMouseClickHandler.class);
 
         circ = new Circle(50);
         circ.setX(150).setY(350);
@@ -208,57 +223,57 @@ public class EventExample extends BaseExample implements Example {
 
         @Override
         public void onNodeDragStart(final NodeDragStartEvent event) {
-            console.log("drag start");
+            console.log(event.getSource().getID() + ": " + "drag start");
         }
 
         @Override
         public void onNodeDragMove(final NodeDragMoveEvent event) {
-            console.log("drag move");
+            console.log(event.getSource().getID() + ": " + "drag move");
         }
 
         @Override
         public void onNodeDragEnd(final NodeDragEndEvent event) {
-            console.log("drag end");
+            console.log(event.getSource().getID() + ": " + "drag end");
         }
 
         @Override
         public void onNodeMouseEnter(final NodeMouseEnterEvent event) {
-            console.log("mouse enter");
+            console.log(event.getSource().getID() + ": " + "mouse enter");
         }
 
         @Override
         public void onNodeMouseExit(final NodeMouseExitEvent event) {
-            console.log("mouse exit");
+            console.log(event.getSource().getID() + ": " + "mouse exit");
         }
 
         @Override
         public void onNodeMouseUp(final NodeMouseUpEvent event) {
-            console.log("mouse up");
+            console.log(event.getSource().getID() + ": " + "mouse up");
         }
 
         @Override
         public void onNodeMouseDown(final NodeMouseDownEvent event) {
-            console.log("mouse down");
+            console.log(event.getSource().getID() + ": " + "mouse down");
         }
 
         @Override
         public void onNodeMouseClick(final NodeMouseClickEvent event) {
-            console.log("mouse click");
+            console.log(event.getSource().getID() + ": " + "mouse click");
         }
 
         @Override
         public void onNodeMouseDoubleClick(final NodeMouseDoubleClickEvent event) {
-            console.log("mouse double click");
+            console.log(event.getSource().getID() + ": " + "mouse double click");
         }
 
         @Override
         public void onNodeMouseOver(final NodeMouseOverEvent event) {
-            console.log("mouse over");
+            console.log(event.getSource().getID() + ": " + "mouse over");
         }
 
         @Override
         public void onNodeMouseOut(final NodeMouseOutEvent event) {
-            console.log("mouse out");
+            console.log(event.getSource().getID() + ": " + "mouse out");
         }
     }
 }
diff --git a/packages/serverless-workflow-diagram-editor/lienzo-webapp/src/main/java/org/kie/lienzo/client/WiresDockingExample.java b/packages/serverless-workflow-diagram-editor/lienzo-webapp/src/main/java/org/kie/lienzo/client/WiresDockingExample.java
index 8301bada40..3757aa1336 100644
--- a/packages/serverless-workflow-diagram-editor/lienzo-webapp/src/main/java/org/kie/lienzo/client/WiresDockingExample.java
+++ b/packages/serverless-workflow-diagram-editor/lienzo-webapp/src/main/java/org/kie/lienzo/client/WiresDockingExample.java
@@ -24,9 +24,6 @@ public class WiresDockingExample extends BaseExample implements Example {
 
     @Override
     public void run() {
-
-//        getToolBarContainer().add(m_label);
-
         final WiresManager wires_manager = WiresManager.get(layer);
 
         wires_manager.setContainmentAcceptor(IContainmentAcceptor.ALL);
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/definition/ModelUtils.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/definition/ModelUtils.java
index 0e6fc851f3..68808ec05b 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/definition/ModelUtils.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/definition/ModelUtils.java
@@ -79,7 +79,6 @@ public class ModelUtils {
             state.setName((String) Js.undefined());
             state.setType((String) Js.undefined());
             state.setTransition((String) Js.undefined());
-            state.setEventTimeout((String) Js.undefined());
             state.setCompensatedBy((String) Js.undefined());
             state.setEnd(false);
             if (null != state.getOnErrors()) {
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/definition/ParallelStateBranch.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/definition/ParallelStateBranch.java
index ed1c18ef02..90ecab16ad 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/definition/ParallelStateBranch.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/definition/ParallelStateBranch.java
@@ -16,11 +16,7 @@
 
 package org.kie.workbench.common.stunner.sw.definition;
 
-import jakarta.json.bind.annotation.JsonbTypeDeserializer;
-import jakarta.json.bind.annotation.JsonbTypeSerializer;
 import jsinterop.annotations.JsType;
-import org.kie.workbench.common.stunner.sw.definition.custom.WorkflowTimeoutsJsonDeserializer;
-import org.kie.workbench.common.stunner.sw.definition.custom.WorkflowTimeoutsJsonSerializer;
 
 @JsType
 public class ParallelStateBranch {
@@ -28,9 +24,7 @@ public class ParallelStateBranch {
     private String name;
     private ActionNode[] actions;
 
-    @JsonbTypeSerializer(WorkflowTimeoutsJsonSerializer.class)
-    @JsonbTypeDeserializer(WorkflowTimeoutsJsonDeserializer.class)
-    private Object timeouts;
+    private WorkflowTimeouts timeouts;
 
     public final String getName() {
         return name;
@@ -48,11 +42,11 @@ public class ParallelStateBranch {
         this.actions = actions;
     }
 
-    public final Object getTimeouts() {
+    public final WorkflowTimeouts getTimeouts() {
         return timeouts;
     }
 
-    public final void setTimeouts(Object timeouts) {
+    public final void setTimeouts(WorkflowTimeouts timeouts) {
         this.timeouts = timeouts;
     }
 }
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/definition/State.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/definition/State.java
index af2c38e2f3..15627ded35 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/definition/State.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/definition/State.java
@@ -35,13 +35,11 @@ import org.kie.workbench.common.stunner.sw.definition.custom.StateEndDefinitionJ
 import org.kie.workbench.common.stunner.sw.definition.custom.StateEndDefinitionJsonbTypeSerializer;
 import org.kie.workbench.common.stunner.sw.definition.custom.StateTransitionDefinitionJsonbTypeDeserializer;
 import org.kie.workbench.common.stunner.sw.definition.custom.StateTransitionDefinitionJsonbTypeSerializer;
-import org.kie.workbench.common.stunner.sw.definition.custom.WorkflowTimeoutsJsonDeserializer;
-import org.kie.workbench.common.stunner.sw.definition.custom.WorkflowTimeoutsJsonSerializer;
 
 /**
  * This class defines workflow states define building blocks of the workflow execution instructions.
  * They define the control flow logic instructions on what the workflow is supposed to do.
- *
+ * <p>
  * Type of the state is specified by its category, which is set in constructor for all its descendants.
  */
 @Bindable
@@ -94,11 +92,6 @@ public class State {
      */
     private ErrorTransition[] onErrors;
 
-    /**
-     * State specific timeouts.
-     */
-    private String eventTimeout;
-
     /**
      * Unique name of a workflow state which is responsible for compensation of this state.
      */
@@ -106,10 +99,7 @@ public class State {
 
     private StateDataFilter stateDataFilter;
 
-
-    @JsonbTypeSerializer(WorkflowTimeoutsJsonSerializer.class)
-    @JsonbTypeDeserializer(WorkflowTimeoutsJsonDeserializer.class)
-    private Object timeouts;
+    private WorkflowTimeouts timeouts;
 
     public State() {
         this.name = "State";
@@ -160,15 +150,6 @@ public class State {
         return this;
     }
 
-    public String getEventTimeout() {
-        return eventTimeout;
-    }
-
-    public State setEventTimeout(String eventTimeout) {
-        this.eventTimeout = eventTimeout;
-        return this;
-    }
-
     public String getCompensatedBy() {
         return compensatedBy;
     }
@@ -193,6 +174,7 @@ public class State {
     public void setMetadata(Metadata metadata) {
         this.metadata = metadata;
     }
+
     public StateDataFilter getStateDataFilter() {
         return stateDataFilter;
     }
@@ -201,11 +183,11 @@ public class State {
         this.stateDataFilter = stateDataFilter;
     }
 
-    public Object getTimeouts() {
+    public WorkflowTimeouts getTimeouts() {
         return timeouts;
     }
 
-    public void setTimeouts(Object timeouts) {
+    public void setTimeouts(WorkflowTimeouts timeouts) {
         this.timeouts = timeouts;
     }
 }
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/definition/Timeout.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/definition/Timeout.java
index b9a69ab74b..ce772a3105 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/definition/Timeout.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/definition/Timeout.java
@@ -25,7 +25,6 @@ import org.kie.workbench.common.stunner.core.definition.annotation.definition.Ca
 import org.kie.workbench.common.stunner.core.definition.annotation.definition.Labels;
 import org.kie.workbench.common.stunner.core.definition.annotation.morph.MorphBase;
 
-// TODO: Timeouts are not being used for now, consider dropping all related classes and usages.
 @MorphBase(defaultType = EventTimeout.class)
 public class Timeout {
 
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/StateMarshalling.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/StateMarshalling.java
index cf89fee5a6..42241df6f3 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/StateMarshalling.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/main/java/org/kie/workbench/common/stunner/sw/marshall/StateMarshalling.java
@@ -34,7 +34,6 @@ import org.kie.workbench.common.stunner.sw.definition.ErrorTransition;
 import org.kie.workbench.common.stunner.sw.definition.EventConditionTransition;
 import org.kie.workbench.common.stunner.sw.definition.EventRef;
 import org.kie.workbench.common.stunner.sw.definition.EventState;
-import org.kie.workbench.common.stunner.sw.definition.EventTimeout;
 import org.kie.workbench.common.stunner.sw.definition.ForEachState;
 import org.kie.workbench.common.stunner.sw.definition.OnEvent;
 import org.kie.workbench.common.stunner.sw.definition.OperationState;
@@ -125,13 +124,6 @@ public interface StateMarshalling {
                 List<Edge> outEdges = stateNode.getOutEdges();
                 for (Edge edge : outEdges) {
                     if (edge.getContent() instanceof Dock) {
-                        Node timeoutNode = edge.getTargetNode();
-                        if (null != timeoutNode) {
-                            Object def = getElementDefinition(timeoutNode);
-                            if (def instanceof EventTimeout) {
-                                state.setEventTimeout(((EventTimeout) def).getEventTimeout());
-                            }
-                        }
                     } else {
                         Object def = getElementDefinition(edge);
                         if (def instanceof ErrorTransition) {
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/StateMarshallingTest.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/StateMarshallingTest.java
index 9bb96f9b7c..7eeb7b5a40 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/StateMarshallingTest.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-api/src/test/java/org/kie/workbench/common/stunner/sw/marshall/StateMarshallingTest.java
@@ -63,9 +63,8 @@ public class StateMarshallingTest extends BaseMarshallingTest {
         assertTrue(workflow.getStates()[0].getEnd() instanceof StateEnd);
         final StateEnd end = (StateEnd) workflow.getStates()[0].getEnd();
         assertTrue(end.getTerminate());
-        assertEquals("{}",end.getContinueAs());
+        assertEquals("{}", end.getContinueAs());
         assertFalse(end.getCompensate());
-        //assertTrue(end.get("produceEvents").equals("[]"));
     }
 
     @Test
@@ -123,7 +122,6 @@ public class StateMarshallingTest extends BaseMarshallingTest {
         assertNull(state1.getTransition());
         assertFalse(DefinitionTypeUtils.getEnd(state1.getEnd()));
         assertNull(state1.getCompensatedBy());
-        assertNull(state1.getEventTimeout());
         assertNull(state1.getOnErrors());
     }
 
@@ -144,7 +142,6 @@ public class StateMarshallingTest extends BaseMarshallingTest {
         assertNull(state1.getTransition());
         assertFalse(DefinitionTypeUtils.getEnd(state1.getEnd()));
         assertNull(state1.getCompensatedBy());
-        assertNull(state1.getEventTimeout());
         assertNotNull(state1.getOnErrors());
         assertEquals(1, state1.getOnErrors().length);
         ErrorTransition onError = state1.getOnErrors()[0];
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/ShapeFactory.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/ShapeFactory.java
index 592c452e14..f8527c2b1b 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/ShapeFactory.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/ShapeFactory.java
@@ -71,7 +71,7 @@ public class ShapeFactory
         } else if (instance instanceof End) {
             return new EndShape();
         } else if (instance instanceof State) {
-            return new StateShape((State) instance, resourceContentService);
+            return StateShape.create((State) instance, resourceContentService);
         } else if (TransitionShape.isTransition(instance)) {
             return TransitionShape.create(instance).setAppearance(instance);
         }
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/CallbackStateShape.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/CallbackStateShape.java
new file mode 100644
index 0000000000..9f4f21b87f
--- /dev/null
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/CallbackStateShape.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kie.workbench.common.stunner.sw.client.shapes;
+
+import org.appformer.kogito.bridge.client.resource.ResourceContentService;
+import org.kie.workbench.common.stunner.core.client.shape.MutationContext;
+import org.kie.workbench.common.stunner.core.graph.Edge;
+import org.kie.workbench.common.stunner.core.graph.Node;
+import org.kie.workbench.common.stunner.core.graph.content.view.View;
+import org.kie.workbench.common.stunner.sw.client.shapes.icons.CornerIcon;
+import org.kie.workbench.common.stunner.sw.client.shapes.icons.IconPath;
+import org.kie.workbench.common.stunner.sw.definition.CallbackState;
+import org.kie.workbench.common.stunner.sw.definition.State;
+
+public class CallbackStateShape extends StateShape {
+
+    public static final String ICON_COLOR = "#EC7A08";
+    public static final String ICON_SVG = "M63.97,36.13c0-2.13-1.64-3.95-3.76-4.07-2.31-.13-4.23,1.7-4.23,3.99,0,6.61-5.37,11.98-11.98,11.98H24.03v-4.99c0-1.18-.7-2.25-1.78-2.74-1.08-.47-2.34-.28-3.23,.52l-9.98,8.98c-.63,.56-.99,1.37-.99,2.22s.36,1.66,.99,2.23l9.98,8.98c.56,.51,1.28,.77,2,.77,.41,0,.83-.09,1.22-.26,1.08-.48,1.78-1.55,1.78-2.74v-4.99h19.97c10.98,0,19.92-8.91,19.97-19.89ZM20,16.08h19.85l.11,4.99c0,1.18,.7,2.25,1.78,2.74,.4,.17,.81,.26,1.11,.26,.73,0,1.44-.27,2.01-.77l9.98- [...]
+
+    public CallbackStateShape(State state, ResourceContentService resourceContentService) {
+        super(state, resourceContentService);
+    }
+
+    @Override
+    public void applyProperties(Node<View<State>, Edge> element, MutationContext mutationContext) {
+        super.applyProperties(element, mutationContext);
+        CallbackState state = (CallbackState) element.getContent().getDefinition();
+        if (state.getTimeouts() != null) {
+            getView().addChild(new CornerIcon(IconPath.CLOCK,
+                                              "EventTimeout: " + state.getTimeouts().getEventTimeout() + "\r\n"
+                                                      + "StateExecTimeout: " + state.getTimeouts().getStateExecTimeout() + "\r\n"
+                                                      + "ActionExecTimeout: " + state.getTimeouts().getActionExecTimeout()));
+        }
+    }
+
+    @Override
+    public String getIconColor() {
+        return ICON_COLOR;
+    }
+
+    @Override
+    public String getIconSvg() {
+        return ICON_SVG;
+    }
+}
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/EndShape.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/EndShape.java
index 50d854263f..503a4404a2 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/EndShape.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/EndShape.java
@@ -16,11 +16,10 @@
 
 package org.kie.workbench.common.stunner.sw.client.shapes;
 
-import org.kie.workbench.common.stunner.core.client.shape.impl.NodeShapeImpl;
-
-public class EndShape extends NodeShapeImpl {
+public class EndShape extends ServerlessWorkflowShape<EndShapeView> {
 
     public EndShape() {
         super(new EndShapeView().asAbstractShape());
+        getShape().getShapeView().setController(this);
     }
 }
\ No newline at end of file
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/EndShapeView.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/EndShapeView.java
index 61be9546d7..841eafce69 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/EndShapeView.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/EndShapeView.java
@@ -18,7 +18,7 @@ package org.kie.workbench.common.stunner.sw.client.shapes;
 
 import com.ait.lienzo.client.core.shape.MultiPath;
 
-public class EndShapeView extends ServerlessWorkflowBasicShape<EndShapeView> {
+public class EndShapeView extends ServerlessWorkflowShapeView<EndShapeView> {
 
     private final static int END_SHAPE_SIZE = 46;
 
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/EventStateShape.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/EventStateShape.java
new file mode 100644
index 0000000000..6a23a4ad98
--- /dev/null
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/EventStateShape.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kie.workbench.common.stunner.sw.client.shapes;
+
+import org.appformer.kogito.bridge.client.resource.ResourceContentService;
+import org.kie.workbench.common.stunner.core.client.shape.MutationContext;
+import org.kie.workbench.common.stunner.core.graph.Edge;
+import org.kie.workbench.common.stunner.core.graph.Node;
+import org.kie.workbench.common.stunner.core.graph.content.view.View;
+import org.kie.workbench.common.stunner.sw.client.shapes.icons.CornerIcon;
+import org.kie.workbench.common.stunner.sw.client.shapes.icons.IconPath;
+import org.kie.workbench.common.stunner.sw.definition.EventState;
+import org.kie.workbench.common.stunner.sw.definition.State;
+
+public class EventStateShape extends StateShape {
+
+    public static final String ICON_COLOR = "#F4C145";
+    public static final String ICON_SVG = "M 45.254 45.197 L 36.216 45.197 L 42.206 31.792 C 42.613 30.98 42.307 29.965 41.597 29.355 C 40.887 28.746 39.768 28.849 39.06 29.457 L 19.561 45.705 C 18.953 46.215 18.646 47.128 18.953 47.939 C 19.258 48.754 19.968 49.262 20.883 49.262 L 29.921 49.262 L 23.928 62.667 C 23.521 63.478 23.825 64.493 24.538 65.103 C 24.943 65.51 25.247 65.609 25.756 65.609 C 26.263 65.609 26.67 65.406 27.076 65.103 L 46.573 48.854 C 47.183 48.347 47.488 47.431 47. [...]
+
+    public EventStateShape(State state, ResourceContentService resourceContentService) {
+        super(state, resourceContentService);
+    }
+
+    @Override
+    public void applyProperties(Node<View<State>, Edge> element, MutationContext mutationContext) {
+        super.applyProperties(element, mutationContext);
+        EventState state = (EventState) element.getContent().getDefinition();
+        if (state.getTimeouts() != null) {
+            getView().addChild(new CornerIcon(IconPath.CLOCK,
+                                              "EventTimeout: " + state.getTimeouts().getEventTimeout() + "\r\n"
+                                                      + "StateExecTimeout: " + state.getTimeouts().getStateExecTimeout() + "\r\n"
+                                                      + "ActionExecTimeout: " + state.getTimeouts().getActionExecTimeout()));
+        }
+    }
+
+    @Override
+    public String getIconColor() {
+        return ICON_COLOR;
+    }
+
+    @Override
+    public String getIconSvg() {
+        return ICON_SVG;
+    }
+}
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ForEachStateShape.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ForEachStateShape.java
new file mode 100644
index 0000000000..05b0f81d14
--- /dev/null
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ForEachStateShape.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kie.workbench.common.stunner.sw.client.shapes;
+
+import org.appformer.kogito.bridge.client.resource.ResourceContentService;
+import org.kie.workbench.common.stunner.core.client.shape.MutationContext;
+import org.kie.workbench.common.stunner.core.graph.Edge;
+import org.kie.workbench.common.stunner.core.graph.Node;
+import org.kie.workbench.common.stunner.core.graph.content.view.View;
+import org.kie.workbench.common.stunner.sw.client.shapes.icons.CornerIcon;
+import org.kie.workbench.common.stunner.sw.client.shapes.icons.IconPath;
+import org.kie.workbench.common.stunner.sw.definition.ForEachState;
+import org.kie.workbench.common.stunner.sw.definition.State;
+
+public class ForEachStateShape extends StateShape {
+
+    public static final String ICON_COLOR = "#8F4700";
+    public static final String ICON_SVG = "M64,32.22v27.24c0,2.34-1.91,4.49-4.24,4.65-2.68,.19-4.9-1.92-4.9-4.56v-27.43c0-2.64,2.22-4.75,4.9-4.56,2.34,.16,4.24,2.31,4.24,4.65M45.71,59.56c0,2.64-2.22,4.75-4.9,4.56-2.34-.16-4.24-2.31-4.24-4.65v-27.24c0-2.34,1.91-4.49,4.24-4.65,2.68-.19,4.9,1.92,4.9,4.56v27.43M27.43,4.79v27.24c0,2.34-1.91,4.49-4.24,4.65-2.68,.19-4.9-1.92-4.9-4.56V4.7C18.29,2.07,20.51-.04,23.18,.14c2.34,.16,4.24,2.31,4.24,4.65M9.14,32.13c0,2.64-2.22,4.75-4.9,4.56C1.91,36.53, [...]
+
+    public ForEachStateShape(State state, ResourceContentService resourceContentService) {
+        super(state, resourceContentService);
+    }
+
+    @Override
+    public void applyProperties(Node<View<State>, Edge> element, MutationContext mutationContext) {
+        super.applyProperties(element, mutationContext);
+        ForEachState state = (ForEachState) element.getContent().getDefinition();
+        if (state.getTimeouts() != null) {
+            getView().addChild(new CornerIcon(IconPath.CLOCK,
+                                              "StateExecTimeout: " + state.getTimeouts().getStateExecTimeout() + "\r\n"
+                                                      + "ActionExecTimeout: " + state.getTimeouts().getActionExecTimeout()));
+        }
+    }
+
+    @Override
+    public String getIconColor() {
+        return ICON_COLOR;
+    }
+
+    @Override
+    public String getIconSvg() {
+        return ICON_SVG;
+    }
+}
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/InjectStateShape.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/InjectStateShape.java
new file mode 100644
index 0000000000..f4620915d9
--- /dev/null
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/InjectStateShape.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kie.workbench.common.stunner.sw.client.shapes;
+
+import org.appformer.kogito.bridge.client.resource.ResourceContentService;
+import org.kie.workbench.common.stunner.sw.definition.State;
+
+public class InjectStateShape extends StateShape {
+
+    public static final String ICON_COLOR = "#8BC1F7";
+    public static final String ICON_SVG = "M35.02,28.49s-.03-.03-.05-.04l-10.29-10.29c-1.78-1.78-4.68-1.79-6.46,0-1.79,1.79-1.78,4.68,0,6.46l2.81,2.81H4.57c-2.52,0-4.57,2.04-4.57,4.57s2.05,4.57,4.57,4.57H20.94l-2.75,2.75c-1.78,1.78-1.79,4.68,0,6.46s4.68,1.78,6.46,0l10.09-10.09c.28-.2,.54-.44,.77-.71,.5-.58,.82-1.27,.97-2,.37-1.59-.11-3.33-1.46-4.5M.01,4.23C.19,1.83,2.25,0,4.66,0H59.43c2.53,0,4.57,2.05,4.57,4.57s-2.04,4.57-4.57,4.57H4.57C1.93,9.14-.18,6.91,.01,4.23M46.09,18.29h13.24c2.34, [...]
+
+    public InjectStateShape(State state, ResourceContentService resourceContentService) {
+        super(state, resourceContentService);
+    }
+
+    @Override
+    public String getIconColor() {
+        return ICON_COLOR;
+    }
+
+    @Override
+    public String getIconSvg() {
+        return ICON_SVG;
+    }
+}
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/OperationStateShape.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/OperationStateShape.java
new file mode 100644
index 0000000000..59d1377091
--- /dev/null
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/OperationStateShape.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kie.workbench.common.stunner.sw.client.shapes;
+
+import org.appformer.kogito.bridge.client.resource.ResourceContentService;
+import org.kie.workbench.common.stunner.core.client.shape.MutationContext;
+import org.kie.workbench.common.stunner.core.graph.Edge;
+import org.kie.workbench.common.stunner.core.graph.Node;
+import org.kie.workbench.common.stunner.core.graph.content.view.View;
+import org.kie.workbench.common.stunner.sw.client.shapes.icons.CornerIcon;
+import org.kie.workbench.common.stunner.sw.client.shapes.icons.IconPath;
+import org.kie.workbench.common.stunner.sw.definition.OperationState;
+import org.kie.workbench.common.stunner.sw.definition.State;
+
+public class OperationStateShape extends StateShape {
+
+    public static final String ICON_COLOR = "#0066CC";
+    public static final String ICON_SVG = "M61.99,20.83c.41,1.07,.06,2.29-.79,3.07l-5.41,4.93c.14,1.04,.21,2.1,.21,3.17s-.08,2.14-.21,3.17l5.41,4.92c.85,.79,1.2,2,.79,3.08-.55,1.49-1.21,2.92-1.96,4.29l-.59,1.01c-.83,1.38-1.75,2.68-2.76,3.91-.75,.89-1.96,1.2-3.06,.85l-6.96-2.22c-1.68,1.29-3.64,2.36-5.5,3.19l-1.56,7.14c-.25,1.12-1.12,1.92-2.28,2.22-1.72,.29-3.5,.44-5.42,.44-1.7,0-3.48-.15-5.2-.44-1.15-.3-2.02-1.1-2.27-2.22l-1.56-7.14c-1.98-.83-3.83-1.9-5.5-3.19l-6.96,2.22c-1.1,.35-2.32,.04 [...]
+
+    public OperationStateShape(State state, ResourceContentService resourceContentService) {
+        super(state, resourceContentService);
+    }
+
+    @Override
+    public void applyProperties(Node<View<State>, Edge> element, MutationContext mutationContext) {
+        super.applyProperties(element, mutationContext);
+        OperationState state = (OperationState) element.getContent().getDefinition();
+        if (state.getTimeouts() != null) {
+            getView().addChild(new CornerIcon(IconPath.CLOCK,
+                                              "StateExecTimeout: " + state.getTimeouts().getStateExecTimeout() + "\r\n"
+                                                      + "ActionExecTimeout: " + state.getTimeouts().getActionExecTimeout()));
+        }
+    }
+
+    @Override
+    public String getIconColor() {
+        return ICON_COLOR;
+    }
+
+    @Override
+    public String getIconSvg() {
+        return ICON_SVG;
+    }
+}
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ParallelStateShape.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ParallelStateShape.java
new file mode 100644
index 0000000000..c8f8448d4e
--- /dev/null
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ParallelStateShape.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kie.workbench.common.stunner.sw.client.shapes;
+
+import org.appformer.kogito.bridge.client.resource.ResourceContentService;
+import org.kie.workbench.common.stunner.core.client.shape.MutationContext;
+import org.kie.workbench.common.stunner.core.graph.Edge;
+import org.kie.workbench.common.stunner.core.graph.Node;
+import org.kie.workbench.common.stunner.core.graph.content.view.View;
+import org.kie.workbench.common.stunner.sw.client.shapes.icons.CornerIcon;
+import org.kie.workbench.common.stunner.sw.client.shapes.icons.IconPath;
+import org.kie.workbench.common.stunner.sw.definition.ParallelState;
+import org.kie.workbench.common.stunner.sw.definition.State;
+
+public class ParallelStateShape extends StateShape {
+
+    public static final String ICON_COLOR = "#4CB140";
+    public static final String ICON_SVG = "M50.54,.01c2.34,.16,4.24,2.31,4.24,4.65V59.43c0,2.64-2.23,4.75-4.91,4.56-2.33-.17-4.23-2.31-4.23-4.65V4.57c0-2.63,2.22-4.75,4.9-4.56M13.46,63.99c-2.34-.16-4.24-2.31-4.24-4.65V4.57c0-2.52,2.04-4.57,4.57-4.57s4.57,2.05,4.57,4.57V59.43c0,2.64-2.22,4.75-4.9,4.56Z";
+
+    public ParallelStateShape(State state, ResourceContentService resourceContentService) {
+        super(state, resourceContentService);
+    }
+
+    @Override
+    public void applyProperties(Node<View<State>, Edge> element, MutationContext mutationContext) {
+        super.applyProperties(element, mutationContext);
+        ParallelState state = (ParallelState) element.getContent().getDefinition();
+        if (state.getTimeouts() != null) {
+            getView().addChild(new CornerIcon(IconPath.CLOCK,
+                                              "BranchExecTimeout: " + state.getTimeouts().getBranchExecTimeout() + "\r\n"
+                                                      + "StateExecTimeout: " + state.getTimeouts().getStateExecTimeout()));
+        }
+    }
+
+    @Override
+    public String getIconColor() {
+        return ICON_COLOR;
+    }
+
+    @Override
+    public String getIconSvg() {
+        return ICON_SVG;
+    }
+}
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ServerlessWorkflowShape.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ServerlessWorkflowShape.java
new file mode 100644
index 0000000000..acd6097e67
--- /dev/null
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ServerlessWorkflowShape.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kie.workbench.common.stunner.sw.client.shapes;
+
+import com.ait.lienzo.client.core.event.NodeMouseEnterHandler;
+import com.ait.lienzo.client.core.event.NodeMouseExitHandler;
+import org.kie.workbench.common.stunner.core.client.shape.ShapeState;
+import org.kie.workbench.common.stunner.core.client.shape.impl.AbstractShape;
+import org.kie.workbench.common.stunner.core.client.shape.impl.NodeShapeImpl;
+import org.kie.workbench.common.stunner.core.client.shape.impl.ShapeStateHandler;
+import org.kie.workbench.common.stunner.sw.definition.State;
+
+public abstract class ServerlessWorkflowShape<V extends ServerlessWorkflowShapeView> extends NodeShapeImpl<State, V> {
+
+    public ServerlessWorkflowShape(final AbstractShape shape) {
+        super(shape);
+    }
+
+    public NodeMouseExitHandler getExitHandler() {
+        return event -> {
+            if (getShapeStateHandler().getShapeState() == ShapeState.SELECTED) {
+                return;
+            }
+            getShapeStateHandler().applyState(ShapeState.NONE);
+            getShapeView().getShape().getLayer().batch();
+        };
+    }
+
+    public NodeMouseEnterHandler getEnterHandler() {
+        return event -> {
+            if (getShapeStateHandler().getShapeState() == ShapeState.SELECTED) {
+                return;
+            }
+            getShapeStateHandler().applyState(ShapeState.HIGHLIGHT);
+            getShapeView().getShape().getLayer().batch();
+        };
+    }
+
+    protected ShapeStateHandler getShapeStateHandler() {
+        return getShapeView().getShapeStateHandler();
+    }
+}
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ServerlessWorkflowBasicShape.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ServerlessWorkflowShapeView.java
similarity index 66%
rename from packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ServerlessWorkflowBasicShape.java
rename to packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ServerlessWorkflowShapeView.java
index e173674522..d76deba61f 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ServerlessWorkflowBasicShape.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/ServerlessWorkflowShapeView.java
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.kie.workbench.common.stunner.sw.client.shapes;
 
 import com.ait.lienzo.client.core.event.NodeMouseEnterHandler;
@@ -12,12 +27,11 @@ import com.ait.lienzo.tools.client.event.HandlerRegistration;
 import org.kie.workbench.common.stunner.client.lienzo.shape.impl.ShapeStateDefaultHandler;
 import org.kie.workbench.common.stunner.client.lienzo.shape.view.ViewEventHandlerManager;
 import org.kie.workbench.common.stunner.client.lienzo.shape.view.wires.ext.WiresShapeViewExt;
-import org.kie.workbench.common.stunner.core.client.shape.ShapeState;
 import org.kie.workbench.common.stunner.core.client.shape.impl.AbstractShape;
 import org.kie.workbench.common.stunner.core.client.shape.impl.ShapeStateHandler;
 import org.kie.workbench.common.stunner.core.client.shape.view.event.ShapeViewSupportedEvents;
 
-public abstract class ServerlessWorkflowBasicShape<T extends ServerlessWorkflowBasicShape> extends WiresShapeViewExt<T> {
+public abstract class ServerlessWorkflowShapeView<VIEW extends ServerlessWorkflowShapeView<VIEW>> extends WiresShapeViewExt<VIEW> {
 
     protected final static String SHAPE_STROKE_COLOR = "#ccc";
     protected final static String SHAPE_FILL_COLOR = "#fff";
@@ -26,14 +40,16 @@ public abstract class ServerlessWorkflowBasicShape<T extends ServerlessWorkflowB
     protected final static double SHAPE_TITLE_FONT_SIZE = 12.00;
     protected final static String SHAPE_TITLE_FONT_FAMILY = "Open Sans";
 
+    private ServerlessWorkflowShape<VIEW> controller;
+
     private ShapeStateDefaultHandler shapeStateHandler = new ShapeStateDefaultHandler().setBorderShape((() -> this))
             .setBackgroundShape(() -> this);
 
-    private final HandlerRegistration mouseEnterHandler;
+    private HandlerRegistration mouseEnterHandler;
 
-    private final HandlerRegistration mouseExitHandler;
+    private HandlerRegistration mouseExitHandler;
 
-    public ServerlessWorkflowBasicShape(MultiPath path, String title) {
+    public ServerlessWorkflowShapeView(MultiPath path, String title) {
         this(path);
         setTitle(title);
         setTitlePosition(VerticalAlignment.MIDDLE, HorizontalAlignment.CENTER, ReferencePosition.INSIDE, Orientation.HORIZONTAL);
@@ -45,7 +61,7 @@ public abstract class ServerlessWorkflowBasicShape<T extends ServerlessWorkflowB
         isTitleListening(false);
     }
 
-    public ServerlessWorkflowBasicShape(MultiPath path) {
+    public ServerlessWorkflowShapeView(MultiPath path) {
         super(path
                       .setAlpha(1.00)
                       .setDraggable(false)
@@ -57,48 +73,46 @@ public abstract class ServerlessWorkflowBasicShape<T extends ServerlessWorkflowB
         setEventHandlerManager(new ViewEventHandlerManager(getShape(), getShape(), ShapeViewSupportedEvents.ALL_DESKTOP_EVENT_TYPES));
 
         getShape().setEventPropagationMode(EventPropagationMode.NO_ANCESTORS);
+    }
 
-        NodeMouseEnterHandler enterEvent = event -> {
-            if (shapeStateHandler.getShapeState() == ShapeState.SELECTED) {
-                return;
-            }
-            shapeStateHandler.applyState(ShapeState.HIGHLIGHT);
-        };
-        mouseEnterHandler = getShape().addNodeMouseEnterHandler(enterEvent);
+    public void setController(ServerlessWorkflowShape<VIEW> controller) {
+        this.controller = controller;
+        mouseEnterHandler = getShape().addNodeMouseEnterHandler(getEnterHandler());
+        mouseExitHandler = getShape().addNodeMouseExitHandler(getExitHandler());
+    }
 
-        NodeMouseExitHandler exitEvent = event -> {
-            if (shapeStateHandler.getShapeState() == ShapeState.SELECTED) {
-                return;
-            }
-            shapeStateHandler.applyState(ShapeState.NONE);
-        };
-        mouseExitHandler = getShape().addNodeMouseExitHandler(exitEvent);
+    public NodeMouseExitHandler getExitHandler() {
+        return controller.getExitHandler();
+    }
+
+    public NodeMouseEnterHandler getEnterHandler() {
+        return controller.getEnterHandler();
     }
 
     public ShapeStateHandler getShapeStateHandler() {
         return shapeStateHandler;
     }
 
-    public AbstractShape<ServerlessWorkflowBasicShape> asAbstractShape() {
-        return new AbstractShape<ServerlessWorkflowBasicShape>() {
+    public AbstractShape<ServerlessWorkflowShapeView<VIEW>> asAbstractShape() {
+        return new AbstractShape<ServerlessWorkflowShapeView<VIEW>>() {
             @Override
             public ShapeStateHandler getShapeStateHandler() {
-                return ServerlessWorkflowBasicShape.this.getShapeStateHandler();
+                return ServerlessWorkflowShapeView.this.getShapeStateHandler();
             }
 
             @Override
             public void setUUID(String uuid) {
-                ServerlessWorkflowBasicShape.this.setUUID(uuid);
+                ServerlessWorkflowShapeView.this.setUUID(uuid);
             }
 
             @Override
             public String getUUID() {
-                return ServerlessWorkflowBasicShape.this.getUUID();
+                return ServerlessWorkflowShapeView.this.getUUID();
             }
 
             @Override
-            public ServerlessWorkflowBasicShape getShapeView() {
-                return ServerlessWorkflowBasicShape.this;
+            public ServerlessWorkflowShapeView<VIEW> getShapeView() {
+                return ServerlessWorkflowShapeView.this;
             }
         };
     }
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/SleepStateShape.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/SleepStateShape.java
new file mode 100644
index 0000000000..d0d3bc45dd
--- /dev/null
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/SleepStateShape.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kie.workbench.common.stunner.sw.client.shapes;
+
+import org.appformer.kogito.bridge.client.resource.ResourceContentService;
+import org.kie.workbench.common.stunner.core.client.shape.MutationContext;
+import org.kie.workbench.common.stunner.core.graph.Edge;
+import org.kie.workbench.common.stunner.core.graph.Node;
+import org.kie.workbench.common.stunner.core.graph.content.view.View;
+import org.kie.workbench.common.stunner.sw.client.shapes.icons.CornerIcon;
+import org.kie.workbench.common.stunner.sw.client.shapes.icons.IconPath;
+import org.kie.workbench.common.stunner.sw.definition.SleepState;
+import org.kie.workbench.common.stunner.sw.definition.State;
+
+public class SleepStateShape extends StateShape {
+
+    public static final String ICON_COLOR = "#5752D1";
+    public static final String ICON_SVG = "M54.24,53.11c3.71-4.77,5.92-10.77,5.92-17.28,0-15.56-12.61-28.17-28.17-28.17S3.83,20.27,3.83,35.83c0,6.49,2.19,12.46,5.87,17.22l-2.53,2.53c-1.63,1.63-1.8,4.46-.28,6.2,1.74,2,4.76,2.07,6.59,.24l2.8-2.8c4.49,3.02,9.9,4.79,15.71,4.79s11.17-1.75,15.65-4.74l2.75,2.75c1.63,1.63,4.46,1.8,6.2,.28,2-1.74,2.07-4.76,.24-6.59l-2.59-2.59Zm-13.09-8.11l-10.59-7.06c-.74-.4-1.18-1.22-1.18-2.11l-.1-15c0-1.47,1.28-2.65,2.65-2.65,1.57,0,2.75,1.18,2.75,2.65v13.58l9. [...]
+
+    public SleepStateShape(State state, ResourceContentService resourceContentService) {
+        super(state, resourceContentService);
+    }
+
+    @Override
+    public void applyProperties(Node<View<State>, Edge> element, MutationContext mutationContext) {
+        super.applyProperties(element, mutationContext);
+        SleepState state = (SleepState) element.getContent().getDefinition();
+        getView().addChild(new CornerIcon(IconPath.CLOCK, "Duration: " + state.getDuration()));
+    }
+
+    @Override
+    public String getIconColor() {
+        return ICON_COLOR;
+    }
+
+    @Override
+    public String getIconSvg() {
+        return ICON_SVG;
+    }
+}
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/StartShape.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/StartShape.java
index 06bac41e46..61972f5a82 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/StartShape.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/StartShape.java
@@ -16,11 +16,10 @@
 
 package org.kie.workbench.common.stunner.sw.client.shapes;
 
-import org.kie.workbench.common.stunner.core.client.shape.impl.NodeShapeImpl;
-
-public class StartShape extends NodeShapeImpl {
+public class StartShape extends ServerlessWorkflowShape<StartShapeView> {
 
     public StartShape() {
         super(new StartShapeView().asAbstractShape());
+        getShape().getShapeView().setController(this);
     }
 }
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/StartShapeView.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/StartShapeView.java
index 7924057f95..0c12529a83 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/StartShapeView.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/StartShapeView.java
@@ -18,7 +18,7 @@ package org.kie.workbench.common.stunner.sw.client.shapes;
 
 import com.ait.lienzo.client.core.shape.MultiPath;
 
-public class StartShapeView extends ServerlessWorkflowBasicShape<StartShapeView> {
+public class StartShapeView extends ServerlessWorkflowShapeView<StartShapeView> {
 
     private final static double START_SHAPE_RADIUS = 25;
 
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/StateShape.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/StateShape.java
index 9a3efd283b..2caf80386e 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/StateShape.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/StateShape.java
@@ -16,35 +16,77 @@
 
 package org.kie.workbench.common.stunner.sw.client.shapes;
 
+import com.ait.lienzo.client.core.event.NodeMouseExitHandler;
 import com.ait.lienzo.client.core.shape.Picture;
 import com.ait.lienzo.client.core.types.Transform;
 import org.appformer.kogito.bridge.client.resource.ResourceContentService;
 import org.appformer.kogito.bridge.client.resource.interop.ResourceContentOptions;
 import org.kie.workbench.common.stunner.core.client.shape.HasShapeState;
-import org.kie.workbench.common.stunner.core.client.shape.impl.NodeShapeImpl;
+import org.kie.workbench.common.stunner.core.client.shape.MutationContext;
+import org.kie.workbench.common.stunner.core.client.shape.ShapeState;
+import org.kie.workbench.common.stunner.core.client.shape.impl.ShapeStateHandler;
+import org.kie.workbench.common.stunner.core.graph.Edge;
+import org.kie.workbench.common.stunner.core.graph.Node;
+import org.kie.workbench.common.stunner.core.graph.content.view.View;
 import org.kie.workbench.common.stunner.core.util.StringUtils;
 import org.kie.workbench.common.stunner.sw.definition.State;
 
-public class StateShape extends NodeShapeImpl implements HasShapeState {
+import static java.lang.Math.floor;
+import static java.lang.Math.min;
+import static java.lang.Math.pow;
+import static java.lang.Math.sqrt;
+import static org.kie.workbench.common.stunner.sw.client.shapes.StateShapeView.STATE_CORNER_RADIUS;
+
+public class StateShape extends ServerlessWorkflowShape<StateShapeView> implements HasShapeState {
 
-    public static final String INJECT_STATE_ICON = "M35.02,28.49s-.03-.03-.05-.04l-10.29-10.29c-1.78-1.78-4.68-1.79-6.46,0-1.79,1.79-1.78,4.68,0,6.46l2.81,2.81H4.57c-2.52,0-4.57,2.04-4.57,4.57s2.05,4.57,4.57,4.57H20.94l-2.75,2.75c-1.78,1.78-1.79,4.68,0,6.46s4.68,1.78,6.46,0l10.09-10.09c.28-.2,.54-.44,.77-.71,.5-.58,.82-1.27,.97-2,.37-1.59-.11-3.33-1.46-4.5M.01,4.23C.19,1.83,2.25,0,4.66,0H59.43c2.53,0,4.57,2.05,4.57,4.57s-2.04,4.57-4.57,4.57H4.57C1.93,9.14-.18,6.91,.01,4.23M46.09,18.29h13 [...]
-    public static final String SWITCH_STATE_ICON = "M60.6,46.54h-6.53v-8.71c-.06-1.38-.72-2.69-1.83-3.52l-7.42-5.56h0l-8.41-6.36V4.4C36.4,1.87,34.26-.17,31.69,.01c-2.25,.16-4.09,2.22-4.09,4.48V22.41l-8.41,6.31h0l-7.42,5.55c-1.11,.83-1.76,2.14-1.83,3.52v8.71H3.4c-2.94-.03-4.42,3.53-2.34,5.61l11.01,10.89c1.29,1.29,3.38,1.29,4.68,0l11.01-10.89c2.08-1.96,.61-5.52-2.34-5.47h-6.67v-6.63s8.22-6.08,13.28-9.87c4.96,3.73,13.2,9.92,13.24,9.9v6.63h-6.67c-2.94-.05-4.42,3.51-2.34,5.47l11.01,10.89c1.29 [...]
-    public static final String OPERATION_STATE_ICON = "M61.99,20.83c.41,1.07,.06,2.29-.79,3.07l-5.41,4.93c.14,1.04,.21,2.1,.21,3.17s-.08,2.14-.21,3.17l5.41,4.92c.85,.79,1.2,2,.79,3.08-.55,1.49-1.21,2.92-1.96,4.29l-.59,1.01c-.83,1.38-1.75,2.68-2.76,3.91-.75,.89-1.96,1.2-3.06,.85l-6.96-2.22c-1.68,1.29-3.64,2.36-5.5,3.19l-1.56,7.14c-.25,1.12-1.12,1.92-2.28,2.22-1.72,.29-3.5,.44-5.42,.44-1.7,0-3.48-.15-5.2-.44-1.15-.3-2.02-1.1-2.27-2.22l-1.56-7.14c-1.98-.83-3.83-1.9-5.5-3.19l-6.96,2.22c-1.1, [...]
-    public static final String EVENT_STATE_ICON = "M 45.254 45.197 L 36.216 45.197 L 42.206 31.792 C 42.613 30.98 42.307 29.965 41.597 29.355 C 40.887 28.746 39.768 28.849 39.06 29.457 L 19.561 45.705 C 18.953 46.215 18.646 47.128 18.953 47.939 C 19.258 48.754 19.968 49.262 20.883 49.262 L 29.921 49.262 L 23.928 62.667 C 23.521 63.478 23.825 64.493 24.538 65.103 C 24.943 65.51 25.247 65.609 25.756 65.609 C 26.263 65.609 26.67 65.406 27.076 65.103 L 46.573 48.854 C 47.183 48.347 47.488 47 [...]
-    public static final String CALLBACK_STATE_ICON = "M63.97,36.13c0-2.13-1.64-3.95-3.76-4.07-2.31-.13-4.23,1.7-4.23,3.99,0,6.61-5.37,11.98-11.98,11.98H24.03v-4.99c0-1.18-.7-2.25-1.78-2.74-1.08-.47-2.34-.28-3.23,.52l-9.98,8.98c-.63,.56-.99,1.37-.99,2.22s.36,1.66,.99,2.23l9.98,8.98c.56,.51,1.28,.77,2,.77,.41,0,.83-.09,1.22-.26,1.08-.48,1.78-1.55,1.78-2.74v-4.99h19.97c10.98,0,19.92-8.91,19.97-19.89ZM20,16.08h19.85l.11,4.99c0,1.18,.7,2.25,1.78,2.74,.4,.17,.81,.26,1.11,.26,.73,0,1.44-.27,2.0 [...]
-    public static final String FOR_EACH_STATE_ICON = "M64,32.22v27.24c0,2.34-1.91,4.49-4.24,4.65-2.68,.19-4.9-1.92-4.9-4.56v-27.43c0-2.64,2.22-4.75,4.9-4.56,2.34,.16,4.24,2.31,4.24,4.65M45.71,59.56c0,2.64-2.22,4.75-4.9,4.56-2.34-.16-4.24-2.31-4.24-4.65v-27.24c0-2.34,1.91-4.49,4.24-4.65,2.68-.19,4.9,1.92,4.9,4.56v27.43M27.43,4.79v27.24c0,2.34-1.91,4.49-4.24,4.65-2.68,.19-4.9-1.92-4.9-4.56V4.7C18.29,2.07,20.51-.04,23.18,.14c2.34,.16,4.24,2.31,4.24,4.65M9.14,32.13c0,2.64-2.22,4.75-4.9,4.56C [...]
-    public static final String PARALLEL_STATE_ICON = "M50.54,.01c2.34,.16,4.24,2.31,4.24,4.65V59.43c0,2.64-2.23,4.75-4.91,4.56-2.33-.17-4.23-2.31-4.23-4.65V4.57c0-2.63,2.22-4.75,4.9-4.56M13.46,63.99c-2.34-.16-4.24-2.31-4.24-4.65V4.57c0-2.52,2.04-4.57,4.57-4.57s4.57,2.05,4.57,4.57V59.43c0,2.64-2.22,4.75-4.9,4.56Z";
-    public static final String SLEEP_STATE_ICON = "M54.24,53.11c3.71-4.77,5.92-10.77,5.92-17.28,0-15.56-12.61-28.17-28.17-28.17S3.83,20.27,3.83,35.83c0,6.49,2.19,12.46,5.87,17.22l-2.53,2.53c-1.63,1.63-1.8,4.46-.28,6.2,1.74,2,4.76,2.07,6.59,.24l2.8-2.8c4.49,3.02,9.9,4.79,15.71,4.79s11.17-1.75,15.65-4.74l2.75,2.75c1.63,1.63,4.46,1.8,6.2,.28,2-1.74,2.07-4.76,.24-6.59l-2.59-2.59Zm-13.09-8.11l-10.59-7.06c-.74-.4-1.18-1.22-1.18-2.11l-.1-15c0-1.47,1.28-2.65,2.65-2.65,1.57,0,2.75,1.18,2.75,2.65v [...]
     public static final String ANSIBLE_STATE_ICON = "M 31.047 11.68 L 47.108 46.485 L 22.848 29.706 L 31.047 11.68 Z M 59.577 54.501 L 34.874 2.301 C 34.167 0.796 32.757 0 31.047 0 C 29.331 0 27.819 0.796 27.114 2.301 L 0 59.559 L 9.274 59.559 L 20.008 35.95 L 52.04 58.671 C 53.326 59.586 54.256 60 55.466 60 C 57.885 60 60 58.407 60 56.109 C 60 55.734 59.85 55.14 59.577 54.501 Z";
     public static final String KAOTO_STATE_ICON = "M 13.524 8.426 L 4.212 16.823 L 21.506 16.823 C 35.471 16.823 38.797 16.463 38.797 15.142 C 38.797 13.823 24.387 -0.091 23.056 0.03 C 22.833 0.03 18.512 3.868 13.524 8.426M 44.007 0.87 C 43.564 1.23 43.23 5.067 43.23 9.264 C 43.23 15.743 43.564 16.823 45.227 16.823 C 46.336 16.823 47.776 17.421 48.552 18.262 C 49.661 19.461 51.654 17.901 57.751 11.185 C 62.297 6.387 65.401 2.069 64.958 1.349 C 64.071 -0.091 45.227 -0.569 44.007 0.87M 54. [...]
 
     private final StateShapeView shapeView;
+    private final ResourceContentService resourceContentService;
+
+    protected StateShape(State state, ResourceContentService resourceContentService) {
+        this(state.getName(), resourceContentService);
+    }
+
+    protected StateShape(String name, ResourceContentService resourceContentService) {
+        super(new StateShapeView(name).asAbstractShape());
 
-    public StateShape(State state, ResourceContentService resourceContentService) {
-        this(state.getName());
+        this.resourceContentService = resourceContentService;
+        this.shapeView = getShape().getShapeView();
+        this.shapeView.setController(this);
+    }
+
+    public static StateShape create(State state, ResourceContentService resourceContentService) {
+        switch (state.getType()) {
+            case "inject":
+                return new InjectStateShape(state, resourceContentService);
+            case "switch":
+                return new SwitchStateShape(state, resourceContentService);
+            case "operation":
+                return new OperationStateShape(state, resourceContentService);
+            case "event":
+                return new EventStateShape(state, resourceContentService);
+            case "callback":
+                return new CallbackStateShape(state, resourceContentService);
+            case "foreach":
+                return new ForEachStateShape(state, resourceContentService);
+            case "parallel":
+                return new ParallelStateShape(state, resourceContentService);
+            case "sleep":
+                return new SleepStateShape(state, resourceContentService);
+            default:
+                // If type is missing create Inject By default.
+                return new InjectStateShape(state, resourceContentService);
+        }
+    }
 
+    @Override
+    public void applyProperties(Node<View<State>, Edge> element, MutationContext mutationContext) {
+        super.applyProperties(element, mutationContext);
+        State state = element.getContent().getDefinition();
         if (state.metadata == null) {
-            setType(state.getType());
+            shapeView.setSvgIcon(getIconColor(), getIconSvg());
             return;
         }
 
@@ -62,20 +104,14 @@ public class StateShape extends NodeShapeImpl implements HasShapeState {
         }
 
         if (StringUtils.nonEmpty(state.metadata.type)) {
-            setType(state.metadata.type);
+            setPredefinedIcon(state.metadata.type);
         }
 
         if (isIconEmpty()) {
-            setType(state.getType());
+            shapeView.setSvgIcon(getIconColor(), getIconSvg());
         }
     }
 
-    public StateShape(String name) {
-        super(new StateShapeView(name).asAbstractShape());
-
-        shapeView = (StateShapeView) getShape().getShapeView();
-    }
-
     private void loadIconFromFile(State state, ResourceContentService resourceContentService) {
         resourceContentService
                 .get(state.metadata.icon, ResourceContentOptions.binary())
@@ -105,32 +141,8 @@ public class StateShape extends NodeShapeImpl implements HasShapeState {
         return iconData;
     }
 
-    public StateShape setType(String type) {
+    public StateShape setPredefinedIcon(String type) {
         switch (type) {
-            case "inject":
-                shapeView.setSvgIcon("#8BC1F7", INJECT_STATE_ICON);
-                break;
-            case "switch":
-                shapeView.setSvgIcon("#009596", SWITCH_STATE_ICON);
-                break;
-            case "operation":
-                shapeView.setSvgIcon("#0066CC", OPERATION_STATE_ICON);
-                break;
-            case "event":
-                shapeView.setSvgIcon("#F4C145", EVENT_STATE_ICON);
-                break;
-            case "callback":
-                shapeView.setSvgIcon("#EC7A08", CALLBACK_STATE_ICON);
-                break;
-            case "foreach":
-                shapeView.setSvgIcon("#8F4700", FOR_EACH_STATE_ICON);
-                break;
-            case "parallel":
-                shapeView.setSvgIcon("#4CB140", PARALLEL_STATE_ICON);
-                break;
-            case "sleep":
-                shapeView.setSvgIcon("#5752D1", SLEEP_STATE_ICON);
-                break;
             case "ansible":
                 shapeView.setSvgIcon("#BB271A", ANSIBLE_STATE_ICON);
                 break;
@@ -142,6 +154,89 @@ public class StateShape extends NodeShapeImpl implements HasShapeState {
         return this;
     }
 
+    public String getIconColor() {
+        return "";
+    }
+
+    public String getIconSvg() {
+        return "";
+    }
+
+    public NodeMouseExitHandler getExitHandler() {
+        return event -> {
+            if (getShapeStateHandler().getShapeState() == ShapeState.SELECTED) {
+                return;
+            }
+
+            if (isInsideOfTheState(floor(event.getX() - event.getSource().getAbsoluteLocation().getX()),
+                                   floor(event.getY() - event.getSource().getAbsoluteLocation().getY()))) {
+                return;
+            }
+
+            getShapeStateHandler().applyState(ShapeState.NONE);
+            shapeView.batch();
+        };
+    }
+
+    protected ShapeStateHandler getShapeStateHandler() {
+        return getView().getShapeStateHandler();
+    }
+
+    protected boolean isInsideOfTheState(double x, double y) {
+        double width = getActualWidth();
+        double height = getActualHeight();
+
+        if (isOutsideOfTheBox(x, y, width, height)) {
+            return false;
+        }
+
+        return !isOutsideOfCorners(x, y, width, height);
+    }
+
+    public boolean isOutsideOfTheBox(double x, double y, double width, double height) {
+        return x <= getX()
+                || x >= getX() + width
+                || y <= getY()
+                || y >= getY() + height;
+    }
+
+    public static boolean isOutsideOfCorners(double x, double y, double width, double height) {
+        double checkX = width - x < STATE_CORNER_RADIUS ? width - x : x; // Normalize location to the top left corner
+        double checkY = height - y < STATE_CORNER_RADIUS ? height - y : y; // Normalize location to the top left corner
+        return isOutsideOfCorner(checkX, checkY);
+    }
+
+    public static boolean isOutsideOfCorner(double xCursorPosition, double yCursorPosition) {
+        // If cursor position is more than corner radius it means position is not at the corner but over the icon
+        if (STATE_CORNER_RADIUS < xCursorPosition
+                || STATE_CORNER_RADIUS < yCursorPosition) {
+            return false;
+        }
+        return sqrt(pow(STATE_CORNER_RADIUS - xCursorPosition, 2)
+                            + pow(STATE_CORNER_RADIUS - yCursorPosition, 2))
+                >= STATE_CORNER_RADIUS;
+    }
+
+    protected double getActualWidth() {
+        return shapeView.getShape().getBoundingBox().getWidth()
+                * shapeView.getShape().asNode().getAbsoluteTransform().getScaleX()
+                - 2; // to compensate border
+    }
+
+    protected double getActualHeight() {
+        return shapeView.getShape().getBoundingBox().getHeight()
+                * shapeView.getShape().asNode().getAbsoluteTransform().getScaleY()
+                - 1; // to compensate border
+    }
+
+    protected double getX() {
+        return shapeView.getShape().getX();
+    }
+
+    protected double getY() {
+        return shapeView.getShape().getY();
+    }
+
     public boolean isIconEmpty() {
         return shapeView.isIconEmpty();
     }
@@ -172,7 +267,6 @@ public class StateShape extends NodeShapeImpl implements HasShapeState {
      */
     public static double calculateIconScale(int width, int height) {
         double size = StateShapeView.STATE_SHAPE_ICON_RADIUS * 2;
-        int min = Math.min(width, height);
-        return size / min;
+        return size / min(width, height);
     }
 }
\ No newline at end of file
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/StateShapeView.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/StateShapeView.java
index 63463ae68f..6449f263d6 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/StateShapeView.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/StateShapeView.java
@@ -29,19 +29,19 @@ import com.ait.lienzo.shared.core.types.EventPropagationMode;
 import com.ait.lienzo.shared.core.types.TextAlign;
 import com.ait.lienzo.shared.core.types.TextBaseLine;
 
-public class StateShapeView extends ServerlessWorkflowBasicShape<StateShapeView> {
+public class StateShapeView extends ServerlessWorkflowShapeView<StateShapeView> {
 
     private Group iconImage;
     private Circle backgroundCircle;
-
-    private final static double STATE_SHAPE_WIDTH = 250;
-    private final static double STATE_SHAPE_HEIGHT = 90;
+    protected final static double STATE_SHAPE_WIDTH = 250;
+    protected final static double STATE_SHAPE_HEIGHT = 90;
     public final static double STATE_SHAPE_ICON_RADIUS = 25;
+    public final static double STATE_CORNER_RADIUS = 5.00;
 
     public StateShapeView(String name) {
         super(new MultiPath()
                       .rect(0, 0, STATE_SHAPE_WIDTH, STATE_SHAPE_HEIGHT)
-                      .setCornerRadius(5.00));
+                      .setCornerRadius(STATE_CORNER_RADIUS));
         initialize(name);
     }
 
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/SwitchStateShape.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/SwitchStateShape.java
new file mode 100644
index 0000000000..c9114e5707
--- /dev/null
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/SwitchStateShape.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kie.workbench.common.stunner.sw.client.shapes;
+
+import org.appformer.kogito.bridge.client.resource.ResourceContentService;
+import org.kie.workbench.common.stunner.core.client.shape.MutationContext;
+import org.kie.workbench.common.stunner.core.graph.Edge;
+import org.kie.workbench.common.stunner.core.graph.Node;
+import org.kie.workbench.common.stunner.core.graph.content.view.View;
+import org.kie.workbench.common.stunner.sw.client.shapes.icons.CornerIcon;
+import org.kie.workbench.common.stunner.sw.client.shapes.icons.IconPath;
+import org.kie.workbench.common.stunner.sw.definition.State;
+import org.kie.workbench.common.stunner.sw.definition.SwitchState;
+
+public class SwitchStateShape extends StateShape {
+
+    public static final String ICON_COLOR = "#009596";
+    public static final String ICON_SVG = "M60.6,46.54h-6.53v-8.71c-.06-1.38-.72-2.69-1.83-3.52l-7.42-5.56h0l-8.41-6.36V4.4C36.4,1.87,34.26-.17,31.69,.01c-2.25,.16-4.09,2.22-4.09,4.48V22.41l-8.41,6.31h0l-7.42,5.55c-1.11,.83-1.76,2.14-1.83,3.52v8.71H3.4c-2.94-.03-4.42,3.53-2.34,5.61l11.01,10.89c1.29,1.29,3.38,1.29,4.68,0l11.01-10.89c2.08-1.96,.61-5.52-2.34-5.47h-6.67v-6.63s8.22-6.08,13.28-9.87c4.96,3.73,13.2,9.92,13.24,9.9v6.63h-6.67c-2.94-.05-4.42,3.51-2.34,5.47l11.01,10.89c1.29,1.29,3.3 [...]
+
+    public SwitchStateShape(State state, ResourceContentService resourceContentService) {
+        super(state, resourceContentService);
+    }
+
+    @Override
+    public void applyProperties(Node<View<State>, Edge> element, MutationContext mutationContext) {
+        super.applyProperties(element, mutationContext);
+        SwitchState state = (SwitchState) element.getContent().getDefinition();
+        if (state.getTimeouts() != null) {
+            getView().addChild(new CornerIcon(IconPath.CLOCK,
+                                              "EventTimeout: " + state.getTimeouts().getEventTimeout() + "\r\n"
+                                                      + "StateExecTimeout: " + state.getTimeouts().getStateExecTimeout()));
+        }
+    }
+
+    @Override
+    public String getIconColor() {
+        return ICON_COLOR;
+    }
+
+    @Override
+    public String getIconSvg() {
+        return ICON_SVG;
+    }
+}
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/TransitionView.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/TransitionView.java
index 526163ad27..ddc7f103d6 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/TransitionView.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/TransitionView.java
@@ -28,7 +28,7 @@ public class TransitionView extends WiresConnectorViewExt<TransitionView> {
     private static final double SELECTION_OFFSET = 30;
     private static final double DECORATOR_WIDTH = 8;
     private static final double DECORATOR_HEIGHT = 12;
-
+    private static final double OVERLAP_CORRECTION = 3;
     private static final double STROKE_WIDTH = 2;
 
     private static final double[] DEFAULT_POLYLINE_POINTS = {0, 0, 100, 100};
@@ -71,11 +71,11 @@ public class TransitionView extends WiresConnectorViewExt<TransitionView> {
     private static MultiPath getArrowMultiPath() {
         return new MultiPath()
                 .M(DECORATOR_WIDTH,
-                   DECORATOR_HEIGHT)
+                   DECORATOR_HEIGHT + OVERLAP_CORRECTION)
                 .L(0,
-                   DECORATOR_HEIGHT)
+                   DECORATOR_HEIGHT + OVERLAP_CORRECTION)
                 .L(DECORATOR_WIDTH / 2,
-                   0)
+                   OVERLAP_CORRECTION)
                 .Z();
     }
 }
\ No newline at end of file
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/CornerIcon.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/CornerIcon.java
new file mode 100644
index 0000000000..d46281c066
--- /dev/null
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/CornerIcon.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kie.workbench.common.stunner.sw.client.shapes.icons;
+
+import com.ait.lienzo.client.core.shape.Group;
+import com.ait.lienzo.client.core.shape.MultiPath;
+import com.ait.lienzo.client.core.shape.Rectangle;
+import com.ait.lienzo.client.core.shape.toolbox.items.tooltip.PrimitiveTextTooltip;
+import com.ait.lienzo.shared.core.types.EventPropagationMode;
+import com.ait.lienzo.tools.client.event.HandlerRegistration;
+
+public class CornerIcon extends Group {
+
+    private final HandlerRegistration mouseEnterHandler;
+    private final HandlerRegistration mouseExitHandler;
+    private final String tooltipText;
+
+    private final Rectangle border = new Rectangle(20, 20)
+            .setFillColor("white")
+            .setFillAlpha(0.001)
+            .setStrokeAlpha(0.001)
+            .setStrokeColor("white")
+            .setCornerRadius(9)
+            .setEventPropagationMode(EventPropagationMode.NO_ANCESTORS)
+            .setListening(true);
+
+    public CornerIcon(String icon, String tooltip) {
+        setX(224);
+        setY(6);
+        setListening(true);
+        add(border);
+        this.tooltipText = tooltip;
+
+        PrimitiveTextTooltip tooltipElement = PrimitiveTextTooltip.Builder.build(tooltipText);
+        tooltipElement.withText(t -> {
+            t.setText(tooltipText);
+            t.setFontSize(12);
+        });
+        add(tooltipElement.asPrimitive());
+        tooltipElement.forComputedBoundingBox(border::getBoundingBox);
+
+        MultiPath clockIcon = new MultiPath(icon)
+                .setScale(2)
+                .setStrokeWidth(0)
+                .setFillColor("#CCC")
+                .setListening(false);
+        add(clockIcon);
+
+        mouseEnterHandler = border.addNodeMouseEnterHandler(event -> {
+            this.getParent().moveToTop();
+            tooltipElement.show();
+            clockIcon.setFillColor("#4F5255");
+        });
+        mouseExitHandler = border.addNodeMouseExitHandler(event -> {
+            tooltipElement.hide();
+            clockIcon.setFillColor("#CCC");
+            border.getLayer().batch();
+        });
+    }
+
+    @Override
+    public void destroy() {
+        super.destroy();
+        mouseEnterHandler.removeHandler();
+        mouseExitHandler.removeHandler();
+    }
+}
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/IconPath.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/IconPath.java
new file mode 100644
index 0000000000..7a5ad766a0
--- /dev/null
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/main/java/org/kie/workbench/common/stunner/sw/client/shapes/icons/IconPath.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kie.workbench.common.stunner.sw.client.shapes.icons;
+
+public interface IconPath {
+
+    String CLOCK = "M 4.531 2.344 C 4.531 2.084 4.74 1.875 5 1.875 C 5.26 1.875 5.469 2.084 5.469 2.344 L 5.469 4.75 L 7.135 5.859 C 7.35 6.004 7.408 6.295 7.248 6.51 C 7.121 6.725 6.83 6.783 6.615 6.623 L 4.74 5.373 C 4.609 5.303 4.531 5.156 4.531 4.982 L 4.531 2.344 Z M 5 0 C 7.762 0 10 2.238 10 5 C 10 7.762 7.762 10 5 10 C 2.238 10 0 7.762 0 5 C 0 2.238 2.238 0 5 0 Z M 0.938 5 C 0.938 7.244 2.756 9.063 5 9.063 C 7.244 9.063 9.063 7.244 9.063 5 C 9.063 2.756 7.244 0.938 5 0.938 C 2.756 [...]
+}
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/test/java/org/kie/workbench/common/stunner/sw/client/shapes/StateNode.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/test/java/org/kie/workbench/common/stunner/sw/client/shapes/StateNode.java
new file mode 100644
index 0000000000..5f20c32918
--- /dev/null
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/test/java/org/kie/workbench/common/stunner/sw/client/shapes/StateNode.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kie.workbench.common.stunner.sw.client.shapes;
+
+import java.util.List;
+import java.util.Set;
+
+import org.kie.workbench.common.stunner.core.graph.Edge;
+import org.kie.workbench.common.stunner.core.graph.Node;
+import org.kie.workbench.common.stunner.core.graph.content.view.View;
+import org.kie.workbench.common.stunner.sw.definition.State;
+
+public class StateNode implements Node<View<State>, Edge> {
+
+    private View<State> view;
+
+    public StateNode(View<State> view) {
+        this.view = view;
+    }
+
+    @Override
+    public List<Edge> getInEdges() {
+        return null;
+    }
+
+    @Override
+    public List<Edge> getOutEdges() {
+        return null;
+    }
+
+    @Override
+    public String getUUID() {
+        return null;
+    }
+
+    @Override
+    public Set<String> getLabels() {
+        return null;
+    }
+
+    @Override
+    public View<State> getContent() {
+        return view;
+    }
+
+    @Override
+    public void setContent(View<State> content) {
+        this.view = content;
+    }
+
+    @Override
+    public Node<View<State>, Edge> asNode() {
+        return null;
+    }
+
+    @Override
+    public Edge<View<State>, Node> asEdge() {
+        return null;
+    }
+}
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/test/java/org/kie/workbench/common/stunner/sw/client/shapes/StateShapeTest.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/test/java/org/kie/workbench/common/stunner/sw/client/shapes/StateShapeTest.java
index cd99e8da50..032145ca08 100644
--- a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/test/java/org/kie/workbench/common/stunner/sw/client/shapes/StateShapeTest.java
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/test/java/org/kie/workbench/common/stunner/sw/client/shapes/StateShapeTest.java
@@ -13,22 +13,40 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.kie.workbench.common.stunner.sw.client.shapes;
 
+import com.ait.lienzo.client.core.event.NodeMouseExitEvent;
 import com.ait.lienzo.test.LienzoMockitoTestRunner;
 import elemental2.promise.Promise;
 import org.appformer.kogito.bridge.client.resource.ResourceContentService;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.kie.workbench.common.stunner.core.client.shape.ShapeState;
+import org.kie.workbench.common.stunner.core.client.shape.impl.ShapeStateHandler;
+import org.kie.workbench.common.stunner.core.graph.Edge;
+import org.kie.workbench.common.stunner.core.graph.Node;
+import org.kie.workbench.common.stunner.core.graph.content.view.View;
+import org.kie.workbench.common.stunner.sw.definition.CallbackState;
+import org.kie.workbench.common.stunner.sw.definition.EventState;
+import org.kie.workbench.common.stunner.sw.definition.ForEachState;
+import org.kie.workbench.common.stunner.sw.definition.InjectState;
 import org.kie.workbench.common.stunner.sw.definition.Metadata;
+import org.kie.workbench.common.stunner.sw.definition.OperationState;
+import org.kie.workbench.common.stunner.sw.definition.ParallelState;
+import org.kie.workbench.common.stunner.sw.definition.SleepState;
 import org.kie.workbench.common.stunner.sw.definition.State;
+import org.kie.workbench.common.stunner.sw.definition.SwitchState;
 import org.mockito.Mock;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.kie.workbench.common.stunner.sw.client.shapes.StateShapeView.STATE_SHAPE_HEIGHT;
+import static org.kie.workbench.common.stunner.sw.client.shapes.StateShapeView.STATE_SHAPE_WIDTH;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
@@ -60,7 +78,8 @@ public class StateShapeTest {
     private final String SLEEP_COLOR = "#5752D1";
     private final String ANSIBLE_COLOR = "#BB271A";
     private final String KAOTO_COLOR = "#332174";
-    private final String DEFAULT_EMPTY_COLOR = "#FFF";
+    private final int SHAPE_X = 50;
+    private final int SHAPE_Y = 50;
 
     @Mock
     ResourceContentService kogitoService;
@@ -115,35 +134,9 @@ public class StateShapeTest {
         customTypeStateIconTest(ANSIBLE, ANSIBLE, ANSIBLE_COLOR);
     }
 
-    public void simpleStateIconTest(String type, String color) {
-        State state = createState(type);
-
-        StateShape shape = new StateShape(state, kogitoService);
-        assertFalse(shape.getView().isIconEmpty());
-        assertEquals(color, shape.getView().getIconBackgroundColor());
-    }
-
-    private State createState(String type) {
-        State state = new State();
-        state.setName(NAME);
-        state.setType(type);
-        return state;
-    }
-
-    public void customTypeStateIconTest(String defaultType, String customType, String color) {
-        State state = createState(defaultType);
-        Metadata metadata = new Metadata();
-        metadata.setType(customType);
-        state.setMetadata(metadata);
-
-        StateShape shape = new StateShape(state, kogitoService);
-        assertFalse(shape.getView().isIconEmpty());
-        assertEquals(color, shape.getView().getIconBackgroundColor());
-    }
-
     @Test
     public void setNullPictureTest() {
-        StateShape shape = spy(new StateShape(createState(INJECT), kogitoService));
+        StateShape shape = spy(StateShape.create(createState(INJECT), kogitoService));
         shape.setIconPicture(null, "icon.png");
 
         verify(shape, never()).setIconPicture(any());
@@ -151,7 +144,7 @@ public class StateShapeTest {
 
     @Test
     public void setEmptyPictureTest() {
-        StateShape shape = spy(new StateShape(createState(INJECT), kogitoService));
+        StateShape shape = spy(StateShape.create(createState(INJECT), kogitoService));
         shape.setIconPicture("", "icon.png");
 
         verify(shape, never()).setIconPicture(any());
@@ -159,7 +152,7 @@ public class StateShapeTest {
 
     @Test
     public void setValidPictureTest() {
-        StateShape shape = spy(new StateShape(createState(INJECT), kogitoService));
+        StateShape shape = spy(StateShape.create(createState(INJECT), kogitoService));
         shape.setIconPicture("base64string", "icon.png");
 
         verify(shape, times(1)).setIconPicture(any());
@@ -172,7 +165,11 @@ public class StateShapeTest {
         metadata.setIcon("data://png..lalala");
         state.setMetadata(metadata);
 
-        StateShape shape = new StateShape(state, kogitoService);
+        StateShape shape = StateShape.create(state, kogitoService);
+        assertTrue(shape.getView().isIconEmpty());
+        assertNull(shape.getView().getIconBackgroundColor());
+
+        shape.applyProperties(createElement(state), null);
         assertFalse(shape.getView().isIconEmpty());
         assertEquals("#FFF", shape.getView().getIconBackgroundColor());
     }
@@ -187,7 +184,11 @@ public class StateShapeTest {
         when(kogitoService.get(eq("png..lalala"), any())).thenReturn(new Promise<>((resolve, reject) -> {
         }));
 
-        StateShape shape = new StateShape(state, kogitoService);
+        StateShape shape = StateShape.create(state, kogitoService);
+        assertTrue(shape.getView().isIconEmpty());
+        assertNull(shape.getView().getIconBackgroundColor());
+
+        shape.applyProperties(createElement(state), null);
         assertFalse(shape.getView().isIconEmpty());
         assertEquals(INJECT_COLOR, shape.getView().getIconBackgroundColor());
     }
@@ -195,33 +196,33 @@ public class StateShapeTest {
     @Test
     public void scaleLargeWidthSmallHeightTest() {
         assertEquals(2.0,
-                            StateShape.calculateIconScale((int) StateShapeView.STATE_SHAPE_ICON_RADIUS * 4,
-                                                          (int) StateShapeView.STATE_SHAPE_ICON_RADIUS),
-                            0.0);
+                     StateShape.calculateIconScale((int) StateShapeView.STATE_SHAPE_ICON_RADIUS * 4,
+                                                   (int) StateShapeView.STATE_SHAPE_ICON_RADIUS),
+                     0.0);
     }
 
     @Test
     public void scaleLargeHeightSmallWidthTest() {
         assertEquals(2.0,
-                            StateShape.calculateIconScale((int) StateShapeView.STATE_SHAPE_ICON_RADIUS,
-                                                          (int) StateShapeView.STATE_SHAPE_ICON_RADIUS * 4),
-                            0.0);
+                     StateShape.calculateIconScale((int) StateShapeView.STATE_SHAPE_ICON_RADIUS,
+                                                   (int) StateShapeView.STATE_SHAPE_ICON_RADIUS * 4),
+                     0.0);
     }
 
     @Test
     public void scaleLargeWidthLargerHeightTest() {
         assertEquals(0.5,
-                            StateShape.calculateIconScale((int) StateShapeView.STATE_SHAPE_ICON_RADIUS * 4,
-                                                          (int) StateShapeView.STATE_SHAPE_ICON_RADIUS * 8),
-                            0.0);
+                     StateShape.calculateIconScale((int) StateShapeView.STATE_SHAPE_ICON_RADIUS * 4,
+                                                   (int) StateShapeView.STATE_SHAPE_ICON_RADIUS * 8),
+                     0.0);
     }
 
     @Test
     public void scaleLargeHeightLargerWidthTest() {
         assertEquals(0.5,
-                            StateShape.calculateIconScale((int) StateShapeView.STATE_SHAPE_ICON_RADIUS * 8,
-                                                          (int) StateShapeView.STATE_SHAPE_ICON_RADIUS * 4),
-                            0.0);
+                     StateShape.calculateIconScale((int) StateShapeView.STATE_SHAPE_ICON_RADIUS * 8,
+                                                   (int) StateShapeView.STATE_SHAPE_ICON_RADIUS * 4),
+                     0.0);
     }
 
     @Test
@@ -238,4 +239,210 @@ public class StateShapeTest {
     public void base64StringFromIncorrectPathGenerationTest() {
         assertEquals(IMAGE_DATA, StateShape.iconDataUri("imagejpeg", IMAGE_DATA));
     }
+
+    @Test
+    public void leftTopCornerOutsideTest() {
+        assertTrue(isCoordinateOutsideTest(0.5, 0.5));
+    }
+
+    @Test
+    public void leftTopCornerInsideTest() {
+        assertFalse(isCoordinateOutsideTest(6, 6));
+    }
+
+    @Test
+    public void rightTopCornerOutsideTest() {
+        assertTrue(isCoordinateOutsideTest(STATE_SHAPE_WIDTH - 0.5, 0.5));
+    }
+
+    @Test
+    public void rightTopCornerInsideTest() {
+        assertFalse(isCoordinateOutsideTest(STATE_SHAPE_WIDTH - 6, 6));
+    }
+
+    @Test
+    public void leftBottomCornerOutsideTest() {
+        assertTrue(isCoordinateOutsideTest(0.5, STATE_SHAPE_HEIGHT - 0.5));
+    }
+
+    @Test
+    public void leftBottomCornerInsideTest() {
+        assertFalse(isCoordinateOutsideTest(6, STATE_SHAPE_HEIGHT - 6));
+    }
+
+    @Test
+    public void rightBottomCornerOutsideTest() {
+        assertTrue(isCoordinateOutsideTest(STATE_SHAPE_WIDTH - 0.5, STATE_SHAPE_HEIGHT - 0.5));
+    }
+
+    @Test
+    public void rightBottomCornerInsideTest() {
+        assertFalse(isCoordinateOutsideTest(STATE_SHAPE_WIDTH - 6, STATE_SHAPE_HEIGHT - 6));
+    }
+
+    @Test
+    public void exitFromSelectedShapeTest() {
+        ShapeStateHandler stateHandler = mock(ShapeStateHandler.class);
+
+        StateShape shape = prepareShapeForExitTests(stateHandler, ShapeState.SELECTED);
+        NodeMouseExitEvent exitEvent = prepareMouseExitEvent(49, 49);
+
+        shape.getExitHandler().onNodeMouseExit(exitEvent);
+
+        verify(stateHandler, never()).applyState(any());
+    }
+
+    @Test
+    public void exitFromTheShapeToTopTest() {
+        ShapeStateHandler stateHandler = mock(ShapeStateHandler.class);
+
+        StateShape shape = prepareShapeForExitTests(stateHandler, ShapeState.HIGHLIGHT);
+        NodeMouseExitEvent exitEvent = prepareMouseExitEvent(55, 49);
+
+        shape.getExitHandler().onNodeMouseExit(exitEvent);
+
+        verify(stateHandler, times(1)).applyState(ShapeState.NONE);
+    }
+
+    @Test
+    public void exitFromTheLeftShapeTest() {
+        ShapeStateHandler stateHandler = mock(ShapeStateHandler.class);
+
+        StateShape shape = prepareShapeForExitTests(stateHandler, ShapeState.HIGHLIGHT);
+        NodeMouseExitEvent exitEvent = prepareMouseExitEvent(SHAPE_X - 5, SHAPE_Y + 5);
+
+        shape.getExitHandler().onNodeMouseExit(exitEvent);
+
+        verify(stateHandler, times(1)).applyState(ShapeState.NONE);
+    }
+
+    @Test
+    public void exitFromTheRightShapeTest() {
+        ShapeStateHandler stateHandler = mock(ShapeStateHandler.class);
+
+        StateShape shape = prepareShapeForExitTests(stateHandler, ShapeState.HIGHLIGHT);
+        NodeMouseExitEvent exitEvent = prepareMouseExitEvent((int) STATE_SHAPE_WIDTH + SHAPE_X + 5, SHAPE_Y + 5);
+
+        shape.getExitHandler().onNodeMouseExit(exitEvent);
+
+        verify(stateHandler, times(1)).applyState(ShapeState.NONE);
+    }
+
+    @Test
+    public void exitFromTheBottomShapeTest() {
+        ShapeStateHandler stateHandler = mock(ShapeStateHandler.class);
+
+        StateShape shape = prepareShapeForExitTests(stateHandler, ShapeState.HIGHLIGHT);
+        NodeMouseExitEvent exitEvent = prepareMouseExitEvent(SHAPE_X + 5, (int) STATE_SHAPE_HEIGHT + SHAPE_Y + 5);
+
+        shape.getExitHandler().onNodeMouseExit(exitEvent);
+
+        verify(stateHandler, times(1)).applyState(ShapeState.NONE);
+    }
+
+    @Test
+    public void raisedExitInsideOfTheShapeTest() {
+        ShapeStateHandler stateHandler = mock(ShapeStateHandler.class);
+
+        StateShape shape = prepareShapeForExitTests(stateHandler, ShapeState.HIGHLIGHT);
+        NodeMouseExitEvent exitEvent = prepareMouseExitEvent(SHAPE_X + 5, SHAPE_Y + 5);
+
+        shape.getExitHandler().onNodeMouseExit(exitEvent);
+
+        verify(stateHandler, never()).applyState(ShapeState.NONE);
+    }
+
+    @SuppressWarnings("rawtypes")
+    private NodeMouseExitEvent prepareMouseExitEvent(int mouseX, int mouseY) {
+        NodeMouseExitEvent exitEvent = mock(NodeMouseExitEvent.class);
+        when(exitEvent.getX()).thenReturn(mouseX);
+        when(exitEvent.getY()).thenReturn(mouseY);
+        com.ait.lienzo.client.core.shape.Node node = mock(com.ait.lienzo.client.core.shape.Node.class);
+        when(exitEvent.getSource()).thenReturn(node);
+        com.ait.lienzo.client.core.types.Point2D point = new com.ait.lienzo.client.core.types.Point2D(SHAPE_X, SHAPE_Y);
+        when(node.getAbsoluteLocation()).thenReturn(point);
+        return exitEvent;
+    }
+
+    private StateShape prepareShapeForExitTests(ShapeStateHandler stateHandler, ShapeState currentState) {
+        State state = createState(INJECT);
+        StateShape shape = spy(StateShape.create(state, kogitoService));
+        shape.applyProperties(createElement(state), null);
+
+        when(stateHandler.getShapeState()).thenReturn(currentState);
+        when(shape.getShapeStateHandler()).thenReturn(stateHandler);
+
+        return shape;
+    }
+
+    private void simpleStateIconTest(String type, String color) {
+        State state = createState(type);
+
+        StateShape shape = StateShape.create(state, kogitoService);
+        assertTrue(shape.getView().isIconEmpty());
+        assertNull(shape.getView().getIconBackgroundColor());
+
+        shape.applyProperties(createElement(state), null);
+        assertFalse(shape.getView().isIconEmpty());
+        assertEquals(color, shape.getView().getIconBackgroundColor());
+    }
+
+    private State createState(String type) {
+        State state;
+        switch (type) {
+            case "inject":
+                state = new InjectState();
+                break;
+            case "switch":
+                state = new SwitchState();
+                break;
+            case "operation":
+                state = new OperationState();
+                break;
+            case "event":
+                state = new EventState();
+                break;
+            case "callback":
+                state = new CallbackState();
+                break;
+            case "foreach":
+                state = new ForEachState();
+                break;
+            case "parallel":
+                state = new ParallelState();
+                break;
+            case "sleep":
+                state = new SleepState();
+                break;
+            default:
+                state = new State();
+        }
+        state.setName(NAME);
+        state.setType(type);
+        return state;
+    }
+
+    private void customTypeStateIconTest(String defaultType, String customType, String color) {
+        State state = createState(defaultType);
+        Metadata metadata = new Metadata();
+        metadata.setType(customType);
+        state.setMetadata(metadata);
+
+        StateShape shape = StateShape.create(state, kogitoService);
+        assertTrue(shape.getView().isIconEmpty());
+        assertNull(shape.getView().getIconBackgroundColor());
+
+        shape.applyProperties(createElement(state), null);
+        assertFalse(shape.getView().isIconEmpty());
+        assertEquals(color, shape.getView().getIconBackgroundColor());
+    }
+
+    private Node<View<State>, Edge> createElement(State state) {
+        StateView view = new StateView(state);
+        return new StateNode(view);
+    }
+
+    private boolean isCoordinateOutsideTest(double x, double y) {
+        return StateShape.isOutsideOfCorners(x, y, STATE_SHAPE_WIDTH, STATE_SHAPE_HEIGHT);
+    }
 }
diff --git a/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/test/java/org/kie/workbench/common/stunner/sw/client/shapes/StateView.java b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/test/java/org/kie/workbench/common/stunner/sw/client/shapes/StateView.java
new file mode 100644
index 0000000000..d170bb52d8
--- /dev/null
+++ b/packages/serverless-workflow-diagram-editor/sw-editor/sw-editor-client/src/test/java/org/kie/workbench/common/stunner/sw/client/shapes/StateView.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.kie.workbench.common.stunner.sw.client.shapes;
+
+import org.kie.workbench.common.stunner.core.graph.content.Bounds;
+import org.kie.workbench.common.stunner.core.graph.content.view.View;
+import org.kie.workbench.common.stunner.sw.definition.State;
+
+public class StateView implements View<State> {
+
+    private State state;
+
+    public StateView(State state) {
+        this.state = state;
+    }
+
+    @Override
+    public Bounds getBounds() {
+        return null;
+    }
+
+    @Override
+    public void setBounds(Bounds bounds) {
+
+    }
+
+    @Override
+    public State getDefinition() {
+        return state;
+    }
+
+    @Override
+    public void setDefinition(State definition) {
+        this.state = definition;
+    }
+}
diff --git a/packages/stunner-editors/kie-wb-common-dmn/kie-dmn-feel-gwt/src/main/java/org/kie/dmn/feel/super/org/kie/dmn/feel/lang/ast/visitor/ASTHeuristicCheckerVisitor.java b/packages/stunner-editors/kie-wb-common-dmn/kie-dmn-feel-gwt/src/main/java/org/kie/dmn/feel/super/org/kie/dmn/feel/lang/ast/visitor/ASTHeuristicCheckerVisitor.java
new file mode 100644
index 0000000000..969c131a6c
--- /dev/null
+++ b/packages/stunner-editors/kie-wb-common-dmn/kie-dmn-feel-gwt/src/main/java/org/kie/dmn/feel/super/org/kie/dmn/feel/lang/ast/visitor/ASTHeuristicCheckerVisitor.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2019 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ */
+
+package org.kie.dmn.feel.lang.ast.visitor;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.kie.dmn.api.feel.runtime.events.FEELEvent;
+import org.kie.dmn.api.feel.runtime.events.FEELEvent.Severity;
+import org.kie.dmn.feel.lang.ast.ASTNode;
+import org.kie.dmn.feel.lang.ast.InfixOpNode;
+import org.kie.dmn.feel.lang.ast.NullNode;
+import org.kie.dmn.feel.lang.ast.RangeNode;
+import org.kie.dmn.feel.lang.ast.UnaryTestNode;
+import org.kie.dmn.feel.runtime.events.ASTHeuristicCheckEvent;
+import org.kie.dmn.feel.util.Msg;
+
+public class ASTHeuristicCheckerVisitor extends DefaultedVisitor<List<FEELEvent>> {
+
+    @Override
+    public List<FEELEvent> defaultVisit(ASTNode n) {
+        List<FEELEvent> result = new ArrayList<>();
+        for (ASTNode node : n.getChildrenNode()) {
+            if (node != null) {
+                result.addAll(node.accept(this));
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public List<FEELEvent> visit(InfixOpNode n) {
+        if (!(n.getLeft() instanceof UnaryTestNode || n.getLeft() instanceof RangeNode) && (n.getRight() instanceof UnaryTestNode || n.getRight() instanceof RangeNode)) {
+            return Arrays.asList(new ASTHeuristicCheckEvent(Severity.WARN, Msg.createMessage(Msg.COMPARING_TO_UT, n.getOperator().symbol + " (" + n.getRight().getText()) + ")", n));
+        }
+        return defaultVisit(n);
+    }
+
+    @Override
+    public List<FEELEvent> visit(UnaryTestNode n) {
+        if (n.getValue() instanceof UnaryTestNode || n.getValue() instanceof RangeNode) {
+            return Arrays.asList(new ASTHeuristicCheckEvent(Severity.WARN, Msg.createMessage(Msg.UT_OF_UT, n.getOperator().symbol + " (" + n.getValue().getText()) + ")", n));
+        }
+        return defaultVisit(n);
+    }
+
+    @Override
+    public List<FEELEvent> visit(RangeNode n) {
+        if ((n.getStart() instanceof NullNode && n.getEnd() instanceof RangeNode)
+                || (n.getStart() instanceof RangeNode && n.getEnd() instanceof NullNode)) {
+            return Arrays.asList(new ASTHeuristicCheckEvent(Severity.WARN, Msg.createMessage(Msg.UT_OF_UT, n.getText()), n));
+        }
+        return defaultVisit(n);
+    }
+}
diff --git a/packages/stunner-editors/kie-wb-common-dmn/kie-wb-common-dmn-client/pom.xml b/packages/stunner-editors/kie-wb-common-dmn/kie-wb-common-dmn-client/pom.xml
index f31910aa5f..ae6befcae7 100644
--- a/packages/stunner-editors/kie-wb-common-dmn/kie-wb-common-dmn-client/pom.xml
+++ b/packages/stunner-editors/kie-wb-common-dmn/kie-wb-common-dmn-client/pom.xml
@@ -27,19 +27,7 @@
   <artifactId>kie-wb-common-dmn-client</artifactId>
   <name>Kie Workbench - Common - DMN - Client</name>
   <description>Kie Workbench - Common - DMN - Client</description>
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <source>11</source>
-                    <target>11</target>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-    <packaging>jar</packaging>
+  <packaging>jar</packaging>
 
   <properties>
     <java.module.name>org.kie.wb.common.dmn.client</java.module.name>
diff --git a/packages/stunner-editors/kie-wb-common-dmn/kie-wb-common-dmn-client/src/main/java/org/kie/workbench/common/dmn/client/editors/expressions/types/dtable/DecisionTableEditorDefinitionEnricher.java b/packages/stunner-editors/kie-wb-common-dmn/kie-wb-common-dmn-client/src/main/java/org/kie/workbench/common/dmn/client/editors/expressions/types/dtable/DecisionTableEditorDefinitionEnricher.java
index 3d84b8383f..d03841ea69 100644
--- a/packages/stunner-editors/kie-wb-common-dmn/kie-wb-common-dmn-client/src/main/java/org/kie/workbench/common/dmn/client/editors/expressions/types/dtable/DecisionTableEditorDefinitionEnricher.java
+++ b/packages/stunner-editors/kie-wb-common-dmn/kie-wb-common-dmn-client/src/main/java/org/kie/workbench/common/dmn/client/editors/expressions/types/dtable/DecisionTableEditorDefinitionEnricher.java
@@ -417,7 +417,7 @@ public class DecisionTableEditorDefinitionEnricher implements ExpressionEditorMo
     }
 
     private QName getQName(final ItemDefinition itemDefinition) {
-        if (!itemDefinitionUtils.findByName(itemDefinition.getName().getValue()).isEmpty()) {
+        if (itemDefinitionUtils.findByName(itemDefinition.getName().getValue()).isPresent()) {
             return getQNameFromItemDefinitionName(itemDefinition);
         } else {
             return itemDefinition.getTypeRef();
diff --git a/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/main/java/org/kie/workbench/common/stunner/client/lienzo/components/toolbox/actions/AbstractActionsToolboxView.java b/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/main/java/org/kie/workbench/common/stunner/client/lienzo/components/toolbox/actions/AbstractActionsToolboxView.java
index 4ef4afaa50..e5983b7825 100644
--- a/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/main/java/org/kie/workbench/common/stunner/client/lienzo/components/toolbox/actions/AbstractActionsToolboxView.java
+++ b/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-client/kie-wb-common-stunner-lienzo/src/main/java/org/kie/workbench/common/stunner/client/lienzo/components/toolbox/actions/AbstractActionsToolboxView.java
@@ -172,6 +172,7 @@ public abstract class AbstractActionsToolboxView<V extends AbstractActionsToolbo
                                      final IsToolboxActionDraggable toolboxAction,
                                      final ButtonItem button,
                                      final NodeMouseMoveEvent event) {
+        button.disable();
         toolboxAction.onMoveStart(toolbox.getCanvasHandler(),
                                   toolbox.getElementUUID(),
                                   new MouseMoveEvent(event.getX(),
diff --git a/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-sets/kie-wb-common-stunner-bpmn/kie-wb-common-stunner-bpmn-marshalling/src/main/java/org/kie/workbench/common/stunner/bpmn/client/marshall/converters/customproperties/AssociationList.java b/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-sets/kie-wb-common-stunner-bpmn/kie-wb-common-stunner-bpmn-marshalling/src/main/java/org/kie/workbench/common/stunner/bpmn/client/marshall/converters/cu [...]
index 794bcbc6d5..8b0a8c9a0f 100644
--- a/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-sets/kie-wb-common-stunner-bpmn/kie-wb-common-stunner-bpmn-marshalling/src/main/java/org/kie/workbench/common/stunner/bpmn/client/marshall/converters/customproperties/AssociationList.java
+++ b/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-sets/kie-wb-common-stunner-bpmn/kie-wb-common-stunner-bpmn-marshalling/src/main/java/org/kie/workbench/common/stunner/bpmn/client/marshall/converters/customproperties/AssociationList.java
@@ -19,11 +19,9 @@ package org.kie.workbench.common.stunner.bpmn.client.marshall.converters.customp
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.Optional;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import org.kie.workbench.common.stunner.core.util.StringUtils;
 import org.uberfire.commons.UUID;
 
 import static java.util.stream.Collectors.toList;
@@ -60,14 +58,17 @@ public class AssociationList {
     }
 
     public static AssociationList fromString(String encoded) {
-        return Optional.ofNullable(encoded)
-                .filter(StringUtils::nonEmpty)
-                .map(s -> new AssociationList(
-                        Arrays.stream(s.replaceAll(REGEX_DELIMITER, REPLACE_DELIMITER_AVOID_CONFLICTS)
-                                              .split(REPLACED_DELIMITER))
-                                .map(AssociationDeclaration::fromString)
-                                .collect(toList())))
-                .orElse(new AssociationList());
+        // The change below is to fix SDM issue on Mac OS
+        if (encoded == null || encoded.isEmpty()) {
+            return new AssociationList();
+        } else {
+            return new AssociationList(
+                    Arrays.stream(encoded.replaceAll(REGEX_DELIMITER, REPLACE_DELIMITER_AVOID_CONFLICTS)
+                                    .split(REPLACED_DELIMITER))
+                            .map(AssociationDeclaration::fromString)
+                            .collect(toList()));
+
+        }
     }
 
     public List<AssociationDeclaration> getInputs() {
diff --git a/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-sets/kie-wb-common-stunner-bpmn/kie-wb-common-stunner-bpmn-marshalling/src/main/java/org/kie/workbench/common/stunner/bpmn/client/marshall/converters/tostunner/processes/ProcessConverterDelegate.java b/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-sets/kie-wb-common-stunner-bpmn/kie-wb-common-stunner-bpmn-marshalling/src/main/java/org/kie/workbench/common/stunner/bpmn/client/marshall/c [...]
index 8479455034..3409dcf939 100644
--- a/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-sets/kie-wb-common-stunner-bpmn/kie-wb-common-stunner-bpmn-marshalling/src/main/java/org/kie/workbench/common/stunner/bpmn/client/marshall/converters/tostunner/processes/ProcessConverterDelegate.java
+++ b/packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-sets/kie-wb-common-stunner-bpmn/kie-wb-common-stunner-bpmn-marshalling/src/main/java/org/kie/workbench/common/stunner/bpmn/client/marshall/converters/tostunner/processes/ProcessConverterDelegate.java
@@ -16,7 +16,9 @@
 
 package org.kie.workbench.common.stunner.bpmn.client.marshall.converters.tostunner.processes;
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -25,6 +27,7 @@ import java.util.Optional;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import elemental2.dom.DomGlobal;
 import org.eclipse.bpmn2.BaseElement;
 import org.eclipse.bpmn2.FlowElement;
 import org.eclipse.bpmn2.Lane;
@@ -112,19 +115,37 @@ final class ProcessConverterDelegate {
     }
 
     private Result<Map<String, BpmnNode>> convertFlowElements(List<FlowElement> flowElements) {
-        final List<Result<BpmnNode>> results = flowElements
-                .stream()
-                .map(converterFactory.flowElementConverter()::convertNode)
-                .collect(Collectors.toList());
-
-        final Map<String, BpmnNode> resultMap = results.stream()
-                .map(Result::value)
-                .filter(Objects::nonNull)
-                .collect(Collectors.toMap(n -> n.value().getUUID(), n -> n));
-
-        return ResultComposer.composeResults(resultMap, results);
+        final List<Result<BpmnNode>> results = new ArrayList<>();
+        final Map<String, BpmnNode> resultMap = new HashMap<>();
+        for (FlowElement element : flowElements) {
+            try {
+                logMessage("Converting  " + element);
+                Result<BpmnNode> result = converterFactory.flowElementConverter().convertNode(element);
+                results.add(result);
+                logMessage("Mapping  " + result);
+                if (result.value() != null) {
+                    BpmnNode n = result.value();
+                    resultMap.put(n.value().getUUID(), n);
+                }
+            } catch (Throwable t) {
+                logMessage("Failed to convert/map " + element + t);
+            }
+        }
+        Result toReturn = null;
+        try {
+            logMessage("Composing result");
+            toReturn = ResultComposer.composeResults(resultMap, results);
+        }  catch (Throwable t) {
+            logMessage("Failed to compose result " + t);
+        }
+        return toReturn;
     }
 
+    private void logMessage(String message) {
+        if (DomGlobal.console != null) { //Safe for Unit Test
+            DomGlobal.console.log(message);
+        }
+    }
     private Result<BpmnNode>[] convertLane(Lane lane, List<Lane> parents, Map<String, BpmnNode> freeFloatingNodes, BpmnNode firstDiagramNode) {
         if (lane.getChildLaneSet() != null) {
             parents.add(lane);
diff --git a/packages/uniforms-bootstrap4-codegen/package.json b/packages/uniforms-bootstrap4-codegen/package.json
index a5db7597e4..62861e3196 100644
--- a/packages/uniforms-bootstrap4-codegen/package.json
+++ b/packages/uniforms-bootstrap4-codegen/package.json
@@ -27,8 +27,8 @@
     "react": "^17.0.2",
     "react-dom": "^17.0.2",
     "underscore": "^1.13.1",
-    "uniforms": "^3.5.5",
-    "uniforms-bridge-simple-schema-2": "^3.5.5"
+    "uniforms": "^3.10.2",
+    "uniforms-bridge-simple-schema-2": "^3.10.2"
   },
   "devDependencies": {
     "@babel/core": "^7.16.0",
diff --git a/packages/uniforms-bootstrap4-codegen/src/__tests__/_createContext.ts b/packages/uniforms-bootstrap4-codegen/src/__tests__/_createContext.ts
index d56d008b2f..382b7a6095 100644
--- a/packages/uniforms-bootstrap4-codegen/src/__tests__/_createContext.ts
+++ b/packages/uniforms-bootstrap4-codegen/src/__tests__/_createContext.ts
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-import { Context, randomIds } from "uniforms/cjs";
+import { Context, BaseForm, randomIds } from "uniforms/cjs";
 
 import createSchema from "./_createSchema";
 
@@ -32,6 +32,16 @@ export default function createContext(schema?: {}, context?: Partial<Context<any
     randomId,
     submitting: false,
     validating: false,
+    formRef: new BaseForm<any>({
+      autosave: false,
+      autosaveDelay: 0,
+      error: false,
+      label: true,
+      model: {},
+      noValidate: false,
+      onSubmit: (event) => {},
+      schema: createSchema(schema),
+    }),
     ...context,
     schema: createSchema(schema),
     submitted: false,
diff --git a/packages/uniforms-bootstrap4-codegen/src/uniforms/BootstrapCodeGenContext.tsx b/packages/uniforms-bootstrap4-codegen/src/uniforms/BootstrapCodeGenContext.tsx
index 9c2cd9b55b..79a3060b60 100644
--- a/packages/uniforms-bootstrap4-codegen/src/uniforms/BootstrapCodeGenContext.tsx
+++ b/packages/uniforms-bootstrap4-codegen/src/uniforms/BootstrapCodeGenContext.tsx
@@ -16,7 +16,7 @@
 
 import React, { createContext, useContext } from "react";
 
-import { Bridge, context, Context, randomIds } from "uniforms/cjs";
+import { Bridge, BaseForm, context, Context, randomIds } from "uniforms/cjs";
 
 import { FormElement } from "../api";
 
@@ -56,6 +56,16 @@ export const CodeGenContextProvider: React.FC<ProviderProps> = (props) => {
     onSubmit: (event) => {},
     randomId: randomIds(),
     schema: props.schema,
+    formRef: new BaseForm<any>({
+      autosave: false,
+      autosaveDelay: 0,
+      error: false,
+      label: true,
+      model: {},
+      noValidate: false,
+      onSubmit: (event) => {},
+      schema: props.schema,
+    }),
     state: {
       readOnly: false,
       disabled: false,
diff --git a/packages/uniforms-patternfly-codegen/package.json b/packages/uniforms-patternfly-codegen/package.json
index aad9d79292..5f091ee6ee 100644
--- a/packages/uniforms-patternfly-codegen/package.json
+++ b/packages/uniforms-patternfly-codegen/package.json
@@ -26,8 +26,8 @@
     "prettier": "^2.2.1",
     "react": "^17.0.2",
     "react-dom": "^17.0.2",
-    "uniforms": "^3.5.5",
-    "uniforms-bridge-simple-schema-2": "^3.5.5"
+    "uniforms": "^3.10.2",
+    "uniforms-bridge-simple-schema-2": "^3.10.2"
   },
   "devDependencies": {
     "@babel/core": "^7.16.0",
diff --git a/packages/uniforms-patternfly-codegen/src/__tests__/_createContext.ts b/packages/uniforms-patternfly-codegen/src/__tests__/_createContext.ts
index d56d008b2f..382b7a6095 100644
--- a/packages/uniforms-patternfly-codegen/src/__tests__/_createContext.ts
+++ b/packages/uniforms-patternfly-codegen/src/__tests__/_createContext.ts
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-import { Context, randomIds } from "uniforms/cjs";
+import { Context, BaseForm, randomIds } from "uniforms/cjs";
 
 import createSchema from "./_createSchema";
 
@@ -32,6 +32,16 @@ export default function createContext(schema?: {}, context?: Partial<Context<any
     randomId,
     submitting: false,
     validating: false,
+    formRef: new BaseForm<any>({
+      autosave: false,
+      autosaveDelay: 0,
+      error: false,
+      label: true,
+      model: {},
+      noValidate: false,
+      onSubmit: (event) => {},
+      schema: createSchema(schema),
+    }),
     ...context,
     schema: createSchema(schema),
     submitted: false,
diff --git a/packages/uniforms-patternfly-codegen/src/uniforms/CodeGenContext.tsx b/packages/uniforms-patternfly-codegen/src/uniforms/CodeGenContext.tsx
index b7057cf8a6..a65e4e605c 100644
--- a/packages/uniforms-patternfly-codegen/src/uniforms/CodeGenContext.tsx
+++ b/packages/uniforms-patternfly-codegen/src/uniforms/CodeGenContext.tsx
@@ -16,7 +16,7 @@
 
 import React, { createContext, useContext } from "react";
 
-import { Bridge, context, Context, randomIds } from "uniforms/cjs";
+import { Bridge, BaseForm, context, Context, randomIds } from "uniforms/cjs";
 
 import { FormElement } from "../api";
 
@@ -56,6 +56,16 @@ export const CodeGenContextProvider: React.FC<ProviderProps> = (props) => {
     onSubmit: (event) => {},
     randomId: randomIds(),
     schema: props.schema,
+    formRef: new BaseForm<any>({
+      autosave: false,
+      autosaveDelay: 0,
+      error: false,
+      label: true,
+      model: {},
+      noValidate: false,
+      onSubmit: (event) => {},
+      schema: props.schema,
+    }),
     state: {
       readOnly: false,
       disabled: false,
diff --git a/packages/uniforms-patternfly/.vscode/launch.json b/packages/uniforms-patternfly/.vscode/launch.json
new file mode 100644
index 0000000000..edebfa0ad2
--- /dev/null
+++ b/packages/uniforms-patternfly/.vscode/launch.json
@@ -0,0 +1,29 @@
+{
+  "version": "0.2.0",
+  "configurations": [
+    {
+      "name": "Current TS File",
+      "type": "node",
+      "request": "launch",
+      "env": {},
+      "args": ["${relativeFile}"],
+      "runtimeArgs": ["-r", "ts-node/register"],
+      "cwd": "${workspaceRoot}",
+      "protocol": "inspector",
+      "internalConsoleOptions": "openOnSessionStart"
+    },
+    {
+      "type": "node",
+      "request": "launch",
+      "name": "Jest Current File",
+      "program": "${workspaceFolder}/node_modules/.bin/jest",
+      "args": ["${fileBasenameNoExtension}", "--config", "jest.config.js"],
+      "console": "integratedTerminal",
+      "internalConsoleOptions": "neverOpen",
+      "disableOptimisticBPs": true,
+      "windows": {
+        "program": "${workspaceFolder}/node_modules/jest/bin/jest"
+      }
+    }
+  ]
+}
diff --git a/packages/uniforms-patternfly/README.md b/packages/uniforms-patternfly/README.md
new file mode 100644
index 0000000000..3d4f5ad446
--- /dev/null
+++ b/packages/uniforms-patternfly/README.md
@@ -0,0 +1,97 @@
+# Basic usage
+
+`uniforms` is a plugin for React to be able to create dynamic forms with built-in state management and form validation.
+`uniforms` provides you with simple re-usable form components which allows for rapid prototyping and cleaner React components.
+
+This package extends uniforms to provide [Patternfly React](https://www.patternfly.org/v4/) components inside your forms.
+For more information about `uniforms` please go to https://uniforms.tools/
+
+Looking for building mobile enabled forms? Check [Uniforms-ionic](https://github.com/aerogear/uniforms-ionic) package that provides Ionic extensions
+
+### 1. Install the required packages
+
+To start using uniforms, we have to install three independent packages:
+
+1. Core
+2. Bridge
+3. Theme
+
+In this example, we will use the JSON Schema to describe our desired data format and style our form using the Pattenfly UI theme.
+
+```shell
+npm install uniforms@^3.10.2
+npm install uniforms-bridge-json-schema@^3.10.2
+npm install @kie-tools/uniforms-patternfly
+npm install @patternfly/react-core @patternfly/react-icons
+```
+
+Don't forget that it's necessary to correctly load the styles from Patternfly. To do it, we recommend taking a look into the
+[Patternfly React Seed](https://github.com/patternfly/patternfly-react-seed), or you can simply load the styles directly into
+your `index.html` like in the example app of this repo.
+
+Obs: If you use a previous version of the `tslib` indirectly (version 1), it should be necessary to add this dependency as well.
+
+```shell
+npm install tslib@^2.3.1
+```
+
+### 2. Start by defining a schema
+
+After we've installed required packages, it's time to define our schema. We can do it in a plain JSON, which is a valid JSON Schema instance:
+
+```js
+const schema = {
+  type: "object",
+  properties: {
+    foo: {
+      type: "string",
+    },
+  },
+};
+```
+
+### 3. Then create the bridge
+
+Now that we have the schema, we can create the uniforms bridge of it, by using the corresponding uniforms bridge package.
+Creating the bridge instance is necessary - without it, uniforms would not be able to process form generation and validation.
+As we are using the JSON Schema, we have to import the `uniforms-bridge-json-schema` package. Also, because we're doing an
+example of a JSON Schema, it's necessary to use a JSON Schema validation library, and in this example we'll be using the AJV.
+
+```js
+import { JSONSchemaBridge } from "uniforms-bridge-json-schema";
+import AJV from "ajv";
+
+const ajv = new Ajv({ allErrors: true, useDefaults: true });
+
+function createValidator(schema) {
+  const validator = ajv.compile(schema);
+
+  return (model) => {
+    validator(model);
+    return validator.errors?.length ? { details: validator.errors } : null;
+  };
+}
+
+const bridge = new JSONSchemaBridge(schema, createValidator(schema));
+```
+
+### 4. Finally, use it in a form! 🎉
+
+Uniforms theme packages provide the `AutoForm` component, which is able to generate the form based on the given schema.
+All we have to do now is to pass the previously created Bridge to the `AutoForm`:
+
+```js
+import * as React from "react";
+import { AutoForm } from "@kie-tools/uniforms-patternfly/dist/esm";
+
+import schema from "./schema";
+
+export default function MyForm() {
+  return <AutoForm schema={bridge} onSubmit={console.log} />;
+}
+```
+
+And that's it! `AutoForm` will generate a complete form with labeled fields, errors list (if any) and a submit button.
+
+Also, it will take care of validation and handle model changes. In case you need more advanced feature, take a deeper look
+into the Uniforms docs.
diff --git a/packages/uniforms-patternfly/__mocks__/styleMock.js b/packages/uniforms-patternfly/__mocks__/styleMock.js
new file mode 100644
index 0000000000..f053ebf797
--- /dev/null
+++ b/packages/uniforms-patternfly/__mocks__/styleMock.js
@@ -0,0 +1 @@
+module.exports = {};
diff --git a/packages/online-editor/src/workspace/startupBlockers/LatestCompatibleVersion.ts b/packages/uniforms-patternfly/env/index.js
similarity index 61%
copy from packages/online-editor/src/workspace/startupBlockers/LatestCompatibleVersion.ts
copy to packages/uniforms-patternfly/env/index.js
index 38ca944907..ac71eb1337 100644
--- a/packages/online-editor/src/workspace/startupBlockers/LatestCompatibleVersion.ts
+++ b/packages/uniforms-patternfly/env/index.js
@@ -1,11 +1,11 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *       http://www.apache.org/licenses/LICENSE-2.0
+ *        http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,4 +14,11 @@
  * limitations under the License.
  */
 
-export const LATEST_VERSION_COMPATIBLE_WITH_LFS = "0.23.0";
+const { varsWithName, composeEnv } = require("@kie-tools-scripts/build-env");
+
+module.exports = composeEnv([require("@kie-tools/root-env/env")], {
+  vars: varsWithName({}),
+  get env() {
+    return {};
+  },
+});
diff --git a/packages/uniforms-patternfly/jest.config.js b/packages/uniforms-patternfly/jest.config.js
new file mode 100644
index 0000000000..076ed79f77
--- /dev/null
+++ b/packages/uniforms-patternfly/jest.config.js
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+module.exports = {
+  globals: {
+    "ts-jest": {
+      tsconfig: "<rootDir>/tsconfig.esm.json",
+    },
+  },
+  reporters: ["default", ["jest-junit", { outputFile: "./dist-tests/junit-report.xml" }]],
+  setupFilesAfterEnv: ["./src/__tests__/jest.setup.ts"],
+  moduleDirectories: ["node_modules"],
+  testRegex: "src/__tests__/.*\\.test\\.(jsx?|tsx?)$",
+  transform: {
+    "^.+\\.jsx?$": ["babel-jest", { presets: [["@babel/env", { targets: { node: "current" } }], "@babel/react"] }],
+    "^.+\\.tsx?$": "ts-jest",
+  },
+  moduleNameMapper: {
+    "\\.(css|less|sass|scss)$": "<rootDir>/__mocks__/styleMock.js",
+  },
+};
diff --git a/packages/uniforms-patternfly-codegen/package.json b/packages/uniforms-patternfly/package.json
similarity index 60%
copy from packages/uniforms-patternfly-codegen/package.json
copy to packages/uniforms-patternfly/package.json
index aad9d79292..4b1db7a9d2 100644
--- a/packages/uniforms-patternfly-codegen/package.json
+++ b/packages/uniforms-patternfly/package.json
@@ -1,8 +1,12 @@
 {
-  "name": "@kie-tools/uniforms-patternfly-codegen",
+  "name": "@kie-tools/uniforms-patternfly",
   "version": "0.0.0",
-  "description": "",
+  "description": "Patternfly forms for uniforms",
   "license": "Apache-2.0",
+  "author": {
+    "name": "Gianluca",
+    "email": "gzuccare@redhat.com"
+  },
   "keywords": [],
   "homepage": "https://github.com/kiegroup/kie-tools",
   "repository": {
@@ -16,49 +20,48 @@
     "dist"
   ],
   "scripts": {
-    "build:dev": "rimraf dist && webpack --env dev",
-    "build:prod": "pnpm lint && pnpm test && rimraf dist && webpack",
+    "build:dev": "rimraf dist && tsc --build tsconfig.cjs.json && tsc --build tsconfig.esm.json",
+    "build:prod": "rimraf dist && pnpm lint && pnpm test && rimraf dist && tsc --build tsconfig.cjs.json && tsc --build tsconfig.esm.json",
     "lint": "run-script-if --bool \"$(build-env linters.run)\" --then \"kie-tools--eslint ./src\"",
-    "test": "run-script-if --ignore-errors \"$(build-env tests.ignoreFailures)\" --bool \"$(build-env tests.run)\" --then \"jest --silent --verbose --passWithNoTests\""
+    "test": "run-script-if --ignore-errors \"$(build-env tests.ignoreFailures)\" --bool \"$(build-env tests.run)\" --then \"jest --verbose --passWithNoTests\""
   },
   "dependencies": {
+    "@types/invariant": "^2.2.35",
+    "invariant": "^2.2.4",
     "lodash": "^4.17.21",
-    "prettier": "^2.2.1",
     "react": "^17.0.2",
     "react-dom": "^17.0.2",
-    "uniforms": "^3.5.5",
-    "uniforms-bridge-simple-schema-2": "^3.5.5"
+    "uniforms": "^3.10.2"
   },
   "devDependencies": {
-    "@babel/core": "^7.16.0",
     "@babel/preset-env": "^7.16.0",
     "@babel/preset-react": "^7.16.0",
-    "@kie-tools-core/webpack-base": "workspace:*",
+    "@kie-tools-scripts/build-env": "workspace:*",
     "@kie-tools/eslint": "workspace:*",
     "@kie-tools/root-env": "workspace:*",
     "@kie-tools/tsconfig": "workspace:*",
+    "@patternfly/react-core": "^4.157.3",
+    "@patternfly/react-icons": "^4.11.17",
+    "@testing-library/jest-dom": "^5.16.1",
     "@testing-library/react": "^11.2.6",
     "@types/jest": "^26.0.23",
-    "@types/jest-when": "^2.7.4",
     "@types/lodash": "^4.14.168",
-    "@types/prettier": "^2.2.1",
     "@types/react": "^17.0.6",
     "@types/react-dom": "^17.0.5",
     "@types/simpl-schema": "^1.12.0",
+    "@types/testing-library__jest-dom": "^5.9.1",
     "@types/testing-library__react": "^9.1.2",
     "copy-webpack-plugin": "^11.0.0",
     "jest": "^26.6.3",
-    "jest-junit": "^14.0.0",
-    "jest-raw-loader": "^1.0.1",
-    "jest-when": "^3.5.0",
-    "raw-loader": "^4.0.2",
     "rimraf": "^3.0.2",
+    "simpl-schema": "^1.12.0",
     "ts-jest": "^26.5.6",
+    "ts-node": "^10.9.1",
     "typescript": "^4.4.2",
+    "uniforms-bridge-simple-schema-2": "^3.10.2",
     "webpack": "^5.36.2",
     "webpack-cli": "^4.10.0",
     "webpack-dev-server": "^4.7.3",
-    "webpack-merge": "^5.8.0",
-    "webpack-node-externals": "^3.0.0"
+    "webpack-merge": "^5.8.0"
   }
 }
\ No newline at end of file
diff --git a/packages/unitables/src/uniforms/AutoField.tsx b/packages/uniforms-patternfly/src/AutoField.tsx
similarity index 59%
copy from packages/unitables/src/uniforms/AutoField.tsx
copy to packages/uniforms-patternfly/src/AutoField.tsx
index 2fed18b7e6..2182ec1228 100644
--- a/packages/unitables/src/uniforms/AutoField.tsx
+++ b/packages/uniforms-patternfly/src/AutoField.tsx
@@ -1,11 +1,11 @@
 /*
- * Copyright 2021 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *        http://www.apache.org/licenses/LICENSE-2.0
+ *       http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,19 +14,20 @@
  * limitations under the License.
  */
 
-import {
-  BoolField,
-  DateField,
-  ListField,
-  NestField,
-  NumField,
-  RadioField,
-  SelectField,
-  TextField,
-} from "uniforms-patternfly";
 import { createAutoField } from "uniforms";
+import invariant from "invariant";
+import BoolField from "./BoolField";
+import DateField from "./DateField";
+import ListField from "./ListField";
+import NestField from "./NestField";
+import NumField from "./NumField";
+import RadioField from "./RadioField";
+import SelectField from "./SelectField";
+import TextField from "./TextField";
 
-export const AutoField = createAutoField((props) => {
+export type AutoFieldProps = Parameters<typeof AutoField>[0];
+
+const AutoField = createAutoField((props) => {
   if (props.allowedValues) {
     return props.checkboxes && props.fieldType !== Array ? RadioField : SelectField;
   }
@@ -43,7 +44,10 @@ export const AutoField = createAutoField((props) => {
     case Object:
       return NestField;
     case String:
-    default:
       return TextField;
   }
+
+  return invariant(false, "Unsupported field type: %s", props.fieldType);
 });
+
+export default AutoField;
diff --git a/packages/uniforms-patternfly/src/AutoFields.tsx b/packages/uniforms-patternfly/src/AutoFields.tsx
new file mode 100644
index 0000000000..09b779fff5
--- /dev/null
+++ b/packages/uniforms-patternfly/src/AutoFields.tsx
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { ComponentType, createElement } from "react";
+import { useForm } from "uniforms";
+import AutoField from "./AutoField";
+
+export type AutoFieldsProps = {
+  autoField?: ComponentType<{ name: string }>;
+  element?: ComponentType | string;
+  fields?: string[];
+  omitFields?: string[];
+};
+
+function AutoFields({ autoField = AutoField, element = "div", fields, omitFields = [], ...props }: AutoFieldsProps) {
+  const { schema } = useForm();
+
+  return createElement(
+    element!,
+    props,
+    (fields ?? schema.getSubfields())
+      .filter((field) => !omitFields!.includes(field))
+      .map((field) => createElement(autoField!, { key: field, name: field }))
+  );
+}
+
+export default AutoFields;
diff --git a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts b/packages/uniforms-patternfly/src/AutoForm.tsx
similarity index 64%
copy from packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts
copy to packages/uniforms-patternfly/src/AutoForm.tsx
index 7f7980f259..f8a58b03e1 100644
--- a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts
+++ b/packages/uniforms-patternfly/src/AutoForm.tsx
@@ -1,5 +1,5 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,4 +14,15 @@
  * limitations under the License.
  */
 
-export const LATEST_VERSION_COMPATIBLE_WITH_LFS = "0.25.0";
+import { AutoForm } from "uniforms";
+import ValidatedQuickForm from "./ValidatedQuickForm";
+
+function Auto(parent: any): any {
+  class _ extends AutoForm.Auto(parent) {
+    static Auto = Auto;
+  }
+
+  return _;
+}
+
+export default Auto(ValidatedQuickForm);
diff --git a/packages/uniforms-patternfly/src/BaseForm.tsx b/packages/uniforms-patternfly/src/BaseForm.tsx
new file mode 100644
index 0000000000..4e0d65e544
--- /dev/null
+++ b/packages/uniforms-patternfly/src/BaseForm.tsx
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { Form } from "@patternfly/react-core";
+import { BaseForm, context } from "uniforms";
+
+function Patternfly(parent: any): any {
+  class _ extends parent {
+    static Patternfly = Patternfly;
+
+    static displayName = `Patternfly${parent.displayName}`;
+
+    render() {
+      return (
+        <context.Provider value={this.getContext()}>
+          <Form data-testid="base-form" {...this.getNativeFormProps()} />
+        </context.Provider>
+      );
+    }
+  }
+
+  return _;
+}
+
+export default Patternfly(BaseForm);
diff --git a/packages/uniforms-patternfly/src/BoolField.tsx b/packages/uniforms-patternfly/src/BoolField.tsx
new file mode 100644
index 0000000000..c0565d0bdd
--- /dev/null
+++ b/packages/uniforms-patternfly/src/BoolField.tsx
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { Checkbox, CheckboxProps } from "@patternfly/react-core/dist/js/components/Checkbox";
+import { Switch, SwitchProps } from "@patternfly/react-core/dist/js/components/Switch";
+import { connectField, FieldProps } from "uniforms";
+import wrapField from "./wrapField";
+
+enum ComponentType {
+  checkbox = "checkbox",
+  switch = "switch",
+}
+
+export type BoolFieldProps = FieldProps<
+  boolean,
+  CheckboxProps & SwitchProps,
+  {
+    appearance?: ComponentType;
+    inputRef?: React.RefObject<Switch | Checkbox> & React.RefObject<HTMLInputElement>;
+  }
+>;
+
+function BoolField({ appearance, disabled, id, inputRef, label, name, onChange, value, ...props }: BoolFieldProps) {
+  const Component = appearance === ComponentType.switch ? Switch : Checkbox;
+  return wrapField(
+    { id, ...props },
+    <Component
+      data-testid={"bool-field"}
+      isChecked={value ?? false}
+      isDisabled={disabled}
+      id={id}
+      name={name}
+      onChange={() => disabled || onChange(!value)}
+      ref={inputRef}
+      label={label}
+    />
+  );
+}
+
+BoolField.defaultProps = { appearance: ComponentType.checkbox };
+
+export default connectField(BoolField);
diff --git a/packages/uniforms-patternfly/src/DateField.tsx b/packages/uniforms-patternfly/src/DateField.tsx
new file mode 100644
index 0000000000..e98a8f562e
--- /dev/null
+++ b/packages/uniforms-patternfly/src/DateField.tsx
@@ -0,0 +1,184 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { useCallback, useMemo } from "react";
+import { connectField, FieldProps } from "uniforms";
+import { DatePicker } from "@patternfly/react-core/dist/js/components/DatePicker";
+import { InputGroup } from "@patternfly/react-core/dist/js/components/InputGroup";
+import { TimePicker } from "@patternfly/react-core/dist/js/components/TimePicker";
+import { TextInputProps } from "@patternfly/react-core/dist/js/components/TextInput";
+import { Flex, FlexItem } from "@patternfly/react-core/dist/js/layouts/Flex";
+import wrapField from "./wrapField";
+
+export type DateFieldProps = FieldProps<
+  string,
+  TextInputProps,
+  {
+    inputRef?: React.RefObject<HTMLInputElement>;
+    max?: string;
+    min?: string;
+  }
+>;
+
+const DateConstructor = (typeof global === "object" ? global : window).Date;
+
+function DateField({ onChange, ...props }: DateFieldProps) {
+  const dateValue = useCallback(
+    (newDate?: Date) => {
+      if (newDate) {
+        return new DateConstructor(newDate);
+      }
+      if (!props.value) {
+        return undefined;
+      }
+      return new DateConstructor(props.value);
+    },
+    [props.value]
+  );
+
+  const parseDate = useMemo(() => {
+    const date = dateValue();
+    if (!date) {
+      return "";
+    }
+    return date.toISOString().slice(0, -14);
+  }, [dateValue]);
+
+  const parseTime = useMemo(() => {
+    const date = dateValue();
+    if (!date) {
+      return "";
+    }
+    return `${date.getUTCHours()}:${date.getUTCMinutes()}`;
+  }, [dateValue]);
+
+  const onDateChange = useCallback(
+    (value: string, date?: Date) => {
+      if (!date) {
+        onChange(date);
+      } else {
+        const newDate = dateValue(date);
+        const time = parseTime;
+        if (time !== "") {
+          newDate?.setUTCHours(parseInt(time?.split(":")[0]));
+          newDate?.setUTCMinutes(parseInt(time?.split(":")[1]?.split(" ")[0]));
+        } else {
+          newDate?.setUTCHours(0);
+          newDate?.setUTCMinutes(0);
+        }
+        onChange(newDate?.toISOString());
+      }
+    },
+    [onChange, parseTime, dateValue]
+  );
+
+  const isInvalid = useMemo(() => {
+    const date = dateValue();
+    if (date) {
+      if (props.min) {
+        const minDate = new Date(props.min);
+        if (minDate.toString() === "Invalid Date") {
+          return false;
+        } else if (date < minDate) {
+          return `Should be after ${minDate.toISOString()}`;
+        }
+      }
+      if (props.max) {
+        const maxDate = new Date(props.max);
+        if (maxDate.toString() === "Invalid Date") {
+          return false;
+        } else if (date > maxDate) {
+          return `Should be before ${maxDate.toISOString()}`;
+        }
+      }
+    }
+    return false;
+  }, [dateValue, props.min, props.max]);
+
+  const onTimeChange = useCallback(
+    (time: string, hours?: number, minutes?: number) => {
+      const newDate = dateValue();
+      if (newDate) {
+        if (hours && minutes) {
+          newDate.setUTCHours(hours);
+          newDate.setUTCMinutes(minutes);
+        } else if (time !== "") {
+          const localeHours = parseInt(time?.split(":")[0]);
+          const localeMinutes = parseInt(time?.split(":")[1]?.split(" ")[0]);
+          if (!isNaN(localeHours) && !isNaN(localeMinutes)) {
+            newDate.setUTCHours(localeHours);
+            newDate.setUTCMinutes(localeMinutes);
+          }
+        } else {
+          newDate.setUTCHours(0);
+          newDate.setUTCMinutes(0);
+        }
+        onChange(newDate.toISOString());
+      }
+    },
+    [onChange, dateValue]
+  );
+
+  return wrapField(
+    props as any,
+    <Flex
+      data-testid={"date-field"}
+      style={{ margin: 0 }}
+      direction={{ default: "column" }}
+      id={props.id}
+      name={props.name}
+      ref={props.inputRef}
+    >
+      <FlexItem style={{ margin: 0 }}>
+        <InputGroup style={{ background: "transparent" }}>
+          <DatePicker
+            id={`date-picker-${props.id}`}
+            data-testid={`date-picker`}
+            isDisabled={props.disabled}
+            name={props.name}
+            onChange={onDateChange}
+            value={parseDate}
+          />
+          <TimePicker
+            id={`time-picker-${props.id}`}
+            data-testid={`time-picker`}
+            isDisabled={props.disabled || !props.value}
+            name={props.name}
+            onChange={onTimeChange}
+            style={{ width: "120px" }}
+            value={parseTime}
+            is24Hour
+          />
+        </InputGroup>
+      </FlexItem>
+      {isInvalid && (
+        <div
+          id={`${props.id}-invalid-date-time`}
+          style={{
+            fontSize: "0.875rem",
+            color: "#c9190b",
+            marginTop: "0.25rem",
+          }}
+        >
+          {isInvalid}
+        </div>
+      )}
+    </Flex>
+  );
+}
+
+export default connectField(DateField);
diff --git a/packages/uniforms-patternfly/src/ErrorField.tsx b/packages/uniforms-patternfly/src/ErrorField.tsx
new file mode 100644
index 0000000000..fff76f5c7f
--- /dev/null
+++ b/packages/uniforms-patternfly/src/ErrorField.tsx
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { HTMLProps } from "react";
+import { connectField, filterDOMProps, Override } from "uniforms";
+
+export type ErrorFieldProps = Override<
+  HTMLProps<HTMLDivElement>,
+  {
+    error?: boolean;
+    errorMessage?: string;
+  }
+>;
+
+function ErrorField({ children, error, errorMessage, ...props }: ErrorFieldProps) {
+  return !error ? null : (
+    <div data-testid={"error-field"} {...filterDOMProps(props)}>
+      {children ? children : <div style={{ margin: "3px" }}>{errorMessage}</div>}
+    </div>
+  );
+}
+
+ErrorField.defaultProps = {
+  style: {
+    backgroundColor: "rgba(255, 85, 0, 0.2)",
+    border: "1px solid rgb(255, 85, 0)",
+    borderRadius: "7px",
+    margin: "20px 0px",
+    padding: "10px",
+  },
+};
+
+export default connectField<ErrorFieldProps>(ErrorField, { initialValue: false });
diff --git a/packages/uniforms-patternfly/src/ErrorsField.tsx b/packages/uniforms-patternfly/src/ErrorsField.tsx
new file mode 100644
index 0000000000..b62f66027a
--- /dev/null
+++ b/packages/uniforms-patternfly/src/ErrorsField.tsx
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { HTMLProps } from "react";
+import { useForm, filterDOMProps } from "uniforms";
+
+export type ErrorsFieldProps = HTMLProps<HTMLDivElement>;
+
+function ErrorsField({ children, ...props }: ErrorsFieldProps) {
+  const { error, schema } = useForm();
+
+  return !error && !children ? null : (
+    <div data-testid={"errors-field"} {...filterDOMProps(props)}>
+      {children}
+      <ul>
+        {schema.getErrorMessages(error).map((message, index) => (
+          <li key={index} style={{ margin: "3px" }}>
+            {message}
+          </li>
+        ))}
+      </ul>
+    </div>
+  );
+}
+
+ErrorsField.defaultProps = {
+  style: {
+    backgroundColor: "rgba(255, 85, 0, 0.2)",
+    border: "1px solid rgb(255, 85, 0)",
+    borderRadius: "7px",
+    margin: "20px 0px",
+    padding: "10px",
+  },
+};
+
+export default ErrorsField;
diff --git a/packages/uniforms-patternfly/src/HiddenField.tsx b/packages/uniforms-patternfly/src/HiddenField.tsx
new file mode 100644
index 0000000000..633dc3b892
--- /dev/null
+++ b/packages/uniforms-patternfly/src/HiddenField.tsx
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { HTMLProps, Ref, useEffect } from "react";
+import { useField, filterDOMProps } from "uniforms";
+
+export type HiddenFieldProps = {
+  inputRef?: Ref<HTMLInputElement>;
+  name: string;
+  noDOM?: boolean;
+  value?: any;
+} & HTMLProps<HTMLInputElement>;
+
+export default function HiddenField({ value, ...rawProps }: HiddenFieldProps) {
+  const props = useField(rawProps.name, rawProps, { initialValue: false })[0];
+
+  useEffect(() => {
+    if (value !== undefined && value !== props.value) props.onChange(value);
+  });
+
+  return props.noDOM ? null : (
+    <input
+      data-testid="hidden-field"
+      disabled={props.disabled}
+      name={props.name}
+      ref={props.inputRef}
+      type="hidden"
+      value={value ?? props.value ?? ""}
+      {...filterDOMProps(props)}
+    />
+  );
+}
diff --git a/packages/uniforms-patternfly/src/ListAddField.tsx b/packages/uniforms-patternfly/src/ListAddField.tsx
new file mode 100644
index 0000000000..923f3c6eb8
--- /dev/null
+++ b/packages/uniforms-patternfly/src/ListAddField.tsx
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import cloneDeep from "lodash/cloneDeep";
+import { Button, ButtonProps } from "@patternfly/react-core/dist/js/components/Button";
+import { PlusCircleIcon } from "@patternfly/react-icons/dist/js/icons/plus-circle-icon";
+import { connectField, FieldProps, filterDOMProps, joinName, useField } from "uniforms";
+
+export type ListAddFieldProps = FieldProps<
+  unknown,
+  ButtonProps,
+  {
+    initialCount?: number;
+    name: string;
+    disabled?: boolean;
+    value?: unknown;
+  }
+>;
+
+function ListAddField({ disabled = false, name, value, ...props }: ListAddFieldProps) {
+  const nameParts = joinName(null, name);
+  const parentName = joinName(nameParts.slice(0, -1));
+  const parent = useField<{ maxCount?: number }, unknown[]>(parentName, {}, { absoluteName: true })[0];
+
+  const limitNotReached = !disabled && !(parent.maxCount! <= parent.value!.length);
+
+  return (
+    <Button
+      data-testid={"list-add-field"}
+      variant="plain"
+      style={{ paddingLeft: "0", paddingRight: "0" }}
+      disabled={!limitNotReached}
+      onClick={() => {
+        !disabled && limitNotReached && parent.onChange(parent.value!.concat([cloneDeep(value)]));
+      }}
+      {...filterDOMProps(props)}
+    >
+      <PlusCircleIcon color="#0088ce" />
+    </Button>
+  );
+}
+
+export default connectField<ListAddFieldProps>(ListAddField, {
+  initialValue: false,
+  kind: "leaf",
+});
diff --git a/packages/uniforms-patternfly/src/ListDelField.tsx b/packages/uniforms-patternfly/src/ListDelField.tsx
new file mode 100644
index 0000000000..cfe69d527d
--- /dev/null
+++ b/packages/uniforms-patternfly/src/ListDelField.tsx
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { ReactNode } from "react";
+import { Button, ButtonProps } from "@patternfly/react-core/dist/js/components/Button";
+import { MinusCircleIcon } from "@patternfly/react-icons/dist/js/icons/minus-circle-icon";
+import { connectField, FieldProps, filterDOMProps, joinName, useField } from "uniforms";
+
+export type ListDelFieldProps = FieldProps<unknown, ButtonProps, { icon?: ReactNode }>;
+
+function ListDelField({ name, disabled, ...props }: ListDelFieldProps) {
+  const nameParts = joinName(null, name);
+  const nameIndex = +nameParts[nameParts.length - 1];
+  const parentName = joinName(nameParts.slice(0, -1));
+  const parent = useField<{ minCount?: number }, unknown[]>(parentName, {}, { absoluteName: true })[0];
+
+  const limitNotReached = !disabled && !(parent.minCount! >= parent.value!.length);
+
+  return (
+    <Button
+      data-testid={"list-del-field"}
+      disabled={!limitNotReached || disabled}
+      variant="plain"
+      style={{ paddingLeft: "0", paddingRight: "0" }}
+      onClick={() => {
+        const value = parent.value!.slice();
+        value.splice(nameIndex, 1);
+        !disabled && limitNotReached && parent.onChange(value);
+      }}
+      {...filterDOMProps(props)}
+    >
+      <MinusCircleIcon color="#cc0000" />
+    </Button>
+  );
+}
+
+export default connectField<ListDelFieldProps>(ListDelField, {
+  initialValue: false,
+  kind: "leaf",
+});
diff --git a/packages/uniforms-patternfly/src/ListField.tsx b/packages/uniforms-patternfly/src/ListField.tsx
new file mode 100644
index 0000000000..f6c6c2ba75
--- /dev/null
+++ b/packages/uniforms-patternfly/src/ListField.tsx
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { Children, cloneElement, isValidElement, ReactNode } from "react";
+import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
+import { Split, SplitItem } from "@patternfly/react-core/dist/js/layouts/Split";
+import { OutlinedQuestionCircleIcon } from "@patternfly/react-icons/dist/js/icons/outlined-question-circle-icon";
+import { connectField, filterDOMProps, HTMLFieldProps } from "uniforms";
+import ListItemField from "./ListItemField";
+import ListAddField from "./ListAddField";
+
+export type ListFieldProps = HTMLFieldProps<
+  unknown[],
+  HTMLDivElement,
+  {
+    children?: ReactNode;
+    info?: string;
+    error?: boolean;
+    initialCount?: number;
+    itemProps?: object;
+    showInlineError?: boolean;
+  }
+>;
+
+declare module "uniforms" {
+  interface FilterDOMProps {
+    wrapperCol: never;
+    labelCol: never;
+  }
+}
+
+filterDOMProps.register("minCount", "wrapperCol", "labelCol");
+
+function ListField({
+  children = <ListItemField name="$" />,
+  error,
+  errorMessage,
+  info,
+  initialCount,
+  itemProps,
+  label,
+  name,
+  value,
+  showInlineError,
+  ...props
+}: ListFieldProps) {
+  return (
+    <div data-testid={"list-field"} {...filterDOMProps(props)}>
+      <Split hasGutter>
+        <SplitItem>
+          {label && (
+            <label>
+              {label}
+              {!!info && (
+                <span>
+                  &nbsp;
+                  <Tooltip content={info}>
+                    <OutlinedQuestionCircleIcon />
+                  </Tooltip>
+                </span>
+              )}
+            </label>
+          )}
+        </SplitItem>
+        <SplitItem isFilled />
+        <SplitItem>
+          <ListAddField name={"$"} initialCount={initialCount} />
+        </SplitItem>
+      </Split>
+
+      <div>
+        {value?.map((item, itemIndex) =>
+          Children.map(children, (child, childIndex) =>
+            isValidElement(child)
+              ? cloneElement(child as React.ReactElement<{ name: string }, string>, {
+                  key: `${itemIndex}-${childIndex}`,
+                  name: child.props.name
+                    ?.split(/\$(.*)/s)
+                    .slice(0, -1)
+                    .join(`${itemIndex}`),
+                  ...itemProps,
+                })
+              : child
+          )
+        )}
+      </div>
+    </div>
+  );
+}
+
+export default connectField(ListField);
diff --git a/packages/uniforms-patternfly/src/ListItemField.tsx b/packages/uniforms-patternfly/src/ListItemField.tsx
new file mode 100644
index 0000000000..8152e2e96b
--- /dev/null
+++ b/packages/uniforms-patternfly/src/ListItemField.tsx
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { ReactNode } from "react";
+import { connectField } from "uniforms";
+import AutoField from "./AutoField";
+import ListDelField from "./ListDelField";
+
+export type ListItemFieldProps = {
+  children?: ReactNode;
+  value?: unknown;
+};
+
+function ListItemField({ children = <AutoField label={null} name={""} /> }: ListItemFieldProps) {
+  return (
+    <div
+      data-testid={"list-item-field"}
+      style={{
+        marginBottom: "1rem",
+        display: "flex",
+        justifyContent: "space-between",
+      }}
+    >
+      <div style={{ width: "100%", marginRight: "10px" }}>{children}</div>
+      <div>
+        <ListDelField name={""} />
+      </div>
+    </div>
+  );
+}
+
+export default connectField<ListItemFieldProps>(ListItemField, {
+  initialValue: false,
+});
diff --git a/packages/uniforms-patternfly/src/LongTextField.tsx b/packages/uniforms-patternfly/src/LongTextField.tsx
new file mode 100644
index 0000000000..aa3d7bb272
--- /dev/null
+++ b/packages/uniforms-patternfly/src/LongTextField.tsx
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { TextArea } from "@patternfly/react-core/dist/js/components/TextArea";
+import { connectField, filterDOMProps, HTMLFieldProps } from "uniforms";
+
+export type LongTextFieldProps = HTMLFieldProps<
+  string,
+  HTMLDivElement,
+  {
+    inputRef?: React.RefObject<HTMLInputElement>;
+    onChange: (value: string, event: React.ChangeEvent<HTMLTextAreaElement>) => void;
+    value?: string;
+    prefix?: string;
+  }
+>;
+
+function LongTextField({
+  disabled,
+  id,
+  inputRef,
+  label,
+  name,
+  onChange,
+  placeholder,
+  value,
+  ...props
+}: LongTextFieldProps) {
+  return (
+    <div data-testid={"long-text-field"} {...filterDOMProps(props)}>
+      {label && <label htmlFor={id}>{label}</label>}
+      <TextArea
+        id={id}
+        disabled={disabled}
+        name={name}
+        aria-label={name}
+        onChange={(value, event) => onChange(event.target.value)}
+        placeholder={placeholder}
+        ref={inputRef}
+        value={value ?? ""}
+      />
+    </div>
+  );
+}
+
+export default connectField(LongTextField);
diff --git a/packages/uniforms-patternfly/src/NestField.tsx b/packages/uniforms-patternfly/src/NestField.tsx
new file mode 100644
index 0000000000..f9d527babf
--- /dev/null
+++ b/packages/uniforms-patternfly/src/NestField.tsx
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { connectField, filterDOMProps, HTMLFieldProps } from "uniforms";
+import { Card, CardBody } from "@patternfly/react-core/dist/js/components/Card";
+import AutoField from "./AutoField";
+
+export type NestFieldProps = HTMLFieldProps<object, HTMLDivElement, { helperText?: string; itemProps?: object }>;
+
+function NestField({
+  children,
+  error,
+  errorMessage,
+  fields,
+  itemProps,
+  label,
+  name,
+  showInlineError,
+  disabled,
+  ...props
+}: NestFieldProps) {
+  return (
+    <Card data-testid={"nest-field"} {...filterDOMProps(props)}>
+      <CardBody className="pf-c-form">
+        {label && (
+          <label>
+            <b>{label}</b>
+          </label>
+        )}
+        {children || fields?.map((field) => <AutoField key={field} disabled={disabled} name={field} {...itemProps} />)}
+      </CardBody>
+    </Card>
+  );
+}
+
+export default connectField(NestField);
diff --git a/packages/uniforms-patternfly/src/NumField.tsx b/packages/uniforms-patternfly/src/NumField.tsx
new file mode 100644
index 0000000000..b778e1bcb2
--- /dev/null
+++ b/packages/uniforms-patternfly/src/NumField.tsx
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { Ref } from "react";
+import { TextInput, TextInputProps } from "@patternfly/react-core/dist/js/components/TextInput";
+import { connectField } from "uniforms";
+import wrapField from "./wrapField";
+
+export type NumFieldProps = {
+  id: string;
+  decimal?: boolean;
+  inputRef?: Ref<HTMLInputElement>;
+  onChange: (value?: number) => void;
+  disabled?: boolean;
+  value?: number;
+  error?: boolean;
+} & Omit<TextInputProps, "isDisabled">;
+
+function NumField(props: NumFieldProps) {
+  const onChange = (value: string, event: React.FormEvent<HTMLInputElement>) => {
+    const parse = props.decimal ? parseFloat : parseInt;
+    const v = parse((event.target as any)?.value);
+    props.onChange(isNaN(v) ? undefined : v);
+  };
+
+  return wrapField(
+    props,
+    <TextInput
+      data-testid={"num-field"}
+      name={props.name}
+      isDisabled={props.disabled}
+      id={props.id}
+      max={props.max}
+      min={props.min}
+      onChange={onChange}
+      placeholder={props.placeholder}
+      ref={props.inputRef}
+      step={props.decimal ? 0.01 : 1}
+      type="number"
+      value={props.value ?? ""}
+      validated={props.error ? "error" : "default"}
+    />
+  );
+}
+
+export default connectField(NumField);
diff --git a/packages/uniforms-patternfly/src/QuickForm.tsx b/packages/uniforms-patternfly/src/QuickForm.tsx
new file mode 100644
index 0000000000..e9ce315645
--- /dev/null
+++ b/packages/uniforms-patternfly/src/QuickForm.tsx
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { QuickForm } from "uniforms";
+import AutoField from "./AutoField";
+import BaseForm from "./BaseForm";
+import ErrorsField from "./ErrorsField";
+import SubmitField from "./SubmitField";
+
+function Quick(parent: any): any {
+  class _ extends QuickForm.Quick(parent) {
+    static Quick = Quick;
+
+    getAutoField() {
+      return AutoField;
+    }
+
+    getErrorsField() {
+      return ErrorsField;
+    }
+
+    getSubmitField() {
+      return SubmitField;
+    }
+  }
+
+  return _;
+}
+
+export default Quick(BaseForm);
diff --git a/packages/uniforms-patternfly/src/RadioField.tsx b/packages/uniforms-patternfly/src/RadioField.tsx
new file mode 100644
index 0000000000..8ed5cfc86d
--- /dev/null
+++ b/packages/uniforms-patternfly/src/RadioField.tsx
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { Radio } from "@patternfly/react-core/dist/js/components/Radio";
+import { connectField, filterDOMProps, HTMLFieldProps } from "uniforms";
+import wrapField from "./wrapField";
+
+export type RadioFieldProps = HTMLFieldProps<
+  string,
+  HTMLDivElement,
+  {
+    transform?: (string?: string) => string;
+    allowedValues: string[];
+    onChange: (value: string) => void;
+    value?: string;
+    disabled?: boolean;
+  }
+>;
+
+function RadioField(props: RadioFieldProps) {
+  filterDOMProps.register("checkboxes", "decimal");
+  return wrapField(
+    props,
+    <div data-testid={"radio-field"} {...filterDOMProps(props)}>
+      {props.allowedValues?.map((item) => (
+        <React.Fragment key={item}>
+          <Radio
+            isChecked={item === props.value}
+            isDisabled={props.disabled}
+            id={`${props.id}`}
+            name={props.name}
+            label={props.transform ? props.transform(item) : item}
+            aria-label={props.name}
+            onChange={() => props.onChange(item)}
+          />
+        </React.Fragment>
+      ))}
+    </div>
+  );
+}
+
+export default connectField(RadioField);
diff --git a/packages/uniforms-patternfly/src/SelectCheckboxField.tsx b/packages/uniforms-patternfly/src/SelectCheckboxField.tsx
new file mode 100644
index 0000000000..1852633542
--- /dev/null
+++ b/packages/uniforms-patternfly/src/SelectCheckboxField.tsx
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { useMemo } from "react";
+import { Checkbox } from "@patternfly/react-core/dist/js/components/Checkbox";
+import { Radio } from "@patternfly/react-core/dist/js/components/Radio";
+import { filterDOMProps } from "uniforms";
+import { SelectCheckboxProps } from "./SelectField";
+
+function xor<T>(item: T, array: T[]) {
+  const index = array.indexOf(item);
+  if (index === -1) {
+    return array.concat([item]);
+  }
+
+  return array.slice(0, index).concat(array.slice(index + 1));
+}
+
+filterDOMProps.register("autoValue");
+
+function SelectCheckboxField(props: SelectCheckboxProps) {
+  const Group = useMemo(() => (props.fieldType === Array ? Checkbox : Radio), [props]);
+
+  return (
+    <div data-testid={"select-checkbox-field"} {...filterDOMProps(props)}>
+      {props.label && <label>{props.label}</label>}
+      {props.allowedValues!.map((item: string, index: number) => {
+        return (
+          <React.Fragment key={index}>
+            <label htmlFor={props.id}>{props.transform ? props.transform(item) : item}</label>
+            <Group
+              id={`${props.id}-${item}`}
+              isDisabled={props.disabled}
+              name={props.name}
+              aria-label={props.name}
+              value={props.value}
+              isChecked={
+                props.fieldType === Array && Array.isArray(props.value)
+                  ? props.value!.includes(item)
+                  : props.value === item
+              }
+              onChange={() => {
+                props.onChange(props.fieldType === Array && Array.isArray(props.value) ? xor(item, props.value) : item);
+              }}
+            />
+          </React.Fragment>
+        );
+      })}
+    </div>
+  );
+}
+
+export default SelectCheckboxField;
diff --git a/packages/uniforms-patternfly/src/SelectField.tsx b/packages/uniforms-patternfly/src/SelectField.tsx
new file mode 100644
index 0000000000..3992324cf5
--- /dev/null
+++ b/packages/uniforms-patternfly/src/SelectField.tsx
@@ -0,0 +1,53 @@
+import * as React from "react";
+import { SelectDirection, SelectProps } from "@patternfly/react-core/dist/js/components/Select";
+import { connectField, FieldProps } from "uniforms";
+import SelectCheckboxField from "./SelectCheckboxField";
+import SelectInputsField from "./SelectInputsField";
+import { CheckboxProps } from "@patternfly/react-core/dist/js/components/Checkbox";
+import { RadioProps } from "@patternfly/react-core/dist/js/components/Radio";
+
+export type SelectCheckboxProps = FieldProps<
+  string | string[],
+  CheckboxProps | RadioProps,
+  {
+    onChange: (value?: string | string[]) => void;
+    transform?: (value?: string) => string;
+    allowedValues: string[];
+    id?: string;
+    fieldType?: typeof Array;
+    disabled?: boolean;
+  }
+>;
+
+export type SelectInputProps = FieldProps<
+  string | string[],
+  SelectProps,
+  {
+    checkboxes?: boolean;
+    required?: boolean;
+    fieldType?: typeof Array;
+    onChange: (value?: string | string[] | number | number[]) => void;
+    placeholder?: string;
+    allowedValues?: (string | number)[];
+    disabled?: boolean;
+    error?: boolean;
+    transform?: (value?: string | number) => string | number;
+    direction?: SelectDirection;
+    menuAppendTo?: HTMLElement;
+  }
+>;
+
+type SelectFieldProps = SelectCheckboxProps | SelectInputProps;
+
+function isSelectCheckboxProps(toBeDetermined: SelectFieldProps): toBeDetermined is SelectCheckboxProps {
+  return (toBeDetermined as SelectInputProps).checkboxes === true;
+}
+
+function SelectField(props: SelectFieldProps) {
+  if (isSelectCheckboxProps(props)) {
+    return <SelectCheckboxField {...props} />;
+  }
+  return <SelectInputsField {...props} />;
+}
+
+export default connectField<SelectFieldProps>(SelectField);
diff --git a/packages/uniforms-patternfly/src/SelectInputsField.tsx b/packages/uniforms-patternfly/src/SelectInputsField.tsx
new file mode 100644
index 0000000000..d0fa71f4e0
--- /dev/null
+++ b/packages/uniforms-patternfly/src/SelectInputsField.tsx
@@ -0,0 +1,133 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { useCallback, useMemo, useState } from "react";
+import {
+  Select,
+  SelectOption,
+  SelectOptionObject,
+  SelectVariant,
+} from "@patternfly/react-core/dist/js/components/Select";
+import wrapField from "./wrapField";
+import { SelectInputProps } from "./SelectField";
+
+type SelectFieldValue = string | string[] | number | number[];
+
+function isSelectOptionObject(
+  toBeDetermined: string | number | SelectOptionObject
+): toBeDetermined is SelectOptionObject {
+  return typeof toBeDetermined === "object" && !Array.isArray(toBeDetermined) && toBeDetermined !== null;
+}
+
+function isSelectOptionString(toBeDetermined: string[] | number[]): toBeDetermined is string[] {
+  return (toBeDetermined.length > 0 && typeof toBeDetermined[0] === "string") || toBeDetermined.length === 0;
+}
+
+function SelectInputsField(props: SelectInputProps) {
+  const [expanded, setExpanded] = useState<boolean>(false);
+  const [selected, setSelected] = useState<SelectFieldValue | undefined>(() => {
+    if (!props.value) {
+      return [];
+    }
+    if (Array.isArray(props.value)) {
+      return [...props.value];
+    }
+    return props.value;
+  });
+
+  const parseInput = useCallback(
+    (selection: string | number | SelectOptionObject, fieldType: typeof Array): SelectFieldValue => {
+      const parsedSelection = isSelectOptionObject(selection) ? selection.toString() : selection;
+
+      if (fieldType !== Array) {
+        return parsedSelection !== "" ? parsedSelection : "";
+      }
+
+      if (Array.isArray(selected)) {
+        if (isSelectOptionString(selected) && typeof parsedSelection === "string") {
+          if (selected.includes(parsedSelection)) {
+            return selected.filter((s) => s !== parsedSelection);
+          }
+          return [parsedSelection, ...selected];
+        } else if (!isSelectOptionString(selected) && typeof parsedSelection === "number") {
+          if (selected.includes(parsedSelection)) {
+            return selected.filter((s) => s !== parsedSelection);
+          }
+          return [parsedSelection, ...selected];
+        }
+      }
+      return [];
+    },
+    [selected]
+  );
+
+  const handleSelect = useCallback(
+    (event: React.MouseEvent | React.ChangeEvent, selection: string | SelectOptionObject) => {
+      if (selection === props.placeholder) {
+        props.onChange(undefined);
+        setSelected([]);
+      } else {
+        const items = parseInput(selection, props.fieldType);
+        props.onChange(items);
+        setSelected(items);
+      }
+      setExpanded(false);
+    },
+    [parseInput, props]
+  );
+
+  const selectOptions = useMemo(() => {
+    const options: JSX.Element[] = [];
+    if (props.placeholder) {
+      options.push(
+        <SelectOption key={`placeholder ${props.allowedValues!.length}`} isPlaceholder value={props.placeholder} />
+      );
+    }
+    props.allowedValues?.forEach((value) =>
+      options.push(
+        <SelectOption key={value} value={value}>
+          {props.transform ? props.transform(value) : value}
+        </SelectOption>
+      )
+    );
+    return options;
+  }, [props]);
+
+  return wrapField(
+    props as any,
+    <div data-testid={"select-inputs-field"} id={props.id}>
+      <Select
+        isDisabled={props.disabled}
+        id={props.id}
+        variant={props.fieldType === Array ? SelectVariant.typeaheadMulti : SelectVariant.single}
+        name={props.name}
+        placeholderText={props.placeholder}
+        isOpen={expanded}
+        selections={selected}
+        onToggle={(isExpanded) => setExpanded(isExpanded)}
+        onSelect={handleSelect}
+        value={props.value || (props.fieldType === Array ? [] : undefined)}
+        menuAppendTo={props.menuAppendTo}
+        direction={props.direction}
+      >
+        {selectOptions}
+      </Select>
+    </div>
+  );
+}
+
+export default SelectInputsField;
diff --git a/packages/uniforms-patternfly/src/SubmitField.tsx b/packages/uniforms-patternfly/src/SubmitField.tsx
new file mode 100644
index 0000000000..a404a18c49
--- /dev/null
+++ b/packages/uniforms-patternfly/src/SubmitField.tsx
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { Button, ButtonProps } from "@patternfly/react-core/dist/js/components/Button";
+import { Override, useForm } from "uniforms";
+
+export type SubmitFieldProps = Override<ButtonProps, { inputRef?: React.RefObject<HTMLButtonElement> }>;
+
+function SubmitField({ disabled, inputRef, value, ...props }: SubmitFieldProps) {
+  const { error, state } = useForm();
+
+  return (
+    <Button
+      data-testid={"submit-field"}
+      isDisabled={disabled === undefined ? !!(error || state.disabled) : disabled}
+      type="submit"
+      ref={inputRef}
+      variant="primary"
+    >
+      {value}
+    </Button>
+  );
+}
+
+SubmitField.defaultProps = { value: "Submit" };
+
+export default SubmitField;
diff --git a/packages/uniforms-patternfly/src/TextField.tsx b/packages/uniforms-patternfly/src/TextField.tsx
new file mode 100644
index 0000000000..92d5274302
--- /dev/null
+++ b/packages/uniforms-patternfly/src/TextField.tsx
@@ -0,0 +1,187 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { Ref, useCallback, useMemo } from "react";
+import { DatePicker } from "@patternfly/react-core/dist/js/components/DatePicker";
+import { TextInput, TextInputProps } from "@patternfly/react-core/dist/js/components/TextInput";
+import { TimePicker } from "@patternfly/react-core/dist/js/components/TimePicker";
+import { connectField, filterDOMProps } from "uniforms";
+import wrapField from "./wrapField";
+
+export type TextFieldProps = {
+  id: string;
+  decimal?: boolean;
+  inputRef?: Ref<HTMLInputElement>;
+  onChange: (value?: string) => void;
+  value?: string;
+  disabled?: boolean;
+  error?: boolean;
+  errorMessage?: string;
+  helperText?: string;
+  field?: { format: string };
+} & Omit<TextInputProps, "isDisabled">;
+
+const timeRgx = /^([0-1]?[0-9]|2[0-3]):([0-5][0-9])(:[0-5][0-9])?/;
+
+function TextField({ onChange, ...props }: TextFieldProps) {
+  const isDateInvalid = useMemo(() => {
+    if (typeof props.value === "string" && (props.type === "date" || props.field?.format === "date")) {
+      const date = new Date(props.value);
+      if (typeof props.min === "string") {
+        const minDate = new Date(props.min);
+        if (minDate.toString() === "Invalid Date") {
+          return false;
+        } else if (date.toISOString() < minDate.toISOString()) {
+          return props.errorMessage && props.errorMessage.trim().length > 0
+            ? props.errorMessage
+            : `Should be after ${props.min}`;
+        }
+      }
+      if (typeof props.max === "string") {
+        const maxDate = new Date(props.max);
+        if (maxDate.toString() === "Invalid Date") {
+          return false;
+        } else if (date.toISOString() > maxDate.toISOString()) {
+          return props.errorMessage && props.errorMessage.trim().length > 0
+            ? props.errorMessage
+            : `Should be before ${props.max}`;
+        }
+      }
+    }
+    return false;
+  }, [props.value, props.max, props.min, props.errorMessage, props.type, props.field]);
+
+  const parseTime = useCallback((time: string) => {
+    const parsedTime = timeRgx.exec(time);
+    const date = new Date();
+    if (!parsedTime) {
+      return undefined;
+    }
+    date.setUTCHours(Number(parsedTime[1]), Number(parsedTime[2]!));
+    return date;
+  }, []);
+
+  const isTimeInvalid = useMemo(() => {
+    if (typeof props.value === "string" && (props.type === "time" || props.field?.format === "time")) {
+      const parsedTime = parseTime(props.value);
+      if (parsedTime && typeof props.min === "string" && timeRgx.exec(props.min)) {
+        const parsedMin = parseTime(props.min)!;
+        if (parsedTime < parsedMin) {
+          if (parsedMin.getUTCMinutes() < 10) {
+            return `Should be after ${parsedMin.getUTCHours()}:0${parsedMin.getUTCMinutes()}`;
+          }
+          return `Should be after ${parsedMin.getUTCHours()}:${parsedMin.getUTCMinutes()}`;
+        }
+      }
+      if (parsedTime && typeof props.max === "string" && timeRgx.exec(props.max)) {
+        const parsedMax = parseTime(props.max)!;
+        if (parsedTime > parsedMax) {
+          if (parsedMax.getUTCMinutes() < 10) {
+            return `Should be before ${parsedMax.getUTCHours()}:0${parsedMax.getUTCMinutes()}`;
+          }
+          return `Should be before ${parsedMax.getUTCHours()}:${parsedMax.getUTCMinutes()}`;
+        }
+      }
+    }
+    return false;
+  }, [props.type, props.field, props.value, props.max, props.min, parseTime]);
+
+  const onDateChange = useCallback(
+    (value: string) => {
+      onChange(value);
+    },
+    [onChange]
+  );
+
+  const onTimeChange = useCallback(
+    (time: string) => {
+      const parsedTime = time.split(":");
+      if (parsedTime.length === 2) {
+        onChange([...parsedTime, "00"].join(":"));
+      } else {
+        onChange(time);
+      }
+    },
+    [onChange]
+  );
+
+  const { helperText, ...withoutHelperTextProps } = props;
+
+  return wrapField(
+    props,
+    props.type === "date" || props.field?.format === "date" ? (
+      <>
+        <DatePicker
+          data-testid={"text-field-date-picker"}
+          name={props.name}
+          isDisabled={props.disabled}
+          onChange={onDateChange}
+          value={props.value ?? ""}
+          {...filterDOMProps(props)}
+        />
+        {isDateInvalid && (
+          <div
+            style={{
+              fontSize: "0.875rem",
+              color: "#c9190b",
+              marginTop: "0.25rem",
+            }}
+          >
+            {isDateInvalid}
+          </div>
+        )}
+      </>
+    ) : props.type === "time" || props.field?.format === "time" ? (
+      <>
+        <TimePicker
+          data-testid={"text-field-time-picker"}
+          name={props.name}
+          isDisabled={props.disabled}
+          onChange={onTimeChange}
+          is24Hour
+          value={props.value ?? ""}
+        />
+        {isTimeInvalid && (
+          <div
+            style={{
+              fontSize: "0.875rem",
+              color: "#c9190b",
+              marginTop: "0.25rem",
+            }}
+          >
+            {isTimeInvalid}
+          </div>
+        )}
+      </>
+    ) : (
+      <TextInput
+        data-testid={"text-field"}
+        name={props.name}
+        isDisabled={props.disabled}
+        validated={props.error ? "error" : "default"}
+        onChange={(value, event) => onChange((event.target as any)?.value)}
+        placeholder={props.placeholder}
+        ref={props.inputRef}
+        type={props.type ?? "text"}
+        value={props.value ?? ""}
+        {...filterDOMProps(withoutHelperTextProps)}
+      />
+    )
+  );
+}
+
+export default connectField(TextField);
diff --git a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts b/packages/uniforms-patternfly/src/ValidatedForm.tsx
similarity index 64%
copy from packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts
copy to packages/uniforms-patternfly/src/ValidatedForm.tsx
index 7f7980f259..67e88ce074 100644
--- a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts
+++ b/packages/uniforms-patternfly/src/ValidatedForm.tsx
@@ -1,5 +1,5 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,4 +14,15 @@
  * limitations under the License.
  */
 
-export const LATEST_VERSION_COMPATIBLE_WITH_LFS = "0.25.0";
+import { ValidatedForm } from "uniforms";
+import BaseForm from "./BaseForm";
+
+function Validated(parent: any): any {
+  class _ extends ValidatedForm.Validated(parent) {
+    static Validated = Validated;
+  }
+
+  return _;
+}
+
+export default Validated(BaseForm);
diff --git a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts b/packages/uniforms-patternfly/src/ValidatedQuickForm.tsx
similarity index 70%
copy from packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts
copy to packages/uniforms-patternfly/src/ValidatedQuickForm.tsx
index 7f7980f259..a794533c0e 100644
--- a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts
+++ b/packages/uniforms-patternfly/src/ValidatedQuickForm.tsx
@@ -1,5 +1,5 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,4 +14,8 @@
  * limitations under the License.
  */
 
-export const LATEST_VERSION_COMPATIBLE_WITH_LFS = "0.25.0";
+import BaseForm from "./BaseForm";
+import QuickForm from "./QuickForm";
+import ValidatedForm from "./ValidatedForm";
+
+export default ValidatedForm.Validated(QuickForm.Quick(BaseForm));
diff --git a/packages/uniforms-patternfly/src/__tests__/AutoField.test.tsx b/packages/uniforms-patternfly/src/__tests__/AutoField.test.tsx
new file mode 100644
index 0000000000..ac55835414
--- /dev/null
+++ b/packages/uniforms-patternfly/src/__tests__/AutoField.test.tsx
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { AutoField } from "..";
+import { usingUniformsContext } from "./test-utils";
+import { render, screen } from "@testing-library/react";
+
+test("<AutoField> - works - default field", () => {
+  render(usingUniformsContext(<AutoField name="x" />, { x: { type: String } }));
+  expect(screen.getByTestId("text-field")).toBeInTheDocument();
+});
+
+test("<AutoField> - renders RadioField", () => {
+  render(
+    usingUniformsContext(<AutoField name="x" />, {
+      x: {
+        type: String,
+        allowedValues: ["x", "y"],
+        uniforms: { checkboxes: true },
+      },
+    })
+  );
+
+  expect(screen.getByTestId("radio-field")).toBeInTheDocument();
+});
+
+test("<AutoField> - renders SelectField - input", () => {
+  render(
+    usingUniformsContext(<AutoField name="x" />, {
+      x: { type: Array, allowedValues: ["x", "y"] },
+      "x.$": { type: String },
+    })
+  );
+
+  expect(screen.getByTestId("select-inputs-field")).toBeInTheDocument();
+});
+
+test("<AutoField> - renders SelectField - checkbox", () => {
+  render(
+    usingUniformsContext(
+      <AutoField name="x" checkboxes={true} />,
+
+      {
+        x: { type: Array, allowedValues: ["x", "y"] },
+        "x.$": { type: String },
+      }
+    )
+  );
+
+  expect(screen.getByTestId("select-checkbox-field")).toBeInTheDocument();
+});
+
+test("<AutoField> - renders DateField", () => {
+  render(usingUniformsContext(<AutoField name="x" />, { x: { type: Date } }));
+  expect(screen.getByTestId("date-field")).toBeInTheDocument();
+});
+
+test("<AutoField> - renders ListField", () => {
+  render(usingUniformsContext(<AutoField name="x" />, { x: { type: Array }, "x.$": { type: String } }));
+  expect(screen.getByTestId("list-field")).toBeInTheDocument();
+});
+
+test("<AutoField> - renders NumField", () => {
+  render(usingUniformsContext(<AutoField name="x" />, { x: { type: Number } }));
+  expect(screen.getByTestId("num-field")).toBeInTheDocument();
+});
+
+test("<AutoField> - renders NestField", () => {
+  render(usingUniformsContext(<AutoField name="x" />, { x: { type: Object } }));
+  expect(screen.getByTestId("nest-field")).toBeInTheDocument();
+});
+
+test("<AutoField> - renders TextField", () => {
+  render(usingUniformsContext(<AutoField name="x" />, { x: { type: String } }));
+  expect(screen.getByTestId("text-field")).toBeInTheDocument();
+});
+
+test("<AutoField> - renders BoolField", () => {
+  render(usingUniformsContext(<AutoField name="x" />, { x: { type: Boolean } }));
+  expect(screen.getByTestId("bool-field")).toBeInTheDocument();
+});
+
+test("<AutoField> - renders Component (model)", () => {
+  const Component = jest.fn(() => null);
+  render(usingUniformsContext(<AutoField name="x" />, { x: { type: String, uniforms: { component: Component } } }));
+  expect(Component).toHaveBeenCalledTimes(1);
+});
+
+test("<AutoField> - renders Component (specified)", () => {
+  const Component = jest.fn(() => null);
+  render(usingUniformsContext(<AutoField name="x" component={Component} />, { x: { type: String } }));
+  expect(Component).toHaveBeenCalledTimes(1);
+});
diff --git a/packages/uniforms-patternfly/src/__tests__/AutoFields.test.tsx b/packages/uniforms-patternfly/src/__tests__/AutoFields.test.tsx
new file mode 100644
index 0000000000..421d64b822
--- /dev/null
+++ b/packages/uniforms-patternfly/src/__tests__/AutoFields.test.tsx
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { AutoFields } from "..";
+import { usingUniformsContext } from "./test-utils";
+import { render, screen } from "@testing-library/react";
+
+test("<AutoFields> - works", () => {
+  render(usingUniformsContext(<AutoFields />, { x: { type: String } }));
+  expect(screen.getByTestId("text-field")).toBeInTheDocument();
+});
+
+test("<AutoFields> - render all fields by default", () => {
+  render(
+    usingUniformsContext(<AutoFields />, {
+      x: { type: String },
+      y: { type: String },
+      z: { type: String },
+    })
+  );
+
+  expect(screen.getAllByTestId("text-field")).toHaveLength(3);
+});
+
+test("<AutoFields> - renders only specified fields", () => {
+  render(
+    usingUniformsContext(
+      <AutoFields fields={["x", "y"]} />,
+
+      {
+        x: { type: String },
+        y: { type: String },
+        z: { type: String },
+      }
+    )
+  );
+
+  expect(screen.getAllByTestId("text-field")).toHaveLength(2);
+  expect(screen.queryByLabelText("z")).toBeNull();
+});
+
+test("<AutoFields> - does not render ommited fields", () => {
+  render(
+    usingUniformsContext(
+      <AutoFields omitFields={["x"]} />,
+
+      {
+        x: { type: String },
+        y: { type: String },
+        z: { type: String },
+      }
+    )
+  );
+
+  expect(screen.getAllByTestId("text-field")).toHaveLength(2);
+  expect(screen.queryByLabelText("x")).toBeNull();
+});
+
+test("<AutoFields> - works with custom component", () => {
+  const Component = jest.fn(() => null);
+
+  render(
+    usingUniformsContext(
+      <AutoFields autoField={Component} />,
+
+      {
+        x: { type: String },
+        y: { type: String },
+        z: { type: String },
+      }
+    )
+  );
+
+  expect(Component).toHaveBeenCalledTimes(3);
+});
+
+test("<AutoFields> - wraps fields in specified element", () => {
+  render(
+    usingUniformsContext(
+      <AutoFields element="section" />,
+
+      {
+        x: { type: String },
+        y: { type: String },
+        z: { type: String },
+      }
+    )
+  );
+
+  expect(screen.getAllByTestId("text-field")).toHaveLength(3);
+});
diff --git a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts b/packages/uniforms-patternfly/src/__tests__/AutoForm.test.tsx
similarity index 57%
copy from packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts
copy to packages/uniforms-patternfly/src/__tests__/AutoForm.test.tsx
index 7f7980f259..81eacdf661 100644
--- a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts
+++ b/packages/uniforms-patternfly/src/__tests__/AutoForm.test.tsx
@@ -1,5 +1,5 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,4 +14,12 @@
  * limitations under the License.
  */
 
-export const LATEST_VERSION_COMPATIBLE_WITH_LFS = "0.25.0";
+import * as React from "react";
+import { AutoForm } from "../";
+import { createSimpleSchema, usingUniformsContext } from "./test-utils";
+import { render, screen } from "@testing-library/react";
+
+test("<AutoForm> - works", () => {
+  render(usingUniformsContext(<AutoForm schema={createSimpleSchema()} />));
+  expect(screen.getByTestId("base-form")).toBeInTheDocument();
+});
diff --git a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts b/packages/uniforms-patternfly/src/__tests__/BaseForm.test.tsx
similarity index 57%
copy from packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts
copy to packages/uniforms-patternfly/src/__tests__/BaseForm.test.tsx
index 7f7980f259..65d5244541 100644
--- a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts
+++ b/packages/uniforms-patternfly/src/__tests__/BaseForm.test.tsx
@@ -1,5 +1,5 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,4 +14,12 @@
  * limitations under the License.
  */
 
-export const LATEST_VERSION_COMPATIBLE_WITH_LFS = "0.25.0";
+import * as React from "react";
+import { BaseForm } from "../";
+import { usingUniformsContext, createSimpleSchema } from "./test-utils";
+import { render, screen } from "@testing-library/react";
+
+test("<BaseForm> - works", () => {
+  render(usingUniformsContext(<BaseForm schema={createSimpleSchema()} />));
+  expect(screen.getByTestId("base-form")).toBeInTheDocument();
+});
diff --git a/packages/uniforms-patternfly/src/__tests__/BoolField.test.tsx b/packages/uniforms-patternfly/src/__tests__/BoolField.test.tsx
new file mode 100644
index 0000000000..208df40ba0
--- /dev/null
+++ b/packages/uniforms-patternfly/src/__tests__/BoolField.test.tsx
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { BoolField } from "..";
+import { render, screen, fireEvent } from "@testing-library/react";
+import { usingUniformsContext } from "./test-utils";
+
+test("<BoolField> - renders an input", () => {
+  render(usingUniformsContext(<BoolField name="x" />, { x: { type: Boolean } }));
+
+  expect(screen.getByTestId("bool-field")).toBeInTheDocument();
+});
+
+test("<BoolField> - renders a input with correct id (inherited)", () => {
+  render(usingUniformsContext(<BoolField name="x" />, { x: { type: Boolean } }));
+
+  expect(screen.getByTestId("bool-field")).toBeInTheDocument();
+  expect(screen.getByTestId("bool-field").getAttribute("id")).toEqual("uniforms-0000-0001");
+});
+
+test("<BoolField> - renders a input with correct id (specified)", () => {
+  render(usingUniformsContext(<BoolField name="x" id="y" />, { x: { type: Boolean } }));
+
+  expect(screen.getByTestId("bool-field")).toBeInTheDocument();
+  expect(screen.getByTestId("bool-field").getAttribute("id")).toBe("y");
+});
+
+test("<BoolField> - renders a input with correct name", () => {
+  render(usingUniformsContext(<BoolField name="x" />, { x: { type: Boolean } }));
+
+  expect(screen.getByTestId("bool-field")).toBeInTheDocument();
+  expect(screen.getByTestId("bool-field").getAttribute("name")).toBe("x");
+});
+
+test("<BoolField> - renders an input with correct type", () => {
+  render(usingUniformsContext(<BoolField name="x" />, { x: { type: Boolean } }));
+
+  expect(screen.getByTestId("bool-field")).toBeInTheDocument();
+  expect(screen.getByTestId("bool-field").getAttribute("type")).toBe("checkbox");
+});
+
+test("<BoolField> - renders an input with correct disabled state", () => {
+  render(usingUniformsContext(<BoolField name="x" disabled={true} />, { x: { type: Boolean } }));
+
+  expect(screen.getByTestId("bool-field")).toBeInTheDocument();
+  expect(screen.getByTestId("bool-field")).toBeDisabled();
+});
+
+test("<BoolField> - renders a input with correct label (specified)", () => {
+  render(usingUniformsContext(<BoolField name="x" label="BoolFieldLabel" />, { x: { type: Boolean } }));
+
+  expect(screen.getByTestId("bool-field")).toBeInTheDocument();
+  expect(screen.getByText("BoolFieldLabel")).toBeInTheDocument();
+});
+
+test("<BoolField> - renders a input with correct value (default)", () => {
+  render(usingUniformsContext(<BoolField name="x" />, { x: { type: Boolean } }));
+
+  expect(screen.getByTestId("bool-field")).toBeInTheDocument();
+  expect(screen.getByTestId("bool-field")).not.toHaveAttribute("checked");
+});
+
+test("<BoolField> - renders a input with correct value (model)", () => {
+  render(usingUniformsContext(<BoolField name="x" />, { x: { type: Boolean } }, { model: { x: true } }));
+
+  expect(screen.getByTestId("bool-field")).toBeInTheDocument();
+  expect(screen.getByTestId("bool-field")).toHaveAttribute("checked");
+});
+
+test("<BoolField> - renders a input with correct value (specified)", () => {
+  render(usingUniformsContext(<BoolField name="x" value />, { x: { type: Boolean } }));
+
+  expect(screen.getByTestId("bool-field")).toBeInTheDocument();
+  expect(screen.getByTestId("bool-field")).toHaveAttribute("checked");
+});
+
+test("<BoolField> - renders a input which correctly reacts on change", () => {
+  const onChange = jest.fn();
+
+  render(usingUniformsContext(<BoolField name="x" />, { x: { type: Boolean } }, { onChange }));
+  expect(screen.getByTestId("bool-field")).toBeInTheDocument();
+
+  fireEvent.click(screen.getByTestId("bool-field"));
+  expect(onChange).toHaveBeenLastCalledWith("x", true);
+});
+
+test("<BoolField> - renders a wrapper with unknown props", () => {
+  render(usingUniformsContext(<BoolField name="x" data-x="x" data-y="y" data-z="z" />, { x: { type: Boolean } }));
+
+  expect(screen.getByTestId("bool-field")).toBeInTheDocument();
+  expect(screen.getByTestId("wrapper-field").getAttribute("data-x")).toBe("x");
+  expect(screen.getByTestId("wrapper-field").getAttribute("data-y")).toBe("y");
+  expect(screen.getByTestId("wrapper-field").getAttribute("data-z")).toBe("z");
+});
diff --git a/packages/uniforms-patternfly/src/__tests__/DateField.test.tsx b/packages/uniforms-patternfly/src/__tests__/DateField.test.tsx
new file mode 100644
index 0000000000..9df35ac27f
--- /dev/null
+++ b/packages/uniforms-patternfly/src/__tests__/DateField.test.tsx
@@ -0,0 +1,188 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { DateField } from "../";
+import { render, screen, fireEvent } from "@testing-library/react";
+import { usingUniformsContext } from "./test-utils";
+
+test("<DateField> - renders an input", () => {
+  render(usingUniformsContext(<DateField name="x" />, { x: { type: Date } }));
+
+  expect(screen.getByTestId("date-field")).toBeInTheDocument();
+});
+
+test("<DateField> - renders a input with correct id (inherited)", () => {
+  render(usingUniformsContext(<DateField name="x" />, { x: { type: Date } }));
+
+  expect(screen.getByTestId("date-field")).toBeInTheDocument();
+  expect(screen.getByTestId("date-picker")).toBeInTheDocument();
+  expect(screen.getByTestId("time-picker")).toBeInTheDocument();
+});
+
+test("<DateField> - renders a input with correct id (specified)", () => {
+  render(usingUniformsContext(<DateField name="x" id="y" />, { x: { type: Date } }));
+
+  expect(screen.getByTestId("date-field")).toBeInTheDocument();
+  expect(screen.getByTestId("date-picker").getAttribute("id")).toBe("date-picker-y");
+  // TimePicker component id is in an inside div
+  expect(screen.getByTestId("time-picker").getElementsByClassName("pf-c-select")[0].getAttribute("id")).toBe(
+    "time-picker-y"
+  );
+});
+
+test("<DateField> - renders a input with correct name", () => {
+  render(usingUniformsContext(<DateField name="x" />, { x: { type: Date } }));
+
+  expect(screen.getByTestId("date-field")).toBeInTheDocument();
+  expect(screen.getByTestId("date-field").getAttribute("name")).toBe("x");
+});
+
+test("<DateField> - renders an input with correct disabled state", () => {
+  render(usingUniformsContext(<DateField name="x" disabled />, { x: { type: Date } }));
+
+  expect(screen.getByTestId("date-field")).toBeInTheDocument();
+
+  const inputs = screen.getByTestId("date-field").getElementsByTagName("input");
+  expect(inputs[0]).toBeDisabled();
+  expect(inputs[1]).toBeDisabled();
+});
+
+test("<DateField> - renders a input with correct label (specified)", () => {
+  render(usingUniformsContext(<DateField required={false} name="x" label="DateFieldLabel" />, { x: { type: Date } }));
+
+  expect(screen.getByTestId("date-field")).toBeInTheDocument();
+  expect(screen.getByText("DateFieldLabel")).toBeInTheDocument();
+});
+
+test("<DateField> - renders a input with correct label (specified)", () => {
+  render(usingUniformsContext(<DateField required={true} name="x" label="DateFieldLabel" />, { x: { type: Date } }));
+
+  expect(screen.getByTestId("date-field")).toBeInTheDocument();
+  expect(screen.getByText("DateFieldLabel")).toBeInTheDocument();
+  expect(screen.getByText("*")).toBeInTheDocument();
+});
+
+test("<DateField> - renders a input with correct value (default)", () => {
+  render(usingUniformsContext(<DateField name="x" />, { x: { type: Date } }));
+
+  expect(screen.getByTestId("date-field")).toBeInTheDocument();
+
+  const inputs = screen.getByTestId("date-field").getElementsByTagName("input");
+  expect(inputs[0].getAttribute("value")).toBe("");
+  expect(inputs[1].getAttribute("value")).toBe("");
+});
+
+test("<DateField> - renders a input with correct value (model)", () => {
+  const now = new Date();
+  render(usingUniformsContext(<DateField name="x" />, { x: { type: Date } }, { model: { x: now } }));
+
+  expect(screen.getByTestId("date-field")).toBeInTheDocument();
+  expect(screen.getByTestId("time-picker").getAttribute("value")).toEqual(
+    `${now.getUTCHours()}:${now.getUTCMinutes()}`
+  );
+});
+
+test("<DateField> - renders a input with correct value (specified)", () => {
+  const now = new Date();
+  render(usingUniformsContext(<DateField name="x" value={now.toISOString()} />, { x: { type: Date } }));
+
+  expect(screen.getByTestId("date-field")).toBeInTheDocument();
+
+  const inputs = screen.getByTestId("date-field").getElementsByTagName("input");
+  expect(inputs[0].getAttribute("value")).toEqual(now.toISOString().slice(0, -14));
+  expect(inputs[1].getAttribute("value")).toBe("");
+});
+
+test("<DateField> - renders a input which correctly reacts on change (DatePicker)", () => {
+  const onChange = jest.fn();
+
+  const now = "2000-04-04";
+  render(usingUniformsContext(<DateField name="x" />, { x: { type: Date } }, { onChange }));
+
+  const input = screen.getByTestId("date-picker").getElementsByTagName("input")[0];
+  fireEvent.change(input, { target: { value: now } });
+
+  expect(onChange).toHaveBeenLastCalledWith("x", `${now}T00:00:00.000Z`);
+});
+
+test("<DateField> - renders a input which correctly reacts on change (DatePicker - empty)", () => {
+  const onChange = jest.fn();
+
+  render(usingUniformsContext(<DateField name="x" onChange={onChange} />, { x: { type: Date } }));
+
+  const input = screen.getByTestId("date-picker").getElementsByTagName("input")[0];
+  fireEvent.change(input, { target: { value: "" } });
+
+  expect(onChange).not.toHaveBeenCalled();
+});
+
+test("<DateField> - renders a input which correctly reacts on change (TimePicker - invalid)", () => {
+  const onChange = jest.fn();
+
+  const now = "10:00";
+  render(usingUniformsContext(<DateField name="x" />, { x: { type: Date } }, { onChange }));
+
+  const input = screen.getByTestId("time-picker").getElementsByTagName("input")[0];
+  fireEvent.change(input, { target: { value: now } });
+
+  expect(onChange).not.toHaveBeenCalled();
+});
+
+test("<DateField> - renders a input which correctly reacts on change (TimePicker - valid)", () => {
+  const onChange = jest.fn();
+
+  const date = "2000-04-04";
+  const time = "10:30";
+  render(usingUniformsContext(<DateField name="x" value={`${date}T00:00:00Z`} />, { x: { type: Date } }, { onChange }));
+
+  const input = screen.getByTestId("time-picker").getElementsByTagName("input")[0];
+  fireEvent.change(input, { target: { value: time } });
+
+  expect(onChange).toHaveBeenLastCalledWith("x", `${date}T${time}:00.000Z`);
+});
+
+test("<DateField> - test max property - valid", () => {
+  const date = "1998-12-31";
+  const max = "1999-01-01T00:00:00Z";
+  render(usingUniformsContext(<DateField name="x" max={max} value={`${date}T00:00:00Z`} />, { x: { type: Date } }));
+
+  expect(screen.queryByTestId("Should be before")).toBeNull();
+});
+
+test("<DateField> - test max property - invalid", () => {
+  const date = "1999-01-02";
+  const max = "1999-01-01T00:00:00.000Z";
+  render(usingUniformsContext(<DateField name="x" max={max} value={`${date}T00:00:00Z`} />, { x: { type: Date } }));
+
+  expect(screen.getByText(`Should be before ${max}`)).toBeInTheDocument();
+});
+
+test("<DateField> - test min property - valid", () => {
+  const date = "1999-01-02";
+  const min = "1999-01-01T00:00:00Z";
+  render(usingUniformsContext(<DateField name="x" min={min} value={`${date}T00:00:00Z`} />, { x: { type: Date } }));
+
+  expect(screen.queryByTestId("Should be after")).toBeNull();
+});
+
+test("<DateField> - test min property - invalid", () => {
+  const date = "1998-12-31";
+  const min = "1999-01-01T00:00:00.000Z";
+  render(usingUniformsContext(<DateField name="x" min={min} value={`${date}T00:00:00Z`} />, { x: { type: Date } }));
+
+  expect(screen.getByText(`Should be after ${min}`)).toBeInTheDocument();
+});
diff --git a/packages/uniforms-patternfly/src/__tests__/ErrorField.test.tsx b/packages/uniforms-patternfly/src/__tests__/ErrorField.test.tsx
new file mode 100644
index 0000000000..496539759c
--- /dev/null
+++ b/packages/uniforms-patternfly/src/__tests__/ErrorField.test.tsx
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { ErrorField } from "..";
+import { render, screen } from "@testing-library/react";
+import { usingUniformsContext } from "./test-utils";
+
+const error = {
+  error: "validation-error",
+  reason: "X is required",
+  details: [{ name: "x", type: "required", details: { value: null } }],
+  message: "X is required [validation-error]",
+};
+
+test("<ErrorField> - works", () => {
+  render(usingUniformsContext(<ErrorField name="x" error={true} />, { x: { type: String } }));
+
+  expect(screen.getByTestId("error-field")).toBeInTheDocument();
+});
+
+test("<ErrorField> - renders correct error message (context)", () => {
+  render(usingUniformsContext(<ErrorField name="x" />, { x: { type: String } }, { error }));
+
+  expect(screen.getByTestId("error-field")).toBeInTheDocument();
+  expect(screen.getByText(error.reason)).toBeInTheDocument();
+});
+
+test("<ErrorField> - renders correct error message (specified)", () => {
+  render(
+    usingUniformsContext(<ErrorField name="x" error={error.details[0]} errorMessage={error.reason} />, {
+      x: { type: String },
+    })
+  );
+
+  expect(screen.getByTestId("error-field")).toBeInTheDocument();
+  expect(screen.getByText(error.reason)).toBeInTheDocument();
+});
diff --git a/packages/uniforms-patternfly/src/__tests__/ErrorsField.test.tsx b/packages/uniforms-patternfly/src/__tests__/ErrorsField.test.tsx
new file mode 100644
index 0000000000..0b5fd0230d
--- /dev/null
+++ b/packages/uniforms-patternfly/src/__tests__/ErrorsField.test.tsx
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { ErrorsField } from "..";
+import { render, screen } from "@testing-library/react";
+import { usingUniformsContext } from "./test-utils";
+
+const error = {
+  error: "validation-error",
+  reason: "X is required",
+  details: [
+    { name: "x", type: "required", details: { value: null } },
+    { name: "y", type: "required", details: { value: null } },
+    { name: "z", type: "required", details: { value: null } },
+  ],
+  message: "X is required [validation-error]",
+};
+
+test("<ErrorsField> - renders list of correct error messages (context)", () => {
+  render(
+    usingUniformsContext(
+      <ErrorsField name="x" />,
+      { x: { type: String }, y: { type: String }, z: { type: String } },
+      { error }
+    )
+  );
+
+  expect(screen.getByTestId("errors-field")).toBeInTheDocument();
+  expect(screen.getByText("X is required")).toBeInTheDocument();
+  expect(screen.getByText("Y is required")).toBeInTheDocument();
+  expect(screen.getByText("Z is required")).toBeInTheDocument();
+});
+
+test("<ErrorsField> - renders children (specified)", () => {
+  render(
+    usingUniformsContext(
+      <ErrorsField name="x">Error message list</ErrorsField>,
+      { x: { type: String }, y: { type: String }, z: { type: String } },
+      { error }
+    )
+  );
+
+  expect(screen.getByText("Error message list")).toBeInTheDocument();
+});
diff --git a/packages/uniforms-patternfly/src/__tests__/HiddenField.test.tsx b/packages/uniforms-patternfly/src/__tests__/HiddenField.test.tsx
new file mode 100644
index 0000000000..3855356b5c
--- /dev/null
+++ b/packages/uniforms-patternfly/src/__tests__/HiddenField.test.tsx
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { HiddenField } from "..";
+import { render, screen, fireEvent } from "@testing-library/react";
+import { usingUniformsContext } from "./test-utils";
+
+test("<HiddenField> - renders an input", () => {
+  render(usingUniformsContext(<HiddenField name="x" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("hidden-field")).toBeInTheDocument();
+});
+
+test("<HiddenField> - renders an input with correct id (inherited)", () => {
+  render(usingUniformsContext(<HiddenField name="x" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("hidden-field")).toBeInTheDocument();
+  expect(screen.getByTestId("hidden-field").getAttribute("id")).toBeTruthy();
+});
+
+test("<HiddenField> - renders an input with correct id (specified)", () => {
+  render(usingUniformsContext(<HiddenField name="x" id="y" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("hidden-field")).toBeInTheDocument();
+  expect(screen.getByTestId("hidden-field").getAttribute("id")).toBe("y");
+});
+
+test("<HiddenField> - renders an input with correct name", () => {
+  render(usingUniformsContext(<HiddenField name="x" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("hidden-field")).toBeInTheDocument();
+  expect(screen.getByTestId("hidden-field").getAttribute("name")).toBe("x");
+});
+
+test("<HiddenField> - renders an input with correct type", () => {
+  render(usingUniformsContext(<HiddenField name="x" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("hidden-field")).toBeInTheDocument();
+  expect(screen.getByTestId("hidden-field").getAttribute("type")).toBe("hidden");
+});
+
+test("<HiddenField> - renders an input with correct value (default)", () => {
+  render(usingUniformsContext(<HiddenField name="x" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("hidden-field")).toBeInTheDocument();
+  expect(screen.getByTestId("hidden-field").getAttribute("value")).toBe("");
+});
+
+test("<HiddenField> - renders an input with correct value (model)", () => {
+  render(usingUniformsContext(<HiddenField name="x" />, { x: { type: String } }, { model: { x: "y" } }));
+
+  expect(screen.getByTestId("hidden-field")).toBeInTheDocument();
+  expect(screen.getByTestId("hidden-field").getAttribute("value")).toBe("y");
+});
+
+test("<HiddenField> - renders an input which correctly reacts on model change", () => {
+  const onChange = jest.fn();
+
+  render(usingUniformsContext(<HiddenField name="x" />, { x: { type: String } }, { onChange }));
+
+  fireEvent.change(screen.getByTestId("hidden-field"), { target: { value: "y" } });
+  expect(screen.getByTestId("hidden-field").getAttribute("value")).toBe("y");
+});
+
+test("<HiddenField> - renders an input which correctly reacts on model change (empty)", () => {
+  const onChange = jest.fn();
+
+  render(usingUniformsContext(<HiddenField name="x" />, { x: { type: String } }, { onChange }));
+
+  fireEvent.change(screen.getByTestId("hidden-field"), { target: { value: undefined } });
+  expect(onChange).not.toHaveBeenCalled();
+});
+
+test("<HiddenField> - renders an input which correctly reacts on model change (same value)", () => {
+  const onChange = jest.fn();
+
+  render(usingUniformsContext(<HiddenField name="x" />, { x: { type: String } }, { model: { x: "y" }, onChange }));
+
+  fireEvent.change(screen.getByTestId("hidden-field"), { target: { value: "y" } });
+
+  expect(onChange).not.toHaveBeenCalled();
+});
+
+test("<HiddenField noDOM> - renders nothing", () => {
+  render(usingUniformsContext(<HiddenField noDOM name="x" />, { x: { type: String } }));
+
+  expect(screen.queryByTestId("hidden-field")).toBeNull();
+});
+
+test("<HiddenField noDOM> - renders nothing which correctly reacts on model change", () => {
+  const onChange = jest.fn();
+
+  render(usingUniformsContext(<HiddenField noDOM name="x" />, { x: { type: String } }, { onChange }));
+
+  expect(screen.queryByTestId("hidden-field")).toBeNull();
+  expect(onChange).not.toHaveBeenCalled();
+});
+
+test("<HiddenField noDOM> - renders nothing which correctly reacts on model change (empty)", () => {
+  const onChange = jest.fn();
+
+  render(usingUniformsContext(<HiddenField noDOM name="x" />, { x: { type: String } }, { onChange }));
+
+  expect(screen.queryByTestId("hidden-field")).toBeNull();
+  expect(onChange).not.toHaveBeenCalled();
+});
+
+test("<HiddenField noDOM> - renders nothing which correctly reacts on model change (same value)", () => {
+  const onChange = jest.fn();
+
+  render(
+    usingUniformsContext(<HiddenField noDOM name="x" />, { x: { type: String } }, { model: { x: "y" }, onChange })
+  );
+
+  expect(screen.queryByTestId("hidden-field")).toBeNull();
+  expect(onChange).not.toHaveBeenCalled();
+});
diff --git a/packages/uniforms-patternfly/src/__tests__/ListAddField.test.tsx b/packages/uniforms-patternfly/src/__tests__/ListAddField.test.tsx
new file mode 100644
index 0000000000..868dbbe9cf
--- /dev/null
+++ b/packages/uniforms-patternfly/src/__tests__/ListAddField.test.tsx
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { ListAddField } from "../";
+import { render, screen, fireEvent } from "@testing-library/react";
+import { usingUniformsContext } from "./test-utils";
+
+const onChange = jest.fn();
+
+const context = { onChange, model: { x: [] } };
+const schema = { x: { type: Array, maxCount: 3 }, "x.$": String };
+
+beforeEach(() => {
+  onChange.mockClear();
+});
+
+test("<ListAddField> - works", () => {
+  render(usingUniformsContext(<ListAddField name="x.$" />, schema, context));
+
+  expect(screen.getByTestId("list-add-field")).toBeInTheDocument();
+});
+
+test("<ListAddField> - prevents onClick when disabled", () => {
+  render(usingUniformsContext(<ListAddField name="x.1" disabled />, schema, context));
+
+  fireEvent.click(screen.getByTestId("list-add-field"));
+  expect(onChange).not.toHaveBeenCalled();
+});
+
+test("<ListAddField> - prevents onClick when limit reached", () => {
+  render(usingUniformsContext(<ListAddField name="x.1" />, { ...schema, x: { ...schema.x, maxCount: 0 } }, context));
+
+  fireEvent.click(screen.getByTestId("list-add-field"));
+  expect(onChange).not.toHaveBeenCalled();
+});
+
+test("<ListAddField> - correctly reacts on click", () => {
+  render(usingUniformsContext(<ListAddField name="x.1" value="y" />, schema, context));
+
+  fireEvent.click(screen.getByTestId("list-add-field"));
+  expect(onChange).toHaveBeenLastCalledWith("x", ["y"]);
+});
diff --git a/packages/uniforms-patternfly/src/__tests__/ListDelField.test.tsx b/packages/uniforms-patternfly/src/__tests__/ListDelField.test.tsx
new file mode 100644
index 0000000000..cdf5710e7e
--- /dev/null
+++ b/packages/uniforms-patternfly/src/__tests__/ListDelField.test.tsx
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { ListDelField } from "../";
+import { render, screen, fireEvent } from "@testing-library/react";
+import { usingUniformsContext } from "./test-utils";
+
+const onChange = jest.fn();
+
+const context = { onChange, model: { x: ["x", "y", "z"] } };
+const schema = { x: { type: Array, maxCount: 3 }, "x.$": String };
+
+beforeEach(() => {
+  onChange.mockClear();
+});
+
+test("<ListDelField> - works", () => {
+  render(usingUniformsContext(<ListDelField name="x.1" />, schema, context));
+
+  expect(screen.getByTestId("list-del-field")).toBeInTheDocument();
+});
+
+test("<ListDelField> - prevents onClick when disabled", () => {
+  render(usingUniformsContext(<ListDelField name="x.1" disabled />, schema, context));
+
+  fireEvent.click(screen.getByTestId("list-del-field"));
+  expect(onChange).not.toHaveBeenCalled();
+});
+
+test("<ListDelField> - prevents onClick when limit reached", () => {
+  render(usingUniformsContext(<ListDelField name="x.1" />, { ...schema, x: { ...schema.x, minCount: 3 } }, context));
+
+  fireEvent.click(screen.getByTestId("list-del-field"));
+  expect(onChange).not.toHaveBeenCalled();
+});
+
+test("<ListDelField> - correctly reacts on click", () => {
+  render(usingUniformsContext(<ListDelField name="x.1" />, schema, context));
+
+  fireEvent.click(screen.getByTestId("list-del-field"));
+  expect(onChange).toHaveBeenLastCalledWith("x", ["x", "z"]);
+});
diff --git a/packages/uniforms-patternfly/src/__tests__/ListField.test.tsx b/packages/uniforms-patternfly/src/__tests__/ListField.test.tsx
new file mode 100644
index 0000000000..8501938884
--- /dev/null
+++ b/packages/uniforms-patternfly/src/__tests__/ListField.test.tsx
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { ListField } from "../";
+import { render, screen } from "@testing-library/react";
+import { usingUniformsContext } from "./test-utils";
+
+test("<ListField> - works", () => {
+  render(usingUniformsContext(<ListField name="x" />, { x: { type: Array }, "x.$": { type: String } }));
+
+  expect(screen.getByTestId("list-field")).toBeInTheDocument();
+});
+
+test("<ListField> - renders ListAddField", () => {
+  render(
+    usingUniformsContext(<ListField name="x" label="ListFieldLabel" />, { x: { type: Array }, "x.$": { type: String } })
+  );
+
+  expect(screen.getByTestId("list-add-field")).toBeInTheDocument();
+  expect(screen.getByText("ListFieldLabel")).toBeInTheDocument();
+});
+
+test("<ListField> - renders correct label (specified)", () => {
+  render(
+    usingUniformsContext(<ListField name="x" label="ListFieldLabel" />, { x: { type: Array }, "x.$": { type: String } })
+  );
+
+  expect(screen.getByText("ListFieldLabel")).toBeInTheDocument();
+});
+
+test("<ListField> - renders correct numer of items with initialCount (specified)", () => {
+  render(
+    usingUniformsContext(<ListField name="x" initialCount={3} />, { x: { type: Array }, "x.$": { type: String } })
+  );
+
+  expect(screen.getAllByTestId("text-field")).toHaveLength(3);
+});
+
+test("<ListField> - renders children (specified)", () => {
+  const Child: () => null = jest.fn(() => null);
+
+  render(
+    usingUniformsContext(
+      <ListField name="x" initialCount={2}>
+        <Child />
+      </ListField>,
+      { x: { type: Array }, "x.$": { type: String } }
+    )
+  );
+
+  expect(Child).toHaveBeenCalledTimes(2);
+});
+
+test("<ListField> - renders children with correct name (children)", () => {
+  const Child: any = jest.fn((props: any) => <div {...props} data-testid={"child-div"} />);
+
+  render(
+    usingUniformsContext(
+      <ListField name="x" initialCount={2}>
+        <Child name="$" />
+      </ListField>,
+      { x: { type: Array }, "x.$": { type: String } }
+    )
+  );
+
+  const childDivs = screen.getAllByTestId("child-div");
+  expect(childDivs[0].getAttribute("name")).toBe("0");
+  expect(childDivs[1].getAttribute("name")).toBe("1");
+});
+
+test("<ListField> - renders children with correct name (value)", () => {
+  render(
+    usingUniformsContext(<ListField name="x" initialCount={2} />, { x: { type: Array }, "x.$": { type: String } })
+  );
+
+  const textFields = screen.getAllByTestId("text-field");
+  expect(textFields[0].getAttribute("name")).toBe("x.0");
+  expect(textFields[1].getAttribute("name")).toBe("x.1");
+});
diff --git a/packages/uniforms-patternfly/src/__tests__/ListItemField.test.tsx b/packages/uniforms-patternfly/src/__tests__/ListItemField.test.tsx
new file mode 100644
index 0000000000..086f75f283
--- /dev/null
+++ b/packages/uniforms-patternfly/src/__tests__/ListItemField.test.tsx
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { ListItemField } from "../";
+import { render, screen } from "@testing-library/react";
+import { usingUniformsContext } from "./test-utils";
+
+test("<ListItemField> - works", () => {
+  render(usingUniformsContext(<ListItemField name="x.1" />, { x: { type: Array }, "x.$": { type: String } }));
+
+  expect(screen.getByTestId("list-item-field")).toBeInTheDocument();
+});
+
+test("<ListItemField> - renders AutoField", () => {
+  const element = <ListItemField name="x.1" />;
+  render(usingUniformsContext(element, { x: { type: Array }, "x.$": { type: String } }));
+
+  expect(screen.getByTestId("text-field")).toBeInTheDocument();
+});
+
+test("<ListItemField> - renders children if specified", () => {
+  const Child: () => null = jest.fn(() => null);
+
+  render(
+    usingUniformsContext(
+      <ListItemField name="x.1">
+        <Child />
+      </ListItemField>,
+      { x: { type: Array }, "x.$": { type: String } }
+    )
+  );
+
+  expect(Child).toHaveBeenCalledTimes(1);
+});
+
+test("<ListItemField> - renders ListDelField", () => {
+  render(usingUniformsContext(<ListItemField name="x.1" />, { x: { type: Array }, "x.$": { type: String } }));
+
+  expect(screen.getByTestId("list-del-field")).toBeInTheDocument();
+  expect(screen.getByTestId("text-field").getAttribute("name")).toBe("x.1");
+});
diff --git a/packages/uniforms-patternfly/src/__tests__/LongTextField.test.tsx b/packages/uniforms-patternfly/src/__tests__/LongTextField.test.tsx
new file mode 100644
index 0000000000..4dcdcb0878
--- /dev/null
+++ b/packages/uniforms-patternfly/src/__tests__/LongTextField.test.tsx
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { LongTextField } from "../";
+import { render, screen, fireEvent } from "@testing-library/react";
+import { usingUniformsContext } from "./test-utils";
+
+test("<LongTextField> - renders a textarea", () => {
+  render(usingUniformsContext(<LongTextField name="x" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("long-text-field")).toBeInTheDocument();
+});
+
+test("<LongTextField> - renders a textarea with correct disabled state", () => {
+  render(usingUniformsContext(<LongTextField name="x" disabled />, { x: { type: String } }));
+
+  expect(screen.getByTestId("long-text-field")).toBeInTheDocument();
+  const textarea = screen.getByTestId("long-text-field").getElementsByTagName("textarea")[0];
+  expect(textarea).toBeDisabled();
+});
+
+test("<LongTextField> - renders a textarea with correct id (inherited)", () => {
+  render(usingUniformsContext(<LongTextField name="x" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("long-text-field")).toBeInTheDocument();
+  const textarea = screen.getByTestId("long-text-field").getElementsByTagName("textarea")[0];
+  expect(textarea.getAttribute("id")).toBeTruthy();
+});
+
+test("<LongTextField> - renders a textarea with correct id (specified)", () => {
+  render(usingUniformsContext(<LongTextField name="x" id="y" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("long-text-field")).toBeInTheDocument();
+  const textarea = screen.getByTestId("long-text-field").getElementsByTagName("textarea")[0];
+  expect(textarea.getAttribute("id")).toBe("y");
+});
+
+test("<LongTextField> - renders a textarea with correct name", () => {
+  render(usingUniformsContext(<LongTextField name="x" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("long-text-field")).toBeInTheDocument();
+  const textarea = screen.getByTestId("long-text-field").getElementsByTagName("textarea")[0];
+  expect(textarea.getAttribute("name")).toBe("x");
+});
+
+test("<LongTextField> - renders a textarea with correct placeholder", () => {
+  render(usingUniformsContext(<LongTextField name="x" placeholder="y" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("long-text-field")).toBeInTheDocument();
+  const textarea = screen.getByTestId("long-text-field").getElementsByTagName("textarea")[0];
+  expect(textarea.getAttribute("placeholder")).toBe("y");
+});
+
+test("<LongTextField> - renders a textarea with correct value (default)", () => {
+  render(usingUniformsContext(<LongTextField name="x" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("long-text-field")).toBeInTheDocument();
+  const textarea = screen.getByTestId("long-text-field").getElementsByTagName("textarea")[0];
+  expect(textarea.getAttribute("value")).toBe(null);
+});
+
+test("<LongTextField> - renders a textarea with correct value (model)", () => {
+  render(usingUniformsContext(<LongTextField name="x" />, { x: { type: String } }, { model: { x: "y" } }));
+
+  expect(screen.getByTestId("long-text-field")).toBeInTheDocument();
+  expect(screen.getByText("y")).toBeInTheDocument();
+});
+
+test("<LongTextField> - renders a textarea with correct value (specified)", () => {
+  render(usingUniformsContext(<LongTextField name="x" value="y" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("long-text-field")).toBeInTheDocument();
+  expect(screen.getByText("y")).toBeInTheDocument();
+});
+
+test("<LongTextField> - renders a textarea which correctly reacts on change", () => {
+  const onChange = jest.fn();
+
+  render(usingUniformsContext(<LongTextField name="x" />, { x: { type: String } }, { onChange }));
+
+  expect(screen.getByTestId("long-text-field")).toBeInTheDocument();
+  const textarea = screen.getByTestId("long-text-field").getElementsByTagName("textarea")[0];
+  fireEvent.change(textarea, { target: { value: "y" } });
+  expect(onChange).toHaveBeenLastCalledWith("x", "y");
+});
+
+test("<LongTextField> - renders a textarea which correctly reacts on change (empty)", () => {
+  const onChange = jest.fn();
+
+  render(usingUniformsContext(<LongTextField name="x" />, { x: { type: String } }, { onChange }));
+
+  expect(screen.getByTestId("long-text-field")).toBeInTheDocument();
+  const textarea = screen.getByTestId("long-text-field").getElementsByTagName("textarea")[0];
+  fireEvent.change(textarea, { target: { value: "" } });
+  expect(onChange).not.toHaveBeenCalled();
+});
+
+test("<LongTextField> - renders a textarea which correctly reacts on change (same value)", () => {
+  const onChange = jest.fn();
+
+  render(usingUniformsContext(<LongTextField name="x" />, { x: { type: String } }, { model: { x: "y" }, onChange }));
+
+  expect(screen.getByTestId("long-text-field")).toBeInTheDocument();
+  const textarea = screen.getByTestId("long-text-field").getElementsByTagName("textarea")[0];
+  fireEvent.change(textarea, { target: { value: "y" } });
+  expect(screen.getByText("y")).toBeInTheDocument();
+  expect(onChange).not.toHaveBeenCalled();
+});
+
+test("<LongTextField> - renders a label", () => {
+  render(usingUniformsContext(<LongTextField name="x" label="y" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("long-text-field")).toBeInTheDocument();
+  expect(screen.getByText("y")).toBeInTheDocument();
+});
diff --git a/packages/uniforms-patternfly/src/__tests__/NestField.test.tsx b/packages/uniforms-patternfly/src/__tests__/NestField.test.tsx
new file mode 100644
index 0000000000..930fcd4923
--- /dev/null
+++ b/packages/uniforms-patternfly/src/__tests__/NestField.test.tsx
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { NestField } from "..";
+import { render, screen } from "@testing-library/react";
+import { usingUniformsContext } from "./test-utils";
+
+test("<NestField> - renders an <AutoField> for each field", () => {
+  render(
+    usingUniformsContext(<NestField name="x" />, {
+      x: { type: Object },
+      "x.a": { type: String },
+      "x.b": { type: Number },
+    })
+  );
+
+  expect(screen.getByTestId("nest-field")).toBeInTheDocument();
+  expect(screen.getByTestId("nest-field").getElementsByTagName("input")).toHaveLength(2);
+  expect(screen.getByTestId("nest-field").getElementsByTagName("input")[0].getAttribute("name")).toBe("x.a");
+  expect(screen.getByTestId("nest-field").getElementsByTagName("input")[1].getAttribute("name")).toBe("x.b");
+});
+
+test("<NestField> - renders custom content if given", () => {
+  render(
+    usingUniformsContext(
+      <NestField name="x">
+        <article data-test="content" />
+      </NestField>,
+      {
+        x: { type: Object },
+        "x.a": { type: String },
+        "x.b": { type: Number },
+      }
+    )
+  );
+
+  expect(screen.getByTestId("nest-field")).toBeInTheDocument();
+  expect(screen.getByTestId("nest-field").getElementsByTagName("article")).toHaveLength(1);
+  expect(screen.getByTestId("nest-field").getElementsByTagName("article")[0].getAttribute("data-test")).toBe("content");
+});
+
+test("<NestField> - renders a label", () => {
+  render(
+    usingUniformsContext(<NestField name="x" label="y" />, {
+      x: { type: Object },
+      "x.a": { type: String },
+      "x.b": { type: Number },
+    })
+  );
+
+  expect(screen.getByTestId("nest-field")).toBeInTheDocument();
+  expect(screen.getByTestId("nest-field").getElementsByTagName("label")).toHaveLength(3);
+  expect(screen.getByTestId("nest-field").getElementsByTagName("label")[0].textContent).toBe("y");
+  expect(screen.getByTestId("nest-field").getElementsByTagName("label")[1].textContent).toBe("A *");
+  expect(screen.getByTestId("nest-field").getElementsByTagName("label")[2].textContent).toBe("B *");
+});
diff --git a/packages/uniforms-patternfly/src/__tests__/NumField.test.tsx b/packages/uniforms-patternfly/src/__tests__/NumField.test.tsx
new file mode 100644
index 0000000000..f083604b77
--- /dev/null
+++ b/packages/uniforms-patternfly/src/__tests__/NumField.test.tsx
@@ -0,0 +1,240 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { NumField } from "..";
+import { render, screen, fireEvent } from "@testing-library/react";
+import { usingUniformsContext } from "./test-utils";
+
+test("<NumField> - renders an input", () => {
+  render(usingUniformsContext(<NumField name="x" />, { x: { type: Number } }));
+
+  expect(screen.getByTestId("num-field")).toBeInTheDocument();
+});
+
+test("<NumField> - renders an input with correct disabled state", () => {
+  render(usingUniformsContext(<NumField name="x" disabled />, { x: { type: Number } }));
+
+  expect(screen.getByTestId("num-field")).toBeInTheDocument();
+  expect(screen.getByTestId("num-field")).toBeDisabled();
+});
+
+test("<NumField> - renders an input with correct id (inherited)", () => {
+  render(usingUniformsContext(<NumField name="x" />, { x: { type: Number } }));
+
+  expect(screen.getByTestId("num-field")).toBeInTheDocument();
+  expect(screen.getByTestId("num-field").getAttribute("id")).toBeTruthy();
+});
+
+test("<NumField> - renders an input with correct id (specified)", () => {
+  render(usingUniformsContext(<NumField name="x" id="y" />, { x: { type: Number } }));
+
+  expect(screen.getByTestId("num-field")).toBeInTheDocument();
+  expect(screen.getByTestId("num-field").getAttribute("id")).toBe("y");
+});
+
+test("<NumField> - renders an input with correct max", () => {
+  render(usingUniformsContext(<NumField name="x" max={10} />, { x: { type: Number } }));
+
+  expect(screen.getByTestId("num-field")).toBeInTheDocument();
+  expect(screen.getByTestId("num-field").getAttribute("max")).toBe("10");
+});
+
+test("<NumField> - renders an input with correct min", () => {
+  render(usingUniformsContext(<NumField name="x" min={10} />, { x: { type: Number } }));
+
+  expect(screen.getByTestId("num-field")).toBeInTheDocument();
+  expect(screen.getByTestId("num-field").getAttribute("min")).toBe("10");
+});
+
+test("<NumField> - renders an input with correct name", () => {
+  render(usingUniformsContext(<NumField name="x" />, { x: { type: Number } }));
+
+  expect(screen.getByTestId("num-field")).toBeInTheDocument();
+  expect(screen.getByTestId("num-field").getAttribute("name")).toBe("x");
+});
+
+test("<NumField> - renders an input with correct placeholder", () => {
+  render(usingUniformsContext(<NumField name="x" placeholder="y" />, { x: { type: Number } }));
+
+  expect(screen.getByTestId("num-field")).toBeInTheDocument();
+  expect(screen.getByTestId("num-field").getAttribute("placeholder")).toBe("y");
+});
+
+test("<NumField> - renders an input with correct step (decimal)", () => {
+  render(usingUniformsContext(<NumField name="x" decimal />, { x: { type: Number } }));
+
+  expect(screen.getByTestId("num-field")).toBeInTheDocument();
+  expect(screen.getByTestId("num-field").getAttribute("step")).toBe("0.01");
+});
+
+test("<NumField> - renders an input with correct step (integer)", () => {
+  render(usingUniformsContext(<NumField name="x" decimal={false} />, { x: { type: Number } }));
+
+  expect(screen.getByTestId("num-field")).toBeInTheDocument();
+  expect(screen.getByTestId("num-field").getAttribute("step")).toBe("1");
+});
+
+test("<NumField> - renders an input with correct type", () => {
+  render(usingUniformsContext(<NumField name="x" />, { x: { type: Number } }));
+
+  expect(screen.getByTestId("num-field")).toBeInTheDocument();
+  expect(screen.getByTestId("num-field").getAttribute("type")).toBe("number");
+});
+
+test("<NumField> - renders an input with correct value (default)", () => {
+  render(usingUniformsContext(<NumField name="x" />, { x: { type: Number } }));
+
+  expect(screen.getByTestId("num-field")).toBeInTheDocument();
+  expect(screen.getByTestId("num-field").getAttribute("value")).toBe("");
+});
+
+test("<NumField> - renders an input with correct value (decimal)", () => {
+  const onChange = jest.fn();
+  render(usingUniformsContext(<NumField name="x" decimal={true} />, { x: { type: Number } }, { onChange }));
+  expect(screen.getByTestId("num-field")).toBeInTheDocument();
+
+  // NOTE: All following tests are here to cover hacky NumField implementation.
+  const spy = jest.spyOn(global.console, "error").mockImplementation(() => {});
+
+  [
+    { value: "0.1", expected: 0.1 },
+    { value: "2", expected: 2 },
+    { value: "-1", expected: -1 },
+  ].forEach(({ value, expected }) => {
+    fireEvent.change(screen.getByTestId("num-field"), { target: { value } });
+    expect(onChange).toHaveBeenLastCalledWith("x", expected);
+  });
+
+  spy.mockRestore();
+});
+
+test("<NumField> - renders an input with correct value (not decimal)", () => {
+  const onChange = jest.fn();
+  render(usingUniformsContext(<NumField name="x" decimal={false} />, { x: { type: Number } }, { onChange }));
+  expect(screen.getByTestId("num-field")).toBeInTheDocument();
+
+  // NOTE: All following tests are here to cover hacky NumField implementation.
+  const spy = jest.spyOn(global.console, "error").mockImplementation(() => {});
+
+  [
+    { value: "0.1", expected: 0 },
+    { value: "2", expected: 2 },
+    { value: "-1", expected: -1 },
+  ].forEach(({ value, expected }) => {
+    fireEvent.change(screen.getByTestId("num-field"), { target: { value } });
+    expect(onChange).toHaveBeenLastCalledWith("x", expected);
+  });
+
+  spy.mockRestore();
+});
+
+test("<NumField> - renders an input with correct value (specified)", () => {
+  render(usingUniformsContext(<NumField name="x" value={2} />, { x: { type: Number } }));
+
+  expect(screen.getByTestId("num-field")).toBeInTheDocument();
+  expect(screen.getByTestId("num-field").getAttribute("value")).toBe("2");
+});
+
+test("<NumField> - renders an input which correctly reacts on change", () => {
+  const onChange = jest.fn();
+  const value = "1";
+
+  render(usingUniformsContext(<NumField name="x" />, { x: { type: Number } }, { onChange }));
+
+  expect(screen.getByTestId("num-field")).toBeInTheDocument();
+  fireEvent.change(screen.getByTestId("num-field"), { target: { value } });
+
+  expect(onChange).toHaveBeenLastCalledWith("x", 1);
+});
+
+test("<NumField> - renders an input which correctly reacts on change (decimal on decimal)", () => {
+  const onChange = jest.fn();
+  const value = "2.5";
+
+  render(usingUniformsContext(<NumField name="x" decimal />, { x: { type: Number } }, { onChange }));
+
+  expect(screen.getByTestId("num-field")).toBeInTheDocument();
+  fireEvent.change(screen.getByTestId("num-field"), { target: { value } });
+
+  expect(onChange).toHaveBeenLastCalledWith("x", 2.5);
+});
+
+test("<NumField> - renders an input which correctly reacts on change (decimal on integer)", () => {
+  const onChange = jest.fn();
+  const value = "2.5";
+
+  render(usingUniformsContext(<NumField name="x" decimal={false} />, { x: { type: Number } }, { onChange }));
+
+  expect(screen.getByTestId("num-field")).toBeInTheDocument();
+  fireEvent.change(screen.getByTestId("num-field"), { target: { value } });
+
+  expect(onChange).toHaveBeenLastCalledWith("x", 2);
+});
+
+test("<NumField> - renders an input which correctly reacts on change (empty)", () => {
+  const onChange = jest.fn();
+  const value = "";
+
+  render(usingUniformsContext(<NumField name="x" />, { x: { type: Number } }, { onChange }));
+
+  expect(screen.getByTestId("num-field")).toBeInTheDocument();
+  fireEvent.change(screen.getByTestId("num-field"), { target: { value } });
+
+  expect(onChange).not.toHaveBeenCalled();
+});
+
+test("<NumField> - renders an input which correctly reacts on change (same value)", () => {
+  const onChange = jest.fn();
+  const value = "1";
+
+  render(usingUniformsContext(<NumField name="x" />, { x: { type: Number } }, { model: { x: 1 }, onChange }));
+
+  expect(screen.getByTestId("num-field")).toBeInTheDocument();
+  fireEvent.change(screen.getByTestId("num-field"), { target: { value } });
+
+  expect(onChange).not.toHaveBeenCalled();
+});
+
+test("<NumField> - renders an input which correctly reacts on change (zero)", () => {
+  const onChange = jest.fn();
+  const value = "0";
+
+  render(usingUniformsContext(<NumField name="x" />, { x: { type: Number } }, { onChange }));
+
+  expect(screen.getByTestId("num-field")).toBeInTheDocument();
+  fireEvent.change(screen.getByTestId("num-field"), { target: { value } });
+
+  expect(onChange).toHaveBeenLastCalledWith("x", 0);
+});
+
+test("<NumField> - renders a label", () => {
+  render(usingUniformsContext(<NumField required={false} name="x" label="y" />, { x: { type: Number } }));
+
+  expect(screen.getByTestId("wrapper-field")).toBeInTheDocument();
+  expect(screen.getByTestId("wrapper-field").getElementsByTagName("label")[0].textContent).toBe("y");
+  const id = screen.getByTestId("num-field").getAttribute("id");
+  expect(screen.getByTestId("wrapper-field").getElementsByTagName("label")[0].getAttribute("for")).toBe(id);
+});
+
+test("<NumField> - renders a label", () => {
+  render(usingUniformsContext(<NumField required={true} name="x" label="y" />, { x: { type: Number } }));
+
+  expect(screen.getByTestId("wrapper-field")).toBeInTheDocument();
+  expect(screen.getByTestId("wrapper-field").getElementsByTagName("label")[0].textContent).toBe("y *");
+  const id = screen.getByTestId("num-field").getAttribute("id");
+  expect(screen.getByTestId("wrapper-field").getElementsByTagName("label")[0].getAttribute("for")).toBe(id);
+});
diff --git a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts b/packages/uniforms-patternfly/src/__tests__/QuickForm.test.tsx
similarity index 56%
copy from packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts
copy to packages/uniforms-patternfly/src/__tests__/QuickForm.test.tsx
index 7f7980f259..db096667b1 100644
--- a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts
+++ b/packages/uniforms-patternfly/src/__tests__/QuickForm.test.tsx
@@ -1,5 +1,5 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,4 +14,12 @@
  * limitations under the License.
  */
 
-export const LATEST_VERSION_COMPATIBLE_WITH_LFS = "0.25.0";
+import * as React from "react";
+import { QuickForm } from "..";
+import { usingUniformsContext, createSimpleSchema } from "./test-utils";
+import { render, screen } from "@testing-library/react";
+
+test("<QuickForm> - works", () => {
+  render(usingUniformsContext(<QuickForm schema={createSimpleSchema()} />));
+  expect(screen.getByTestId("base-form")).toBeInTheDocument();
+});
diff --git a/packages/uniforms-patternfly/src/__tests__/RadioField.test.tsx b/packages/uniforms-patternfly/src/__tests__/RadioField.test.tsx
new file mode 100644
index 0000000000..b1f6f51aa7
--- /dev/null
+++ b/packages/uniforms-patternfly/src/__tests__/RadioField.test.tsx
@@ -0,0 +1,218 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { RadioField } from "..";
+import { render, screen, fireEvent } from "@testing-library/react";
+import { usingUniformsContext } from "./test-utils";
+
+test("<RadioField> - renders a set of checkboxes", () => {
+  render(usingUniformsContext(<RadioField name="x" allowedValues={[]} />, { x: { type: String, allowedValues: [] } }));
+
+  expect(screen.getByTestId("radio-field")).toBeInTheDocument();
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")).toHaveLength(0);
+});
+
+test("<RadioField> - renders a set of checkboxes", () => {
+  render(
+    usingUniformsContext(<RadioField name="x" allowedValues={["a", "b"]} />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("radio-field")).toBeInTheDocument();
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")).toHaveLength(2);
+});
+
+test("<RadioField> - renders a set of checkboxes with correct disabled state", () => {
+  render(
+    usingUniformsContext(<RadioField name="x" disabled allowedValues={["a", "b"]} />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("radio-field")).toBeInTheDocument();
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")).toHaveLength(2);
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")[0]).toBeDisabled();
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")[1]).toBeDisabled();
+});
+
+test("<RadioField> - renders a set of checkboxes with correct id (inherited)", () => {
+  render(
+    usingUniformsContext(<RadioField name="x" allowedValues={["a", "b"]} />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("radio-field")).toBeInTheDocument();
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")).toHaveLength(2);
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")[0].getAttribute("id")).toBeTruthy();
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")[1].getAttribute("id")).toBeTruthy();
+});
+
+test("<RadioField> - renders a set of checkboxes with correct id (specified)", () => {
+  render(
+    usingUniformsContext(<RadioField name="x" id="y" allowedValues={["a", "b"]} />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("radio-field")).toBeInTheDocument();
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")).toHaveLength(2);
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")[0].getAttribute("id")).toBe("y");
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")[1].getAttribute("id")).toBe("y");
+});
+
+test("<RadioField> - renders a set of checkboxes with correct name", () => {
+  render(
+    usingUniformsContext(<RadioField name="x" allowedValues={["a", "b"]} />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("radio-field")).toBeInTheDocument();
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")).toHaveLength(2);
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")[0].getAttribute("name")).toBe("x");
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")[1].getAttribute("name")).toBe("x");
+});
+
+test("<RadioField> - renders a set of checkboxes with correct options", () => {
+  render(
+    usingUniformsContext(<RadioField name="x" allowedValues={["a", "b"]} />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("wrapper-field")).toBeInTheDocument();
+  expect(screen.getByTestId("wrapper-field").getElementsByTagName("label")).toHaveLength(2);
+  expect(screen.getByTestId("radio-field").getElementsByTagName("label")[0].textContent).toBe("a");
+  expect(screen.getByTestId("radio-field").getElementsByTagName("label")[1].textContent).toBe("b");
+});
+
+test("<RadioField> - renders a set of checkboxes with correct options (transform)", () => {
+  render(
+    usingUniformsContext(
+      <RadioField name="x" transform={(x: string) => x.toUpperCase()} allowedValues={["a", "b"]} />,
+      { x: { type: String, allowedValues: ["a", "b"] } }
+    )
+  );
+
+  expect(screen.getByTestId("wrapper-field")).toBeInTheDocument();
+  expect(screen.getByTestId("wrapper-field").getElementsByTagName("label")).toHaveLength(2);
+  expect(screen.getByTestId("radio-field").getElementsByTagName("label")[0].textContent).toBe("A");
+  expect(screen.getByTestId("radio-field").getElementsByTagName("label")[1].textContent).toBe("B");
+});
+
+test("<RadioField> - renders a set of checkboxes with correct value (default)", () => {
+  render(
+    usingUniformsContext(<RadioField name="x" allowedValues={["a", "b"]} />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("radio-field")).toBeInTheDocument();
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")).toHaveLength(2);
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")[0]).not.toBeChecked();
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")[1]).not.toBeChecked();
+});
+
+test("<RadioField> - renders a set of checkboxes with correct value (model)", () => {
+  render(
+    usingUniformsContext(
+      <RadioField name="x" allowedValues={["a", "b"]} />,
+      { x: { type: String, allowedValues: ["a", "b"] } },
+      { model: { x: "b" } }
+    )
+  );
+
+  expect(screen.getByTestId("radio-field")).toBeInTheDocument();
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")).toHaveLength(2);
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")[0]).not.toBeChecked();
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")[1]).toBeChecked();
+});
+
+test("<RadioField> - renders a set of checkboxes with correct value (specified)", () => {
+  render(
+    usingUniformsContext(<RadioField name="x" value="b" allowedValues={["a", "b"]} />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("radio-field")).toBeInTheDocument();
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")).toHaveLength(2);
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")[0]).not.toBeChecked();
+  expect(screen.getByTestId("radio-field").getElementsByTagName("input")[1]).toBeChecked();
+});
+
+test("<RadioField> - renders a set of checkboxes which correctly reacts on change", () => {
+  const onChange = jest.fn();
+
+  render(
+    usingUniformsContext(
+      <RadioField name="x" allowedValues={["a", "b"]} />,
+      { x: { type: String, allowedValues: ["a", "b"] } },
+      { onChange }
+    )
+  );
+
+  expect(screen.getByTestId("radio-field")).toBeInTheDocument();
+  const inputs = screen.getByTestId("radio-field").getElementsByTagName("input");
+  expect(inputs).toHaveLength(2);
+  fireEvent.click(inputs[1]);
+  expect(onChange).toHaveBeenLastCalledWith("x", "b");
+});
+
+test("<RadioField> - renders a set of checkboxes which correctly reacts on change (same value)", () => {
+  const onChange = jest.fn();
+
+  render(
+    usingUniformsContext(
+      <RadioField name="x" allowedValues={["a", "b"]} />,
+      { x: { type: String, allowedValues: ["a", "b"] } },
+      { model: { x: "b" }, onChange }
+    )
+  );
+
+  expect(screen.getByTestId("radio-field")).toBeInTheDocument();
+  const inputs = screen.getByTestId("radio-field").getElementsByTagName("input");
+  expect(inputs).toHaveLength(2);
+  fireEvent.click(inputs[0]);
+  expect(onChange).toHaveBeenLastCalledWith("x", "a");
+});
+
+test("<RadioField> - renders a label", () => {
+  render(
+    usingUniformsContext(<RadioField required={false} name="x" label="y" allowedValues={["a", "b"]} />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("wrapper-field")).toBeInTheDocument();
+  expect(screen.getByTestId("wrapper-field").getElementsByTagName("label")).toHaveLength(3);
+  expect(screen.getByTestId("wrapper-field").getElementsByTagName("label")[0].textContent).toBe("y");
+});
+
+test("<RadioField> - renders a label (required)", () => {
+  render(
+    usingUniformsContext(<RadioField required={true} name="x" label="y" allowedValues={["a", "b"]} />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("wrapper-field")).toBeInTheDocument();
+  expect(screen.getByTestId("wrapper-field").getElementsByTagName("label")).toHaveLength(3);
+  expect(screen.getByTestId("wrapper-field").getElementsByTagName("label")[0].textContent).toBe("y *");
+});
diff --git a/packages/uniforms-patternfly/src/__tests__/SelectField.test.tsx b/packages/uniforms-patternfly/src/__tests__/SelectField.test.tsx
new file mode 100644
index 0000000000..74d2e4c6b3
--- /dev/null
+++ b/packages/uniforms-patternfly/src/__tests__/SelectField.test.tsx
@@ -0,0 +1,498 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { SelectField } from "..";
+import { render, screen, fireEvent } from "@testing-library/react";
+import { usingUniformsContext } from "./test-utils";
+
+test("<SelectField checkboxes> - renders a set of checkboxes", () => {
+  render(
+    usingUniformsContext(<SelectField onToggle={() => {}} name="x" checkboxes={true} />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("select-checkbox-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")).toHaveLength(2);
+});
+
+test("<SelectField checkboxes> - renders a set of checkboxes with correct disabled state", () => {
+  render(
+    usingUniformsContext(<SelectField onToggle={() => {}} name="x" disabled checkboxes={true} />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("select-checkbox-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")).toHaveLength(2);
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")[0]).toBeDisabled();
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")[1]).toBeDisabled();
+});
+
+test("<SelectField checkboxes> - renders a set of checkboxes with correct id (inherited)", () => {
+  render(
+    usingUniformsContext(<SelectField onToggle={() => {}} name="x" checkboxes={true} />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("select-checkbox-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")).toHaveLength(2);
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")[0].getAttribute("id")).toBeTruthy();
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")[1].getAttribute("id")).toBeTruthy();
+});
+
+test("<SelectField checkboxes> - renders a set of checkboxes with correct id (specified)", () => {
+  render(
+    usingUniformsContext(<SelectField onToggle={() => {}} name="x" id="y" checkboxes={true} />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("select-checkbox-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")).toHaveLength(2);
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")[0].getAttribute("id")).toBe("y-a");
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")[1].getAttribute("id")).toBe("y-b");
+});
+
+test("<SelectField checkboxes> - renders a set of checkboxes with correct name", () => {
+  render(
+    usingUniformsContext(<SelectField onToggle={() => {}} name="x" checkboxes={true} />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("select-checkbox-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")).toHaveLength(2);
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")[0].getAttribute("name")).toBe("x");
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")[1].getAttribute("name")).toBe("x");
+});
+
+test("<SelectField checkboxes> - renders a set of checkboxes with correct options", () => {
+  render(
+    usingUniformsContext(<SelectField onToggle={() => {}} name="x" checkboxes={true} />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("select-checkbox-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("label")).toHaveLength(2);
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("label")[0].textContent).toBe("a");
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("label")[1].textContent).toBe("b");
+});
+
+test("<SelectField checkboxes> - renders a set of checkboxes with correct options (transform)", () => {
+  render(
+    usingUniformsContext(
+      <SelectField onToggle={() => {}} name="x" transform={(x: string) => x.toUpperCase()} checkboxes={true} />,
+      { x: { type: String, allowedValues: ["a", "b"] } }
+    )
+  );
+
+  expect(screen.getByTestId("select-checkbox-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("label")).toHaveLength(2);
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("label")[0].textContent).toBe("A");
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("label")[1].textContent).toBe("B");
+});
+
+test("<SelectField checkboxes> - renders a set of checkboxes with correct value (default)", () => {
+  render(
+    usingUniformsContext(<SelectField onToggle={() => {}} name="x" checkboxes={true} />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("select-checkbox-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")).toHaveLength(2);
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")[0]).not.toBeChecked();
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")[1]).not.toBeChecked();
+});
+
+test("<SelectField checkboxes> - renders a set of checkboxes with correct value (model)", () => {
+  render(
+    usingUniformsContext(
+      <SelectField onToggle={() => {}} name="x" checkboxes={true} />,
+      { x: { type: String, allowedValues: ["a", "b"] } },
+      { model: { x: "b" } }
+    )
+  );
+
+  expect(screen.getByTestId("select-checkbox-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")).toHaveLength(2);
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")[0]).not.toBeChecked();
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")[1]).toBeChecked();
+});
+
+test("<SelectField checkboxes> - renders a set of checkboxes with correct value (specified)", () => {
+  render(
+    usingUniformsContext(<SelectField onToggle={() => {}} name="x" value="b" checkboxes={true} />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("select-checkbox-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")).toHaveLength(2);
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")[0]).not.toBeChecked();
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")[1]).toBeChecked();
+});
+
+test("<SelectField checkboxes> - renders a set of checkboxes which correctly reacts on change", () => {
+  const onChange = jest.fn();
+
+  render(
+    usingUniformsContext(
+      <SelectField onToggle={() => {}} name="x" checkboxes={true} />,
+      { x: { type: String, allowedValues: ["a", "b"] } },
+      { onChange }
+    )
+  );
+
+  expect(screen.getByTestId("select-checkbox-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")).toHaveLength(2);
+
+  fireEvent.click(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")[1]);
+  expect(onChange).toHaveBeenLastCalledWith("x", "b");
+});
+
+test("<SelectField checkboxes> - renders a set of checkboxes which correctly reacts on change (array check)", () => {
+  const onChange = jest.fn();
+
+  render(
+    usingUniformsContext(
+      <SelectField onToggle={() => {}} name="x" checkboxes={true} />,
+      {
+        x: { type: Array },
+        "x.$": { type: String, allowedValues: ["a", "b"] },
+      },
+      { onChange }
+    )
+  );
+
+  expect(screen.getByTestId("select-checkbox-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")).toHaveLength(2);
+
+  fireEvent.click(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")[1]);
+  expect(onChange).toHaveBeenLastCalledWith("x", ["b"]);
+});
+
+test("<SelectField checkboxes> - renders a set of checkboxes which correctly reacts on change (array uncheck)", () => {
+  const onChange = jest.fn();
+
+  render(
+    usingUniformsContext(
+      <SelectField onToggle={() => {}} name="x" value={["b"]} checkboxes={true} />,
+      {
+        x: { type: Array },
+        "x.$": { type: String, allowedValues: ["a", "b"] },
+      },
+      { onChange }
+    )
+  );
+
+  expect(screen.getByTestId("select-checkbox-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")).toHaveLength(2);
+
+  fireEvent.click(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")[1]);
+  expect(onChange).toHaveBeenLastCalledWith("x", []);
+});
+
+test("<SelectField checkboxes> - renders a set of checkboxes which correctly reacts on change (same value)", () => {
+  const onChange = jest.fn();
+
+  render(
+    usingUniformsContext(
+      <SelectField onToggle={() => {}} name="x" checkboxes={true} />,
+      { x: { type: String, allowedValues: ["a", "b"] } },
+      { model: { x: "b" }, onChange }
+    )
+  );
+  expect(screen.getByTestId("select-checkbox-field")).toBeInTheDocument();
+
+  expect(screen.getByTestId("select-checkbox-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")).toHaveLength(2);
+
+  fireEvent.click(screen.getByTestId("select-checkbox-field").getElementsByTagName("input")[0]);
+  expect(onChange).toHaveBeenLastCalledWith("x", "a");
+});
+
+test("<SelectField checkboxes> - renders a label", () => {
+  render(
+    usingUniformsContext(<SelectField onToggle={() => {}} name="x" label="y" checkboxes={true} />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("select-checkbox-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("label")).toHaveLength(3);
+  expect(screen.getByTestId("select-checkbox-field").getElementsByTagName("label")[1].textContent).toBe("a");
+});
+
+test("<SelectField> - renders a select", () => {
+  render(
+    usingUniformsContext(<SelectField onToggle={() => {}} name="x" />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("select-inputs-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")).toHaveLength(1);
+});
+
+test("<SelectField> - renders a select with correct disabled state", () => {
+  render(
+    usingUniformsContext(<SelectField onToggle={() => {}} name="x" disabled />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("select-inputs-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")).toHaveLength(1);
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")[0]).toBeDisabled();
+});
+
+test("<SelectField> - renders a select with correct id (specified)", () => {
+  render(
+    usingUniformsContext(<SelectField onToggle={() => {}} name="x" id="y" />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("select-inputs-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")).toHaveLength(1);
+  expect(screen.getByTestId("select-inputs-field").getAttribute("id")).toBe("y");
+});
+
+test("<SelectField> - renders a select with correct name", () => {
+  render(
+    usingUniformsContext(<SelectField onToggle={() => {}} name="x" />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("select-inputs-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")).toHaveLength(1);
+  // patternfly don't pass down the name property
+  // expect(screen.getByTestId("select-inputs-field").getAttribute("name")).toBe("x");
+});
+
+test("<SelectField> - renders a select with correct options", () => {
+  render(
+    usingUniformsContext(<SelectField onToggle={() => {}} name="x" />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("select-inputs-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")).toHaveLength(1);
+  fireEvent.click(screen.getByTestId("select-inputs-field").getElementsByTagName("button")[0]);
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")).toHaveLength(3);
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")[1].textContent).toBe("a");
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")[2].textContent).toBe("b");
+});
+
+test("<SelectField> - renders a select with correct options (transform)", () => {
+  render(
+    usingUniformsContext(<SelectField onToggle={() => {}} name="x" transform={(x: string) => x.toUpperCase()} />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("select-inputs-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")).toHaveLength(1);
+  fireEvent.click(screen.getByTestId("select-inputs-field").getElementsByTagName("button")[0]);
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")).toHaveLength(3);
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")[1].textContent).toBe("A");
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")[2].textContent).toBe("B");
+});
+
+test("<SelectField> - renders a select with correct options (numbers)", () => {
+  render(
+    usingUniformsContext(<SelectField onToggle={() => {}} name="x" />, { x: { type: String, allowedValues: [1, 2] } })
+  );
+
+  expect(screen.getByTestId("select-inputs-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")).toHaveLength(1);
+  fireEvent.click(screen.getByTestId("select-inputs-field").getElementsByTagName("button")[0]);
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")).toHaveLength(3);
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")[1].textContent).toBe("1");
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")[2].textContent).toBe("2");
+});
+
+test("<SelectField> - renders a select with correct placeholder (implicit)", () => {
+  render(
+    usingUniformsContext(<SelectField onToggle={() => {}} name="x" placeholder="y" />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("select-inputs-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")).toHaveLength(1);
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("span")[0].textContent).toBe("y");
+  expect(screen.getByTestId("select-inputs-field").getAttribute("value")).toBe(null);
+});
+
+test("<SelectField> - renders a select with correct value (default)", () => {
+  render(
+    usingUniformsContext(<SelectField onToggle={() => {}} name="x" />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("select-inputs-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")).toHaveLength(1);
+  expect(screen.getByTestId("select-inputs-field").getAttribute("value")).toBe(null);
+});
+
+test("<SelectField> - renders a select with correct value (model)", () => {
+  render(
+    usingUniformsContext(
+      <SelectField onToggle={() => {}} name="x" />,
+      { x: { type: String, allowedValues: ["a", "b"] } },
+      { model: { x: "b" } }
+    )
+  );
+
+  expect(screen.getByTestId("select-inputs-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")).toHaveLength(1);
+  expect(screen.getByTestId("select-inputs-field").textContent).toBe("b");
+});
+
+test("<SelectField> - renders a select with correct value (specified)", () => {
+  render(
+    usingUniformsContext(<SelectField onToggle={() => {}} name="x" value="b" />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("select-inputs-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")).toHaveLength(1);
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("span")[0].textContent).toBe("b");
+});
+
+test("<SelectField> - renders a select which correctly reacts on change", () => {
+  const onChange = jest.fn();
+  render(
+    usingUniformsContext(
+      <SelectField onToggle={() => {}} name="x" />,
+      { x: { type: String, allowedValues: ["a", "b"] } },
+      { onChange }
+    )
+  );
+
+  expect(screen.getByTestId("select-inputs-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")).toHaveLength(1);
+  fireEvent.click(screen.getByTestId("select-inputs-field").getElementsByTagName("button")[0]);
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")).toHaveLength(3);
+  fireEvent.click(screen.getByTestId("select-inputs-field").getElementsByTagName("button")[2]);
+  expect(onChange).toHaveBeenLastCalledWith("x", "b");
+});
+
+test("<SelectField> - renders a select which correctly reacts on change (array)", () => {
+  const onChange = jest.fn();
+
+  render(
+    usingUniformsContext(
+      <SelectField onToggle={() => {}} name="x" value={undefined} />,
+      {
+        x: { type: Array },
+        "x.$": { type: String, allowedValues: ["a", "b"] },
+      },
+      { onChange }
+    )
+  );
+
+  expect(screen.getByTestId("select-inputs-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")).toHaveLength(1);
+  fireEvent.click(screen.getByTestId("select-inputs-field").getElementsByTagName("button")[0]);
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")).toHaveLength(3);
+  fireEvent.click(screen.getByTestId("select-inputs-field").getElementsByTagName("button")[2]);
+  expect(onChange).toHaveBeenLastCalledWith("x", ["b"]);
+});
+
+test("<SelectField> - renders a select which correctly reacts on change (placeholder)", () => {
+  const onChange = jest.fn();
+
+  render(
+    usingUniformsContext(
+      <SelectField onToggle={() => {}} name="x" placeholder={"test"} />,
+      { x: { type: String, allowedValues: ["a", "b"] } },
+      { onChange }
+    )
+  );
+
+  expect(screen.getByTestId("select-inputs-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")).toHaveLength(1);
+  fireEvent.click(screen.getByTestId("select-inputs-field").getElementsByTagName("button")[0]);
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")).toHaveLength(4);
+  fireEvent.click(screen.getByTestId("select-inputs-field").getElementsByTagName("button")[1]);
+  expect(onChange).toHaveBeenCalled();
+});
+
+test("<SelectField> - renders a select which correctly reacts on change (same value)", () => {
+  const onChange = jest.fn();
+
+  render(
+    usingUniformsContext(
+      <SelectField onToggle={() => {}} name="x" />,
+      { x: { type: String, allowedValues: ["a", "b"] } },
+      { model: { x: "b" }, onChange }
+    )
+  );
+
+  expect(screen.getByTestId("select-inputs-field")).toBeInTheDocument();
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")).toHaveLength(1);
+  fireEvent.click(screen.getByTestId("select-inputs-field").getElementsByTagName("button")[0]);
+  expect(screen.getByTestId("select-inputs-field").getElementsByTagName("button")).toHaveLength(3);
+  fireEvent.click(screen.getByTestId("select-inputs-field").getElementsByTagName("button")[2]);
+  expect(onChange).toHaveBeenLastCalledWith("x", "b");
+});
+
+test("<SelectField> - renders a label", () => {
+  render(
+    usingUniformsContext(<SelectField onToggle={() => {}} required={false} name="x" label="y" />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("wrapper-field")).toBeInTheDocument();
+  expect(screen.getByTestId("wrapper-field").getElementsByTagName("label")).toHaveLength(1);
+  expect(screen.getByTestId("wrapper-field").getElementsByTagName("label")[0].textContent).toBe("y");
+});
+
+test("<SelectField> - renders a label", () => {
+  render(
+    usingUniformsContext(<SelectField onToggle={() => {}} required={true} name="x" label="y" />, {
+      x: { type: String, allowedValues: ["a", "b"] },
+    })
+  );
+
+  expect(screen.getByTestId("wrapper-field")).toBeInTheDocument();
+  expect(screen.getByTestId("wrapper-field").getElementsByTagName("label")).toHaveLength(1);
+  expect(screen.getByTestId("wrapper-field").getElementsByTagName("label")[0].textContent).toBe("y *");
+});
+
+test("<SelectField> - renders a number label", () => {
+  render(
+    usingUniformsContext(<SelectField onToggle={() => {}} required={true} name="x" label={1} />, {
+      x: { type: Number, allowedValues: [1, 2] },
+    })
+  );
+
+  expect(screen.getByTestId("wrapper-field")).toBeInTheDocument();
+  expect(screen.getByTestId("wrapper-field").getElementsByTagName("label")).toHaveLength(1);
+  expect(screen.getByTestId("wrapper-field").getElementsByTagName("label")[0].textContent).toBe("1 *");
+});
diff --git a/packages/uniforms-patternfly/src/__tests__/SubmitField.test.tsx b/packages/uniforms-patternfly/src/__tests__/SubmitField.test.tsx
new file mode 100644
index 0000000000..3bb1c07a54
--- /dev/null
+++ b/packages/uniforms-patternfly/src/__tests__/SubmitField.test.tsx
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { SubmitField } from "..";
+import { render, screen } from "@testing-library/react";
+import { usingUniformsContext } from "./test-utils";
+
+test("<SubmitField> - renders", () => {
+  render(usingUniformsContext(<SubmitField />));
+
+  expect(screen.getByTestId("submit-field")).toBeInTheDocument();
+});
+
+test("<SubmitField> - renders disabled if error", () => {
+  render(usingUniformsContext(<SubmitField />, undefined, { error: {} }));
+
+  expect(screen.getByTestId("submit-field")).toBeInTheDocument();
+  expect(screen.getByTestId("submit-field")).toBeDisabled();
+});
+
+test("<SubmitField> - renders enabled if error and enabled", () => {
+  render(usingUniformsContext(<SubmitField disabled={false} />, undefined, { error: {} }));
+
+  expect(screen.getByTestId("submit-field")).toBeInTheDocument();
+  expect(screen.getByTestId("submit-field")).toBeEnabled();
+});
diff --git a/packages/uniforms-patternfly/src/__tests__/TextField.test.tsx b/packages/uniforms-patternfly/src/__tests__/TextField.test.tsx
new file mode 100644
index 0000000000..4f2e0d4682
--- /dev/null
+++ b/packages/uniforms-patternfly/src/__tests__/TextField.test.tsx
@@ -0,0 +1,357 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { TextField } from "../";
+import { render, screen, fireEvent } from "@testing-library/react";
+import { usingUniformsContext } from "./test-utils";
+
+test("<TextField> - renders an input", () => {
+  render(usingUniformsContext(<TextField name="x" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("text-field")).toBeInTheDocument();
+});
+
+test("<TextField> - renders an input with correct disabled state", () => {
+  render(usingUniformsContext(<TextField name="x" disabled />, { x: { type: String } }));
+
+  expect(screen.getByTestId("text-field")).toBeInTheDocument();
+  expect(screen.getByTestId("text-field")).toBeDisabled();
+});
+
+test("<TextField> - renders an input with correct id (inherited)", () => {
+  render(usingUniformsContext(<TextField name="x" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("text-field")).toBeInTheDocument();
+  expect(screen.getByTestId("text-field").getAttribute("id")).toBeTruthy();
+});
+
+test("<TextField> - renders an input with correct id (specified)", () => {
+  render(usingUniformsContext(<TextField name="x" id="y" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("text-field")).toBeInTheDocument();
+  expect(screen.getByTestId("text-field").getAttribute("id")).toBe("y");
+});
+
+test("<TextField> - renders an input with correct name", () => {
+  render(usingUniformsContext(<TextField name="x" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("text-field")).toBeInTheDocument();
+  expect(screen.getByTestId("text-field").getAttribute("name")).toBe("x");
+});
+
+test("<TextField> - renders an input with correct placeholder", () => {
+  render(usingUniformsContext(<TextField name="x" placeholder="y" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("text-field")).toBeInTheDocument();
+  expect(screen.getByTestId("text-field").getAttribute("placeholder")).toBe("y");
+});
+
+test("<TextField> - renders an input with correct type", () => {
+  render(usingUniformsContext(<TextField name="x" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("text-field")).toBeInTheDocument();
+  expect(screen.getByTestId("text-field").getAttribute("type")).toBe("text");
+});
+
+test("<TextField> - renders an input with correct value (default)", () => {
+  render(usingUniformsContext(<TextField name="x" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("text-field")).toBeInTheDocument();
+  expect(screen.getByTestId("text-field").getAttribute("value")).toBe("");
+});
+
+test("<TextField> - renders an input with correct value (model)", () => {
+  render(usingUniformsContext(<TextField name="x" />, { x: { type: String } }, { model: { x: "y" } }));
+
+  expect(screen.getByTestId("text-field")).toBeInTheDocument();
+  expect(screen.getByTestId("text-field").getAttribute("value")).toBe("y");
+});
+
+test("<TextField> - renders an input with correct value (specified)", () => {
+  render(usingUniformsContext(<TextField name="x" value="y" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("text-field")).toBeInTheDocument();
+  expect(screen.getByTestId("text-field").getAttribute("value")).toBe("y");
+});
+
+test("<TextField> - renders an input which correctly reacts on change", () => {
+  const onChange = jest.fn();
+
+  render(usingUniformsContext(<TextField name="x" />, { x: { type: String } }, { onChange }));
+
+  expect(screen.getByTestId("text-field")).toBeInTheDocument();
+  fireEvent.change(screen.getByTestId("text-field"), { target: { value: "y" } });
+  expect(onChange).toHaveBeenLastCalledWith("x", "y");
+});
+
+test("<TextField> - renders an input which correctly reacts on change (empty)", () => {
+  const onChange = jest.fn();
+
+  render(usingUniformsContext(<TextField name="x" />, { x: { type: String } }, { onChange }));
+
+  expect(screen.getByTestId("text-field")).toBeInTheDocument();
+  fireEvent.change(screen.getByTestId("text-field"), { target: { value: "" } });
+  expect(onChange).not.toHaveBeenCalled();
+});
+
+test("<TextField> - renders an input which correctly reacts on change (same value)", () => {
+  const onChange = jest.fn();
+
+  render(usingUniformsContext(<TextField name="x" />, { x: { type: String } }, { model: { x: "y" }, onChange }));
+
+  expect(screen.getByTestId("text-field")).toBeInTheDocument();
+  fireEvent.change(screen.getByTestId("text-field"), { target: { value: "y" } });
+  expect(onChange).not.toHaveBeenCalled();
+});
+
+test("<TextField> - renders a label", () => {
+  render(usingUniformsContext(<TextField required={false} name="x" label="y" />, { x: { type: String } }));
+
+  expect(screen.getByText("y")).toBeInTheDocument();
+});
+
+test("<TextField> - renders a label", () => {
+  render(usingUniformsContext(<TextField required={true} name="x" label="y" />, { x: { type: String } }));
+
+  expect(screen.getByText("y")).toBeInTheDocument();
+  expect(screen.getByText("*")).toBeInTheDocument();
+});
+
+test("<TextField> - renders a help", () => {
+  render(usingUniformsContext(<TextField required={false} name="x" helperText="y" />, { x: { type: String } }));
+
+  expect(screen.getByTestId("wrapper-field").querySelector(".pf-c-form__helper-text")).toBeInTheDocument();
+  expect(screen.getByTestId("wrapper-field").querySelector(".pf-c-form__helper-text")?.textContent).toBe("y");
+});
+
+test("<TextField> - renders a initial value on date field (DatePicker)", () => {
+  const date = "2000-04-04";
+  render(
+    usingUniformsContext(
+      <TextField required={true} name="x" label="y" type={"date"} />,
+      { x: { type: String } },
+      { model: { x: date } }
+    )
+  );
+
+  expect(screen.getByTestId("text-field-date-picker")).toBeInTheDocument();
+  expect(screen.getByTestId("text-field-date-picker").getElementsByTagName("input")[0].value).toBe(date);
+});
+
+test("<TextField> - renders a disabled date field (DatePicker)", () => {
+  render(
+    usingUniformsContext(<TextField required={true} name="x" label="y" type={"date"} disabled={true} />, {
+      x: { type: String },
+    })
+  );
+
+  expect(screen.getByTestId("text-field-date-picker")).toBeInTheDocument();
+  expect(screen.getByTestId("text-field-date-picker").getElementsByTagName("input")[0]).toBeDisabled();
+});
+
+test("<TextField> - renders a input which correctly reacts on change (DatePicker)", () => {
+  const onChange = jest.fn();
+  const date = "2000-04-04";
+
+  render(
+    usingUniformsContext(
+      <TextField required={true} name="x" label="y" type={"date"} />,
+      { x: { type: String } },
+      { onChange }
+    )
+  );
+
+  const input = screen.getByTestId("text-field-date-picker").getElementsByTagName("input")[0];
+  fireEvent.change(input, { target: { value: date } });
+
+  expect(screen.getByTestId("text-field-date-picker")).toBeInTheDocument();
+  expect(screen.getByTestId("wrapper-field").getElementsByTagName("label")[0].textContent).toBe("y *");
+  expect(onChange).toHaveBeenLastCalledWith("x", date);
+});
+
+test("<TextField> - renders a input which correctly reacts on change (DatePicker - empty)", () => {
+  const onChange = jest.fn();
+  const date = "";
+
+  render(
+    usingUniformsContext(
+      <TextField required={true} name="x" label="y" type={"date"} />,
+      { x: { type: String } },
+      { onChange }
+    )
+  );
+
+  const input = screen.getByTestId("text-field-date-picker").getElementsByTagName("input")[0];
+  fireEvent.change(input, { target: { value: date } });
+
+  expect(screen.getByTestId("text-field-date-picker")).toBeInTheDocument();
+  expect(screen.getByTestId("wrapper-field").getElementsByTagName("label")[0].textContent).toBe("y *");
+  expect(onChange).not.toHaveBeenCalled();
+});
+
+test("<TextField> - renders a initial value on time field (TimePicker)", () => {
+  const time = "10:00";
+  render(
+    usingUniformsContext(
+      <TextField required={true} name="x" label="y" type={"time"} />,
+      { x: { type: String } },
+      { model: { x: time } }
+    )
+  );
+
+  expect(screen.getByTestId("text-field-time-picker")).toBeInTheDocument();
+  expect(screen.getByTestId("text-field-time-picker").getAttribute("value")).toBe(time);
+});
+
+test("<TextField> - renders a disabled date field (TimePicker)", () => {
+  render(
+    usingUniformsContext(<TextField required={true} name="x" label="y" type={"time"} disabled={true} />, {
+      x: { type: String },
+    })
+  );
+
+  expect(screen.getByTestId("text-field-time-picker")).toBeInTheDocument();
+  expect(screen.getByTestId("text-field-time-picker").getElementsByTagName("input")[0]).toBeDisabled();
+});
+
+test("<TextField> - renders a input which correctly reacts on change (TimePicker)", () => {
+  const onChange = jest.fn();
+  const time = "10:10";
+
+  render(
+    usingUniformsContext(
+      <TextField required={true} name="x" label="y" type={"time"} />,
+      { x: { type: String } },
+      { onChange }
+    )
+  );
+
+  const input = screen.getByTestId("text-field-time-picker").getElementsByTagName("input")[0];
+  fireEvent.change(input, { target: { value: time } });
+
+  expect(screen.getByTestId("text-field-time-picker")).toBeInTheDocument();
+  expect(screen.getByTestId("wrapper-field").getElementsByTagName("label")[0].textContent).toBe("y *");
+  expect(onChange).toHaveBeenLastCalledWith("x", "10:10:00");
+});
+
+test("<TextField> - renders a input which correctly reacts on change (TimePicker - empty)", () => {
+  const onChange = jest.fn();
+  const time = "";
+
+  render(
+    usingUniformsContext(
+      <TextField required={true} name="x" label="y" type={"time"} />,
+      { x: { type: String } },
+      { onChange }
+    )
+  );
+
+  const input = screen.getByTestId("text-field-time-picker").getElementsByTagName("input")[0];
+  fireEvent.change(input, { target: { value: time } });
+
+  expect(screen.getByTestId("text-field-time-picker")).toBeInTheDocument();
+  expect(screen.getByTestId("wrapper-field").getElementsByTagName("label")[0].textContent).toBe("y *");
+  expect(onChange).not.toHaveBeenCalled();
+});
+
+test("<TextField> - test max property (TimePicker - valid)", () => {
+  const time = "10:00";
+  const max = "12:00";
+  render(
+    usingUniformsContext(<TextField name="x" label="y" max={max} type={"time"} value={time} />, { x: { type: String } })
+  );
+
+  expect(screen.getByTestId("text-field-time-picker")).toBeInTheDocument();
+  expect(screen.queryByText("Should be before")).not.toBeInTheDocument();
+});
+
+test("<TextField> - test max property (TimePicker - invalid)", () => {
+  const time = "13:00";
+  const max = "12:00";
+  render(
+    usingUniformsContext(<TextField name="x" label="y" max={max} type={"time"} value={time} />, { x: { type: String } })
+  );
+
+  expect(screen.getByTestId("text-field-time-picker")).toBeInTheDocument();
+  expect(screen.queryByText("Should be before 12:00")).toBeInTheDocument();
+});
+
+test("<TextField> - test min property (TimePicker - valid)", () => {
+  const time = "13:00";
+  const min = "12:00";
+  render(
+    usingUniformsContext(<TextField name="x" label="y" min={min} type={"time"} value={time} />, { x: { type: String } })
+  );
+
+  expect(screen.getByTestId("text-field-time-picker")).toBeInTheDocument();
+  expect(screen.queryByText("Should be after")).not.toBeInTheDocument();
+});
+
+test("<TextField> - test min property (TimePicker - invalid)", () => {
+  const time = "10:00";
+  const min = "12:00";
+  render(
+    usingUniformsContext(<TextField name="x" label="y" min={min} type={"time"} value={time} />, { x: { type: String } })
+  );
+
+  expect(screen.getByTestId("text-field-time-picker")).toBeInTheDocument();
+  expect(screen.queryByText("Should be after 12:00")).toBeInTheDocument();
+});
+
+test("<TextField> - test max property (DatePicker - valid)", () => {
+  const date = "2000-01-01";
+  const max = "2000-01-02";
+  render(
+    usingUniformsContext(<TextField name="x" label="y" max={max} type={"date"} value={date} />, { x: { type: String } })
+  );
+
+  expect(screen.getByTestId("text-field-date-picker")).toBeInTheDocument();
+  expect(screen.queryByText("Should be before")).not.toBeInTheDocument();
+});
+
+test("<TextField> - test max property (DatePicker - invalid)", () => {
+  const date = "2000-01-02";
+  const max = "2000-01-01";
+  render(
+    usingUniformsContext(<TextField name="x" label="y" max={max} type={"date"} value={date} />, { x: { type: String } })
+  );
+
+  expect(screen.getByTestId("text-field-date-picker")).toBeInTheDocument();
+  expect(screen.queryByText("Should be before 2000-01-01")).toBeInTheDocument();
+});
+
+test("<TextField> - test min property (DatePicker - valid)", () => {
+  const date = "2000-01-02";
+  const min = "2000-01-01";
+  render(
+    usingUniformsContext(<TextField name="x" label="y" min={min} type={"date"} value={date} />, { x: { type: String } })
+  );
+
+  expect(screen.getByTestId("text-field-date-picker")).toBeInTheDocument();
+  expect(screen.queryByText("Should be after")).not.toBeInTheDocument();
+});
+
+test("<TextField> - test min property (DatePicker - invalid)", () => {
+  const date = "2000-01-01";
+  const min = "2000-01-02";
+  render(
+    usingUniformsContext(<TextField name="x" label="y" min={min} type={"date"} value={date} />, { x: { type: String } })
+  );
+
+  expect(screen.getByTestId("text-field-date-picker")).toBeInTheDocument();
+  expect(screen.queryByText("Should be after 2000-01-02")).toBeInTheDocument();
+});
diff --git a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts b/packages/uniforms-patternfly/src/__tests__/ValidateQuickForm.test.tsx
similarity index 55%
copy from packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts
copy to packages/uniforms-patternfly/src/__tests__/ValidateQuickForm.test.tsx
index 7f7980f259..f412b22d69 100644
--- a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts
+++ b/packages/uniforms-patternfly/src/__tests__/ValidateQuickForm.test.tsx
@@ -1,5 +1,5 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,4 +14,12 @@
  * limitations under the License.
  */
 
-export const LATEST_VERSION_COMPATIBLE_WITH_LFS = "0.25.0";
+import * as React from "react";
+import { ValidatedQuickForm } from "..";
+import { render, screen } from "@testing-library/react";
+import { createSimpleSchema, usingUniformsContext } from "./test-utils";
+
+test("<ValidatedQuickForm> - works", () => {
+  render(usingUniformsContext(<ValidatedQuickForm schema={createSimpleSchema()} />));
+  expect(screen.getByTestId("base-form")).toBeInTheDocument();
+});
diff --git a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts b/packages/uniforms-patternfly/src/__tests__/ValidatedForm.test.tsx
similarity index 56%
rename from packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts
rename to packages/uniforms-patternfly/src/__tests__/ValidatedForm.test.tsx
index 7f7980f259..41d09b69e3 100644
--- a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/LatestCompatibleVersion.ts
+++ b/packages/uniforms-patternfly/src/__tests__/ValidatedForm.test.tsx
@@ -1,5 +1,5 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,4 +14,12 @@
  * limitations under the License.
  */
 
-export const LATEST_VERSION_COMPATIBLE_WITH_LFS = "0.25.0";
+import * as React from "react";
+import { ValidatedForm } from "..";
+import { createSimpleSchema, usingUniformsContext } from "./test-utils";
+import { render, screen } from "@testing-library/react";
+
+test("<ValidatedForm> - works", () => {
+  render(usingUniformsContext(<ValidatedForm schema={createSimpleSchema()} />));
+  expect(screen.getByTestId("base-form")).toBeInTheDocument();
+});
diff --git a/packages/uniforms-patternfly/src/__tests__/index.test.ts b/packages/uniforms-patternfly/src/__tests__/index.test.ts
new file mode 100644
index 0000000000..a893f84235
--- /dev/null
+++ b/packages/uniforms-patternfly/src/__tests__/index.test.ts
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as unstyled from "..";
+
+it("exports everything", () => {
+  expect(unstyled).toEqual({
+    AutoFields: expect.any(Function),
+    AutoField: expect.any(Function),
+    AutoForm: expect.any(Function),
+    BaseForm: expect.any(Function),
+    BoolField: expect.any(Function),
+    DateField: expect.any(Function),
+    ErrorField: expect.any(Function),
+    ErrorsField: expect.any(Function),
+    HiddenField: expect.any(Function),
+    ListAddField: expect.any(Function),
+    ListDelField: expect.any(Function),
+    ListField: expect.any(Function),
+    ListItemField: expect.any(Function),
+    LongTextField: expect.any(Function),
+    NestField: expect.any(Function),
+    NumField: expect.any(Function),
+    QuickForm: expect.any(Function),
+    RadioField: expect.any(Function),
+    SelectField: expect.any(Function),
+    SubmitField: expect.any(Function),
+    TextField: expect.any(Function),
+    ValidatedForm: expect.any(Function),
+    ValidatedQuickForm: expect.any(Function),
+  });
+});
diff --git a/packages/online-editor/src/workspace/startupBlockers/LatestCompatibleVersion.ts b/packages/uniforms-patternfly/src/__tests__/jest.setup.ts
similarity index 75%
rename from packages/online-editor/src/workspace/startupBlockers/LatestCompatibleVersion.ts
rename to packages/uniforms-patternfly/src/__tests__/jest.setup.ts
index 38ca944907..b8ba348a89 100644
--- a/packages/online-editor/src/workspace/startupBlockers/LatestCompatibleVersion.ts
+++ b/packages/uniforms-patternfly/src/__tests__/jest.setup.ts
@@ -1,11 +1,11 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *       http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,4 +14,4 @@
  * limitations under the License.
  */
 
-export const LATEST_VERSION_COMPATIBLE_WITH_LFS = "0.23.0";
+import "@testing-library/jest-dom";
diff --git a/packages/uniforms-patternfly/src/__tests__/test-utils.tsx b/packages/uniforms-patternfly/src/__tests__/test-utils.tsx
new file mode 100644
index 0000000000..a3848ffe86
--- /dev/null
+++ b/packages/uniforms-patternfly/src/__tests__/test-utils.tsx
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { Context, BaseForm, context, randomIds } from "uniforms";
+import SimpleSchema from "simpl-schema";
+import { SimpleSchema2Bridge } from "uniforms-bridge-simple-schema-2";
+
+const randomId = randomIds();
+
+export function createSimpleSchema(schema = {}) {
+  return new SimpleSchema2Bridge(new SimpleSchema(schema));
+}
+
+export function usingUniformsContext(children: React.ReactElement, schema = {}, ctx?: Partial<Context<any>>) {
+  const partialCtx = {
+    changed: false,
+    changedMap: {},
+    error: null,
+    model: {},
+    name: [],
+    onChange: () => {},
+    onSubmit: () => {},
+    randomId,
+    submitting: false,
+    validating: false,
+    submitted: false,
+    schema: createSimpleSchema(schema),
+    formRef: new BaseForm<any>({
+      autosave: false,
+      autosaveDelay: 0,
+      error: false,
+      label: true,
+      model: {},
+      noValidate: false,
+      onSubmit: (event) => {},
+      schema: createSimpleSchema(schema),
+    }),
+    ...ctx,
+    state: {
+      disabled: false,
+      label: false,
+      placeholder: false,
+      showInlineError: false,
+      readOnly: false,
+    },
+  };
+  return <context.Provider value={partialCtx}>{children}</context.Provider>;
+}
diff --git a/packages/uniforms-patternfly/src/index.ts b/packages/uniforms-patternfly/src/index.ts
new file mode 100644
index 0000000000..0300e9e461
--- /dev/null
+++ b/packages/uniforms-patternfly/src/index.ts
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export { default as AutoFields } from "./AutoFields";
+export { default as AutoField } from "./AutoField";
+export { default as AutoForm } from "./AutoForm";
+export { default as BaseForm } from "./BaseForm";
+export { default as BoolField } from "./BoolField";
+export { default as DateField } from "./DateField";
+export { default as ErrorField } from "./ErrorField";
+export { default as ErrorsField } from "./ErrorsField";
+export { default as HiddenField } from "./HiddenField";
+export { default as ListAddField } from "./ListAddField";
+export { default as ListDelField } from "./ListDelField";
+export { default as ListField } from "./ListField";
+export { default as ListItemField } from "./ListItemField";
+export { default as LongTextField } from "./LongTextField";
+export { default as NestField } from "./NestField";
+export { default as NumField } from "./NumField";
+export { default as QuickForm } from "./QuickForm";
+export { default as RadioField } from "./RadioField";
+export { default as SelectField } from "./SelectField";
+export { default as SubmitField } from "./SubmitField";
+export { default as TextField } from "./TextField";
+export { default as ValidatedForm } from "./ValidatedForm";
+export { default as ValidatedQuickForm } from "./ValidatedQuickForm";
diff --git a/packages/uniforms-patternfly/src/wrapField.tsx b/packages/uniforms-patternfly/src/wrapField.tsx
new file mode 100644
index 0000000000..f0204b6a2c
--- /dev/null
+++ b/packages/uniforms-patternfly/src/wrapField.tsx
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { FormGroup, FormGroupProps } from "@patternfly/react-core/dist/js/components/Form";
+import { filterDOMProps } from "uniforms";
+
+declare module "uniforms" {
+  interface FilterDOMProps {
+    decimal: never;
+    minCount: never;
+    autoValue: never;
+    isDisabled: never;
+    checkboxes: never;
+    exclusiveMaximum: never;
+    exclusiveMinimum: never;
+    menuAppendTo: never;
+  }
+}
+
+filterDOMProps.register(
+  "decimal",
+  "minCount",
+  "autoValue",
+  "isDisabled",
+  "exclusiveMaximum",
+  "exclusiveMinimum",
+  "menuAppendTo"
+);
+
+type WrapperProps = {
+  id: string;
+  error?: boolean;
+  errorMessage?: string;
+  help?: string;
+  showInlineError?: boolean;
+} & Omit<FormGroupProps, "onChange" | "fieldId">;
+
+export default function wrapField(
+  { id, label, type, disabled, error, errorMessage, showInlineError, help, required, ...props }: WrapperProps,
+  children: React.ReactNode
+) {
+  return (
+    <FormGroup
+      data-testid={"wrapper-field"}
+      fieldId={id}
+      label={label}
+      isRequired={required}
+      validated={error ? "error" : "default"}
+      type={type}
+      helperText={help}
+      helperTextInvalid={errorMessage}
+      {...filterDOMProps(props)}
+    >
+      {children}
+    </FormGroup>
+  );
+}
diff --git a/packages/uniforms-patternfly/tsconfig.cjs.json b/packages/uniforms-patternfly/tsconfig.cjs.json
new file mode 100644
index 0000000000..5197e7369d
--- /dev/null
+++ b/packages/uniforms-patternfly/tsconfig.cjs.json
@@ -0,0 +1,13 @@
+{
+  "extends": "@kie-tools/tsconfig/tsconfig.json",
+  "compilerOptions": {
+    "baseUrl": "src",
+    "outDir": "dist/cjs",
+    "rootDir": "src",
+    "module": "commonjs",
+    "target": "es6",
+    "esModuleInterop": true,
+    "moduleResolution": "node"
+  },
+  "include": ["src"]
+}
diff --git a/packages/uniforms-patternfly/tsconfig.esm.json b/packages/uniforms-patternfly/tsconfig.esm.json
new file mode 100644
index 0000000000..ebfe721109
--- /dev/null
+++ b/packages/uniforms-patternfly/tsconfig.esm.json
@@ -0,0 +1,13 @@
+{
+  "extends": "@kie-tools/tsconfig/tsconfig.json",
+  "compilerOptions": {
+    "baseUrl": "src",
+    "outDir": "dist/esm",
+    "rootDir": "src",
+    "module": "es6",
+    "target": "es6",
+    "esModuleInterop": true,
+    "moduleResolution": "node"
+  },
+  "include": ["src"]
+}
diff --git a/packages/unitables-dmn/package.json b/packages/unitables-dmn/package.json
index ce07fabd6a..57800c96da 100644
--- a/packages/unitables-dmn/package.json
+++ b/packages/unitables-dmn/package.json
@@ -44,9 +44,8 @@
     "react-dom": "^17.0.2",
     "react-id-generator": "^3.0.1",
     "react-table": "^7.6.2",
-    "uniforms": "^3.5.5",
-    "uniforms-bridge-json-schema": "^3.5.5",
-    "uniforms-patternfly": "^4.7.9"
+    "uniforms": "^3.10.2",
+    "uniforms-bridge-json-schema": "^3.10.2"
   },
   "devDependencies": {
     "@babel/core": "^7.16.0",
diff --git a/packages/unitables/package.json b/packages/unitables/package.json
index f3b3bab2e6..7e0dfee795 100644
--- a/packages/unitables/package.json
+++ b/packages/unitables/package.json
@@ -31,6 +31,7 @@
     "@kie-tools/boxed-expression-component": "workspace:*",
     "@kie-tools/form": "workspace:*",
     "@kie-tools/i18n-common-dictionary": "workspace:*",
+    "@kie-tools/uniforms-patternfly": "workspace:*",
     "@patternfly/react-core": "^4.157.3",
     "@patternfly/react-icons": "^4.11.17",
     "@types/lodash": "^4.14.168",
@@ -43,9 +44,8 @@
     "react-dom": "^17.0.2",
     "react-id-generator": "^3.0.1",
     "react-table": "^7.6.2",
-    "uniforms": "^3.5.5",
-    "uniforms-bridge-json-schema": "^3.5.5",
-    "uniforms-patternfly": "^4.7.9"
+    "uniforms": "^3.10.2",
+    "uniforms-bridge-json-schema": "^3.10.2"
   },
   "devDependencies": {
     "@babel/core": "^7.16.0",
diff --git a/packages/unitables/src/uniforms/AutoField.tsx b/packages/unitables/src/uniforms/AutoField.tsx
index 2fed18b7e6..f52a468f1e 100644
--- a/packages/unitables/src/uniforms/AutoField.tsx
+++ b/packages/unitables/src/uniforms/AutoField.tsx
@@ -23,7 +23,7 @@ import {
   RadioField,
   SelectField,
   TextField,
-} from "uniforms-patternfly";
+} from "@kie-tools/uniforms-patternfly/dist/esm";
 import { createAutoField } from "uniforms";
 
 export const AutoField = createAutoField((props) => {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index c5cf573b2d..960d5da083 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -28,8 +28,8 @@ importers:
         specifier: ^0.6.1
         version: 0.6.1(prettier@2.3.0)
       "@types/node":
-        specifier: ^15.0.2
-        version: 15.6.0
+        specifier: ^18.13.0
+        version: 18.13.0
       filemanager-webpack-plugin:
         specifier: ^7.0.0
         version: 7.0.0
@@ -450,6 +450,94 @@ importers:
         specifier: ^5.8.0
         version: 5.8.0
 
+  examples/uniforms-patternfly:
+    dependencies:
+      "@kie-tools-core/patternfly-base":
+        specifier: workspace:*
+        version: link:../../packages/patternfly-base
+      "@kie-tools/uniforms-patternfly":
+        specifier: workspace:*
+        version: link:../../packages/uniforms-patternfly
+      "@patternfly/react-core":
+        specifier: ^4.157.3
+        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
+      "@patternfly/react-icons":
+        specifier: ^4.11.17
+        version: 4.19.8(react-dom@17.0.2)(react@17.0.2)
+      ajv:
+        specifier: ^6.12.6
+        version: 6.12.6
+      react:
+        specifier: ^17.0.2
+        version: 17.0.2
+      react-dom:
+        specifier: ^17.0.2
+        version: 17.0.2(react@17.0.2)
+      simpl-schema:
+        specifier: ^1.12.0
+        version: 1.12.0
+      uniforms:
+        specifier: ^3.10.2
+        version: 3.10.2(react@17.0.2)
+      uniforms-bridge-json-schema:
+        specifier: ^3.10.2
+        version: 3.10.2(react@17.0.2)
+      uniforms-bridge-simple-schema:
+        specifier: ^3.10.2
+        version: 3.10.2(react@17.0.2)
+      uniforms-bridge-simple-schema-2:
+        specifier: ^3.10.2
+        version: 3.10.2(react@17.0.2)
+    devDependencies:
+      "@kie-tools-core/webpack-base":
+        specifier: workspace:*
+        version: link:../../packages/webpack-base
+      "@kie-tools/root-env":
+        specifier: workspace:*
+        version: link:../../packages/root-env
+      "@kie-tools/tsconfig":
+        specifier: workspace:*
+        version: link:../../packages/tsconfig
+      "@types/react":
+        specifier: ^17.0.6
+        version: 17.0.21
+      "@types/react-dom":
+        specifier: ^17.0.5
+        version: 17.0.8
+      "@types/react-router":
+        specifier: ^5.1.14
+        version: 5.1.14
+      "@types/react-router-dom":
+        specifier: ^5.1.7
+        version: 5.1.7
+      "@types/simpl-schema":
+        specifier: ^1.12.0
+        version: 1.12.0
+      copy-webpack-plugin:
+        specifier: ^11.0.0
+        version: 11.0.0(webpack@5.70.0)
+      react-router-dom:
+        specifier: ^5.2.1
+        version: 5.3.0(react@17.0.2)
+      rimraf:
+        specifier: ^3.0.2
+        version: 3.0.2
+      typescript:
+        specifier: ^4.4.2
+        version: 4.8.4
+      webpack:
+        specifier: ^5.36.2
+        version: 5.70.0(webpack-cli@4.10.0)
+      webpack-cli:
+        specifier: ^4.10.0
+        version: 4.10.0(webpack-dev-server@4.7.3)(webpack@5.70.0)
+      webpack-dev-server:
+        specifier: ^4.7.3
+        version: 4.7.3(webpack-cli@4.10.0)(webpack@5.70.0)
+      webpack-merge:
+        specifier: ^5.8.0
+        version: 5.8.0
+
   examples/webapp:
     dependencies:
       "@kie-tools-core/editor":
@@ -1943,6 +2031,9 @@ importers:
       "@kie-tools/dashbuilder-component-api":
         specifier: workspace:*
         version: link:../dashbuilder-component-api
+      "@kie-tools/uniforms-patternfly":
+        specifier: workspace:*
+        version: link:../uniforms-patternfly
       "@patternfly/react-core":
         specifier: ^4.157.3
         version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
@@ -1962,14 +2053,11 @@ importers:
         specifier: ^17.0.2
         version: 17.0.2(react@17.0.2)
       uniforms:
-        specifier: ^3.5.5
-        version: 3.6.2(react@17.0.2)
+        specifier: ^3.10.2
+        version: 3.10.2(react@17.0.2)
       uniforms-bridge-json-schema:
-        specifier: ^3.5.5
-        version: 3.6.2(react@17.0.2)
-      uniforms-patternfly:
-        specifier: ^4.7.9
-        version: 4.7.9(@patternfly/react-core@4.168.8)(react@17.0.2)
+        specifier: ^3.10.2
+        version: 3.10.2(react@17.0.2)
     devDependencies:
       "@babel/core":
         specifier: ^7.16.0
@@ -3283,6 +3371,9 @@ importers:
       "@kie-tools/i18n-common-dictionary":
         specifier: workspace:*
         version: link:../i18n-common-dictionary
+      "@kie-tools/uniforms-patternfly":
+        specifier: workspace:*
+        version: link:../uniforms-patternfly
       "@patternfly/react-core":
         specifier: ^4.157.3
         version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
@@ -3308,14 +3399,11 @@ importers:
         specifier: ^17.0.2
         version: 17.0.2(react@17.0.2)
       uniforms:
-        specifier: ^3.5.5
-        version: 3.6.2(react@17.0.2)
+        specifier: ^3.10.2
+        version: 3.10.2(react@17.0.2)
       uniforms-bridge-json-schema:
-        specifier: ^3.5.5
-        version: 3.6.2(react@17.0.2)
-      uniforms-patternfly:
-        specifier: ^4.7.9
-        version: 4.7.9(@patternfly/react-core@4.168.8)(@patternfly/react-icons@4.19.8)(react@17.0.2)
+        specifier: ^3.10.2
+        version: 3.10.2(react@17.0.2)
     devDependencies:
       "@babel/core":
         specifier: ^7.16.0
@@ -3392,6 +3480,9 @@ importers:
       "@kie-tools/i18n-common-dictionary":
         specifier: workspace:*
         version: link:../i18n-common-dictionary
+      "@kie-tools/uniforms-patternfly":
+        specifier: workspace:*
+        version: link:../uniforms-patternfly
       "@patternfly/react-core":
         specifier: ^4.157.3
         version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
@@ -3417,14 +3508,11 @@ importers:
         specifier: ^17.0.2
         version: 17.0.2(react@17.0.2)
       uniforms:
-        specifier: ^3.5.5
-        version: 3.6.2(react@17.0.2)
+        specifier: ^3.10.2
+        version: 3.10.2(react@17.0.2)
       uniforms-bridge-json-schema:
-        specifier: ^3.5.5
-        version: 3.6.2(react@17.0.2)
-      uniforms-patternfly:
-        specifier: ^4.7.9
-        version: 4.7.9(@patternfly/react-core@4.168.8)(@patternfly/react-icons@4.19.8)(react@17.0.2)
+        specifier: ^3.10.2
+        version: 3.10.2(react@17.0.2)
     devDependencies:
       "@babel/core":
         specifier: ^7.16.0
@@ -3511,11 +3599,11 @@ importers:
         specifier: ^4.17.21
         version: 4.17.21
       uniforms:
-        specifier: ^3.5.5
-        version: 3.6.2
+        specifier: ^3.10.2
+        version: 3.10.2
       uniforms-bridge-json-schema:
-        specifier: ^3.5.5
-        version: 3.6.2
+        specifier: ^3.10.2
+        version: 3.10.2
     devDependencies:
       "@babel/core":
         specifier: ^7.16.0
@@ -6763,11 +6851,11 @@ importers:
         specifier: ^1.13.1
         version: 1.13.1
       uniforms:
-        specifier: ^3.5.5
-        version: 3.6.2(react@17.0.2)
+        specifier: ^3.10.2
+        version: 3.10.2(react@17.0.2)
       uniforms-bridge-simple-schema-2:
-        specifier: ^3.5.5
-        version: 3.6.2(react@17.0.2)
+        specifier: ^3.10.2
+        version: 3.10.2(react@17.0.2)
     devDependencies:
       "@babel/core":
         specifier: ^7.16.0
@@ -6860,6 +6948,115 @@ importers:
         specifier: ^3.0.0
         version: 3.0.0
 
+  packages/uniforms-patternfly:
+    dependencies:
+      "@types/invariant":
+        specifier: ^2.2.35
+        version: 2.2.35
+      invariant:
+        specifier: ^2.2.4
+        version: 2.2.4
+      lodash:
+        specifier: ^4.17.21
+        version: 4.17.21
+      react:
+        specifier: ^17.0.2
+        version: 17.0.2
+      react-dom:
+        specifier: ^17.0.2
+        version: 17.0.2(react@17.0.2)
+      uniforms:
+        specifier: ^3.10.2
+        version: 3.10.2(react@17.0.2)
+    devDependencies:
+      "@babel/preset-env":
+        specifier: ^7.16.0
+        version: 7.16.11
+      "@babel/preset-react":
+        specifier: ^7.16.0
+        version: 7.16.0
+      "@kie-tools-scripts/build-env":
+        specifier: workspace:*
+        version: link:../../scripts/build-env
+      "@kie-tools/eslint":
+        specifier: workspace:*
+        version: link:../eslint
+      "@kie-tools/root-env":
+        specifier: workspace:*
+        version: link:../root-env
+      "@kie-tools/tsconfig":
+        specifier: workspace:*
+        version: link:../tsconfig
+      "@patternfly/react-core":
+        specifier: ^4.157.3
+        version: 4.168.8(react-dom@17.0.2)(react@17.0.2)
... 2579 lines suppressed ...


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 26/27: Merge remote-tracking branch 'upstream/main' into KOGITO-8015-feature-preview

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit 20b87604b1f7f72072e595144b79dd9d5f120c25
Merge: 1e1e5ebb9a 3d075e9645
Author: fantonangeli <fa...@gmail.com>
AuthorDate: Thu May 25 11:55:59 2023 +0200

    Merge remote-tracking branch 'upstream/main' into KOGITO-8015-feature-preview

 .ci/jenkins/Jenkinsfile.vscode                     |   4 -
 .github/workflows/daily_dev_publish.yml            |  22 +-
 .github/workflows/release_build.yml                |  77 ++-
 .github/workflows/release_dry_run.yml              |   2 +-
 .github/workflows/release_publish.yml              |   2 +-
 .github/workflows/staging_build.yml                |  26 +-
 .gitignore                                         |   3 +
 .../external/ExternalDataSetClientProvider.java    |   5 +
 .../client/external/metrics/MetricsParser.java     |   7 +-
 .../client/external/metrics/MetricsParserTest.java |  45 +-
 .../dataset/def/ExternalDataSetDef.java            |  17 +-
 .../dataset/def/ExternalServiceType.java           |  57 ++
 .../dataset/json/ExternalDefJSONMarshaller.java    |  18 +-
 .../kie-editors-dev-vscode-extension/package.json  |   4 +-
 packages/kie-sandbox-distribution/README.md        |  57 ++
 .../kie-sandbox-distribution/docker-compose.yaml   |  26 +
 packages/kie-sandbox-distribution/env/index.js     |  93 +++
 packages/kie-sandbox-distribution/package.json     |  30 +
 .../src/resources/kubernetes/Deployment.ts         |  18 +
 .../src/resources/openshift/Route.ts               |  14 +
 .../env/index.js                                   |  20 +-
 .../install.js}                                    |  15 +-
 .../package.json                                   |  40 ++
 .../pom.xml                                        | 164 ++++++
 .../src/main/java/org/kie/kogito/AppStartup.java   |  67 +++
 .../org/kie/kogito/FileStructureConstants.java     |  36 ++
 .../java/org/kie/kogito/HotReloadResource.java     | 103 ++++
 .../org/kie/kogito/StaticContentCachingFilter.java |  48 ++
 .../main/java/org/kie/kogito/api/FileService.java  |  44 ++
 .../java/org/kie/kogito/api/FileValidation.java}   |  13 +-
 .../java/org/kie/kogito/api/UploadService.java}    |  16 +-
 .../main/java/org/kie/kogito/api/ZipService.java}  |  16 +-
 .../kie/kogito/health/LivenessHealthCheck.java}    |  20 +-
 .../kie/kogito/health/ReadinessHealthCheck.java}   |  20 +-
 .../org/kie/kogito/health/StartupHealthCheck.java} |  20 +-
 .../main/java/org/kie/kogito/model/FileType.java}  |  11 +-
 .../org/kie/kogito/model/FileValidationResult.java |  71 +++
 .../org/kie/kogito/model/UploadException.java}     |  12 +-
 .../org/kie/kogito/model/ValidationException.java} |  20 +-
 .../org/kie/kogito/service/FileServiceImpl.java    | 189 +++++++
 .../org/kie/kogito/service/UploadServiceImpl.java  | 135 +++++
 .../org/kie/kogito/service/ZipServiceImpl.java     |  60 ++
 .../kie/kogito/validation/OpenApiValidation.java   |  69 +++
 .../kogito/validation/PropertiesValidation.java    |  41 ++
 .../validation/ServerlessWorkflowValidation.java   |  65 +++
 .../src/main/resources/application.properties      |  12 +
 .../src/main/resources/hello.sw.json               |  26 +
 .../org/kie/kogito/service/FileServiceTest.java    | 210 +++++++
 .../org/kie/kogito/service/ZipServiceTest.java     |  52 ++
 .../src/test/resources/test-with-invalid.zip       | Bin 0 -> 1943 bytes
 .../src/test/resources/test.zip                    | Bin 0 -> 1415 bytes
 .../env/index.js                                   |  43 ++
 .../package.json                                   |  18 +
 .../.dockerignore                                  |   4 +
 .../Containerfile                                  |  46 ++
 .../Dockerfile                                     |   1 +
 .../env/index.js                                   |  41 ++
 .../package.json                                   |  34 ++
 .../build/defaultEnvJson.ts}                       |  25 +-
 packages/serverless-logic-web-tools/env/index.js   |  43 +-
 packages/serverless-logic-web-tools/package.json   |  10 +-
 packages/serverless-logic-web-tools/src/App.tsx    |  19 +-
 .../serverless-logic-web-tools/src/AppConstants.ts |   4 +
 .../src/ResponsiveDropdown/ResponsiveDropdown.tsx  |   1 +
 .../src/accelerator/Accelerators.ts                |  43 ++
 .../src/accelerator/useAccelerator.tsx             | 272 +++++++++
 .../src/alerts/Alerts.tsx                          |  10 +-
 .../src/alerts/GlobalAlertsContext.tsx             | 122 ++++
 .../src/editor/CreateGitHubRepositoryModal.tsx     | 170 +++---
 .../src/editor/Deploy/ConfirmDeployModal.tsx       |   9 +-
 .../src/editor/Deploy/DeployDropdownItems.tsx      | 154 -----
 .../src/editor/EditorPage.tsx                      |  16 +-
 .../src/editor/EditorToolbar.tsx                   |  68 +--
 .../KieSandboxExtendedServicesButtons.tsx          |   7 +-
 .../KieSandboxExtendedServicesDropdownGroup.tsx    |  11 +-
 .../src/editor/NewFileDropdownMenu.tsx             |   6 +-
 .../editor/api/RemoteServiceRegistryCatalogApi.ts  |   2 +-
 .../src/editor/hooks/EditorContext.tsx             |  49 ++
 .../src/editor/hooks/useDeployDropdownItems.tsx    | 411 ++++++++++++++
 .../src/editor/hooks/useEditorNotifications.tsx    |   8 +-
 .../src/env/EnvContext.tsx                         |  15 +-
 .../src/env/EnvContextProvider.tsx                 |  14 +-
 .../OpenShiftConstants.ts => env/EnvJson.ts}       |  10 +-
 .../src/extension/index.ts                         |  16 +-
 .../src/fetch/index.ts}                            |  17 +-
 .../src/home/sample/{sampleApi.ts => SampleApi.ts} |  46 +-
 .../src/home/sample/SampleCard.tsx                 |   2 +-
 .../src/home/sample/SampleConstants.ts}            |  23 +-
 .../src/home/sample/SamplesCatalog.tsx             |   2 +-
 .../src/home/sample/hooks/SampleContext.tsx        |  22 +-
 .../src/homepage/recentModels/RecentModels.tsx     |  10 +-
 .../recentModels/workspaceFiles/WorkspaceFiles.tsx |  11 +-
 .../serverless-logic-web-tools/src/i18n/AppI18n.ts |  70 ---
 .../src/i18n/locales/en.ts                         |  78 +--
 .../KieSandboxExtendedServicesContextProvider.tsx  |  58 +-
 .../KieSandboxExtendedServicesIcon.tsx             |   2 +-
 .../KieSandboxExtendedServicesModal.tsx            |  12 +-
 .../src/openshift/DeployConstants.ts}              |  14 +-
 .../src/openshift/OpenShiftConstants.ts            |   4 +
 .../src/openshift/OpenShiftContext.tsx             |   6 +-
 .../src/openshift/OpenShiftContextProvider.tsx     |  55 +-
 .../src/openshift/deploy/BaseContainerImages.ts    |  11 +-
 .../src/openshift/deploy/DeploymentStrategy.ts     |  17 -
 .../strategies/DashboardSingleModelDeployment.ts   |   3 +-
 .../strategies/DashboardWorkspaceDeployment.ts     |   3 +-
 .../deploy/strategies/KogitoProjectDeployment.ts   |   3 +-
 .../deploy/strategies/KogitoSwfModelDeployment.ts  |   3 +-
 .../src/openshift/deploy/types.ts                  |  14 +-
 .../dropdown/OpenShiftDeploymentDropdownItem.tsx   |  77 ++-
 .../dropdown/OpenshiftDeploymentsDropdown.tsx      | 188 +++++--
 .../src/openshift/hooks/useDeploymentStrategy.ts   |   3 +-
 .../pipelines/DevModeDeploymentLoaderPipeline.ts   | 123 ++++
 .../pipelines/KnativeDeploymentLoaderPipeline.ts   |   1 +
 .../openshift/pipelines/RestartDevModePipeline.ts  | 112 ++++
 .../openshift/pipelines/SpinUpDevModePipeline.ts   | 241 ++++++++
 .../src/openshift/swfDevMode/DevModeConstants.ts   |  83 +++
 .../src/openshift/swfDevMode/DevModeContext.tsx    | 292 ++++++++++
 .../src/settings/SettingsContext.tsx               |  29 +-
 .../src/settings/openshift/OpenShiftSettings.tsx   |   9 +-
 .../settings/openshift/OpenShiftSettingsConfig.tsx |  10 +
 .../openshift/OpenShiftSettingsSimpleConfig.tsx    |  50 +-
 .../src/settings/storage/StorageSettings.tsx       |  10 +-
 .../src/upgrade/UpgradeContext.tsx                 |  67 +++
 .../components/NewWorkspaceFromSample.tsx          |   4 +-
 .../hooks/WebToolsWorkspaceContextProvider.tsx     |  30 +
 .../src/workspace/worker/sharedWorker.ts           |   6 +-
 .../src/zip/index.ts}                              |  21 +-
 .../serverless-logic-web-tools/static/env.json     |   2 +-
 .../static/resources/style.css                     | 100 +---
 packages/serverless-logic-web-tools/tsconfig.json  |  11 +-
 .../serverless-logic-web-tools/webpack.config.js   | 302 ----------
 .../serverless-logic-web-tools/webpack.config.ts   | 328 +++++++++++
 .../package.json                                   |   1 +
 .../ServerlessWorkflowCombinedEditorChannelApi.ts  |   6 +
 ...ServerlessWorkflowCombinedEditorEnvelopeApi.ts} |  13 +-
 .../editor/ServerlessWorkflowCombinedEditor.tsx    |  28 +
 .../ServerlessWorkflowCombinedEditorView.tsx       |  14 +-
 .../src/editor/helpers/ColorNodes.ts               |  45 ++
 ...verlessWorkflowCombinedEditorEnvelopeApiImpl.ts |  52 ++
 .../src/impl/SwfCombinedEditorChannelApiImpl.ts    |   4 +
 .../src/impl/index.ts                              |   1 +
 .../ServerlessWorkflowDiagramEditorEnvelopeApi.ts  |   4 +-
 .../src/api/StunnerAPI.ts                          |  76 +++
 .../src/api/StunnerEditorEnvelopeAPI.ts            | 107 ++++
 .../src/api/StunnerEditorEnvelopeAPIFactory.ts     |  48 ++
 .../src/api/SwfStunnerEditorAPI.ts                 | 182 ++++++
 .../envelope/ServerlessWorkflowDiagramEditor.ts    |  93 ++-
 ...rverlessWorkflowDiagramEditorEnvelopeApiImpl.ts | 110 +++-
 .../envelope/ServerlessWorkflowStunnerEditor.ts    | 108 ++++
 .../canvas/controls/ControlPointControlImpl.java   |   2 +-
 .../client/widgets/editor/StunnerEditor.java       |   1 +
 .../common/stunner/core/graph/content/Bound.java   |   7 +-
 .../common/stunner/core/graph/content/Bounds.java  |   7 +-
 .../core/graph/content/view/ControlPoint.java      |   9 +-
 .../stunner/core/graph/content/view/Point2D.java   |   9 +-
 .../stunner/core/client/api/JsStunnerEditor.java   |   2 +
 .../stunner/core/client/api/JsStunnerSession.java  |  21 +-
 .../common/stunner/core/client/api/JsWindow.java   |   1 +
 .../core/graph/content/view/MagnetConnection.java  |   9 +-
 .../core/graph/content/view/Point2DConnection.java |   7 +-
 .../core/graph/content/view/ViewConnectorImpl.java |   9 +-
 .../stunner/core/graph/content/view/ViewImpl.java  |   7 +-
 .../common/stunner/core/graph/impl/NodeImpl.java   |   8 +-
 .../impl/AbstractControlPointCommandTest.java      |   6 +-
 .../com/ait/lienzo/client/core/types/JsCanvas.java |   5 +
 .../stunner/sw/client/editor/DiagramEditor.java    |   2 +-
 .../common/stunner/sw/KogitoSWEditor.gwt.xml       |   2 +-
 .../sw/client/editor/DiagramEditorTest.java        |   6 +-
 ...neServerlessWorkflowCombinedEditorChannelApi.ts |   4 +
 .../src/main/resources}/hello-world.sw.json        |   0
 ...-workflow-editor-extension-svg-filepath.test.ts | 123 ++++
 .../package.json                                   |   4 +-
 packages/stunner-editors/pom.xml                   |   4 +-
 .../package.json                                   |   4 +-
 .../src/VSCodeTestHelper.ts                        |  40 ++
 .../package.json                                   |   2 +-
 .../.mocharc.json                                  |   7 -
 .../.vscode/launch.json                            |  24 -
 .../.vscode/settings.json                          |   9 -
 .../.vscode/tasks.json                             |  18 -
 .../CHANGELOG.md                                   | 149 -----
 .../LICENSE                                        | 201 -------
 .../README.md                                      |  86 ---
 .../icon.png                                       | Bin 22915 -> 0 bytes
 .../it-tests/helpers/swf/SwfEditorTestHelper.ts    | 174 ------
 .../autocompletion/autocompletion.sw.json          |  15 -
 .../autocompletion/autocompletion.sw.json.result   |  28 -
 .../autocompletion/autocompletion.sw.yaml          |  16 -
 .../autocompletion/autocompletion.sw.yaml.result   |  27 -
 .../emptyfile_autocompletion.sw.json               |   0
 .../emptyfile_autocompletion.sw.json.result        |  41 --
 .../emptyfile_autocompletion.sw.yaml               |   0
 .../emptyfile_autocompletion.sw.yaml.result        |  25 -
 .../emptyworkflow_autocompletion.sw.json           |   0
 .../emptyworkflow_autocompletion.sw.json.result    |  11 -
 .../resources/autocompletion/specs/api.yaml        |  15 -
 .../resources/basic-operations/greet.sw.json       |  67 ---
 .../applicant-request-decision.sw.json             |  59 --
 .../resources/expression/expression.sw.json        |  35 --
 .../resources/expression/expression.sw.yaml        |  22 -
 .../resources/expression/schema/schema.json        |  24 -
 .../resources/expression/specs/openapi.json        |  49 --
 .../it-tests/resources/functions/function.sw.json  |  14 -
 .../resources/functions/function.sw.json.result    |  30 -
 .../it-tests/resources/functions/function.sw.yaml  |  10 -
 .../resources/functions/function.sw.yaml.result    |  18 -
 .../it-tests/resources/functions/routes/camel.json |  29 -
 .../it-tests/resources/functions/routes/camel.yaml |  12 -
 .../resources/functions/specs/asyncapi.json        |  17 -
 .../resources/functions/specs/asyncapi.yaml        |  10 -
 .../resources/functions/specs/openapi.json         |  41 --
 .../resources/functions/specs/openapi.yaml         |  25 -
 .../it-tests/resources/greeting-flow/.dockerignore |   5 -
 .../it-tests/resources/greeting-flow/.gitignore    |  39 --
 .../it-tests/resources/greeting-flow/pom.xml       | 144 -----
 .../org/kie/tools/it/tests/GreetingResource.java   |  16 -
 .../src/main/resources/application.properties      |   1 -
 .../src/main/resources/greetings.sw.json           |  81 ---
 .../greeting-flow/src/main/resources/openapi.yaml  |  37 --
 .../org/kie/tools/it/tests/GreetingResourceIT.java |   9 -
 .../kie/tools/it/tests/GreetingResourceTest.java   |  21 -
 .../syntax-highlight-hello-world.sw.json           |  18 -
 ...orkflow-editor-extension-autocompletion.test.ts | 255 ---------
 ...kflow-editor-extension-basic-operations.test.ts | 141 -----
 ...low-editor-extension-diagram-navigation.test.ts |  84 ---
 ...ss-workflow-editor-extension-expression.test.ts |  85 ---
 ...ess-workflow-editor-extension-functions.test.ts | 177 ------
 ...verless-workflow-editor-extension-smoke.test.ts |  62 --
 ...kflow-editor-extension-syntax-highlight.test.ts |  96 ----
 .../it-tests/settings.json                         |  14 -
 .../jsonLanguageConfiguration.json                 |  23 -
 .../yamlLanguageConfiguration.json                 |  38 --
 .../mocha-reporter-config.json                     |  15 -
 .../package.json                                   | 388 -------------
 .../src/extension/RedHatAuthExtensionStateStore.ts |  53 --
 ...erverlessWorkflowDiagramEditorChannelApiImpl.ts | 261 ---------
 ...rlessWorkflowDiagramEditorChannelApiProducer.ts |  70 ---
 .../builtInVsCodeEditorSwfContributions.ts         | 320 -----------
 .../src/extension/commandIds.ts                    |  30 -
 .../src/extension/configuration.ts                 | 152 -----
 .../src/extension/extension.ts                     | 138 -----
 .../fs/JqExpressionsReadSchemaFromFs.ts            |  62 --
 .../SwfLanguageServiceChannelApiImpl.ts            |  45 --
 .../languageService/VsCodeSwfLanguageService.ts    | 212 -------
 .../SwfServiceCatalogChannelApiImpl.ts             |  63 ---
 .../serviceCatalog/SwfServiceCatalogStore.ts       |  71 ---
 .../SwfServiceCatalogSupportActions.ts             |  74 ---
 .../fs/FsWatchingServiceCatalogRelativeStore.ts    | 220 --------
 .../serviceRegistry/ServiceRegistriesStore.ts      | 174 ------
 .../ServiceRegistryInstanceClient.ts               |  88 ---
 .../serviceRegistry/auth/AuthProviderFactory.ts    |  45 --
 .../serviceRegistry/auth/RhhccAuthProvider.ts      |  77 ---
 .../serviceCatalog/serviceRegistryCommands.ts      |  50 --
 .../src/extension/setupDeprecationNotification.ts  |  49 --
 .../extension/setupDiagramEditorCompanionTab.ts    | 142 -----
 .../ServerlessWorkflowDiagramEditorEnvelopeApp.ts  |  44 --
 .../ServerlessWorkflowMermaidViewerEnvelopeApp.ts  |  28 -
 .../static/svg-icon-dark.png                       | Bin 656 -> 0 bytes
 .../static/svg-icon-light.png                      | Bin 362 -> 0 bytes
 .../syntaxes/JSON.tmLanguage.json                  | 213 -------
 .../syntaxes/YAML.tmLanguage.json                  | 621 ---------------------
 .../tsconfig.it-tests.json                         |  11 -
 .../tsconfig.json                                  |   9 -
 .../webpack.config.js                              |  72 ---
 .../pom.xml                                        |   7 +-
 .../internal/handlers/GetAccessorsHandler.java     |  12 +-
 .../src/textEditor/YardTextEditorController.ts     |   2 +
 .../augmentation/language/schemas/yardSchema.ts    | 187 +++++++
 .../augmentation/language/yaml/index.ts}           |  37 +-
 packages/yard-vscode-extension/package.json        |  13 +-
 pnpm-lock.yaml                                     | 339 +++++------
 repo/graph.dot                                     |  22 +-
 repo/graph.json                                    |  86 +--
 scripts/build-env/src/bin.ts                       |  20 +
 scripts/sparse-checkout/run.sh                     |   2 +-
 275 files changed, 6682 insertions(+), 8118 deletions(-)

diff --cc packages/serverless-logic-web-tools/package.json
index b80490fa23,86b1bacfcc..1368fb841f
--- a/packages/serverless-logic-web-tools/package.json
+++ b/packages/serverless-logic-web-tools/package.json
@@@ -72,7 -72,8 +74,9 @@@
      "react-if": "^4.1.4",
      "react-router": "^5.2.1",
      "react-router-dom": "^5.2.1",
+     "short-unique-id": "^4.4.4",
 +    "showdown": "^2.1.0",
+     "uuid": "^8.3.2",
      "vscode-languageserver-types": "^3.16.0",
      "yaml": "^2.0.1"
    },
diff --cc packages/serverless-logic-web-tools/src/AppConstants.ts
index 8124e259f5,0892f4e600..4b6f3ad5ac
--- a/packages/serverless-logic-web-tools/src/AppConstants.ts
+++ b/packages/serverless-logic-web-tools/src/AppConstants.ts
@@@ -15,5 -15,8 +15,9 @@@
   */
  
  export const APP_NAME = "Serverless Logic Web Tools";
 -
 +export const SERVERLESS_LOGIC_WEBTOOLS_DOCUMENTATION_URL =
 +  "https://kiegroup.github.io/kogito-docs/serverlessworkflow/latest/tooling/serverless-logic-web-tools/serverless-logic-web-tools-overview.html";
+ export const APP_GIT_USER = {
+   name: APP_NAME,
+   email: "",
+ };
diff --cc packages/serverless-logic-web-tools/src/editor/EditorPage.tsx
index 4fe16df52c,a0ed0c2ff9..12821815cc
--- a/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx
@@@ -42,7 -42,7 +41,8 @@@ import { EditorToolbar } from "./Editor
  import { APP_NAME } from "../AppConstants";
  import { WebToolsEmbeddedEditor, WebToolsEmbeddedEditorRef } from "./WebToolsEmbeddedEditor";
  import { useEditorNotifications } from "./hooks/useEditorNotifications";
+ import { useGlobalAlertsDispatchContext } from "../alerts/GlobalAlertsContext";
 +import { setPageTitle } from "../PageTitle";
  
  export interface Props {
    workspaceId: string;
@@@ -218,50 -218,46 +218,44 @@@ export function EditorPage(props: Props
    );
  
    return (
 -    <OnlineEditorPage>
 -      <PromiseStateWrapper
 -        promise={workspaceFilePromise}
 -        pending={<LoadingSpinner />}
 -        rejected={(errors) => <EditorPageErrorPage errors={errors} path={props.fileRelativePath} />}
 -        resolved={(file) => (
 -          <>
 -            <Page>
 -              <EditorToolbar workspaceFile={file.workspaceFile} editor={webToolsEditor?.editor} />
 -              <Divider />
 -              <EditorPageDockDrawer
 -                ref={editorPageDockRef}
 -                isEditorReady={isEditorReady}
 -                workspaceFile={file.workspaceFile}
 -                onNotificationClick={onNotificationClick}
 -                isDisabled={!webToolsEditor?.notificationHandler.isSupported}
 -              >
 -                <PageSection hasOverflowScroll={true} padding={{ default: "noPadding" }} aria-label="Editor Section">
 -                  <div style={{ height: "100%" }}>
 -                    {!isEditorReady && <LoadingSpinner />}
 -                    <div style={{ display: isEditorReady ? "inline" : "none" }}>
 -                      {embeddedEditorFile && (
 -                        <WebToolsEmbeddedEditor
 -                          uniqueFileId={uniqueFileId}
 -                          ref={webToolsEditorRef}
 -                          file={embeddedEditorFile}
 -                          workspaceFile={file.workspaceFile}
 -                          editorEnvelopeLocator={editorEnvelopeLocator}
 -                          channelType={ChannelType.ONLINE_MULTI_FILE}
 -                          locale={locale}
 -                        />
 -                      )}
 -                    </div>
 +    <PromiseStateWrapper
 +      promise={workspaceFilePromise}
 +      pending={<LoadingSpinner />}
 +      rejected={(errors) => <EditorPageErrorPage errors={errors} path={props.fileRelativePath} />}
 +      resolved={(file) => (
 +        <>
 +          <Page>
-             <EditorToolbar
-               workspaceFile={file.workspaceFile}
-               editor={webToolsEditor?.editor}
-               alerts={alerts}
-               alertsRef={alertsRef}
-               editorPageDock={editorPageDock}
-             />
++            <EditorToolbar workspaceFile={file.workspaceFile} editor={webToolsEditor?.editor} />
 +            <Divider />
 +            <EditorPageDockDrawer
 +              ref={editorPageDockRef}
 +              isEditorReady={isEditorReady}
 +              workspaceFile={file.workspaceFile}
 +              onNotificationClick={onNotificationClick}
 +              isDisabled={!webToolsEditor?.notificationHandler.isSupported}
 +            >
 +              <PageSection hasOverflowScroll={true} padding={{ default: "noPadding" }} aria-label="Editor Section">
 +                <div style={{ height: "100%" }}>
 +                  {!isEditorReady && <LoadingSpinner />}
 +                  <div style={{ display: isEditorReady ? "inline" : "none" }}>
 +                    {embeddedEditorFile && (
 +                      <WebToolsEmbeddedEditor
 +                        uniqueFileId={uniqueFileId}
 +                        ref={webToolsEditorRef}
 +                        file={embeddedEditorFile}
 +                        workspaceFile={file.workspaceFile}
 +                        editorEnvelopeLocator={editorEnvelopeLocator}
 +                        channelType={ChannelType.ONLINE_MULTI_FILE}
 +                        locale={locale}
 +                      />
 +                    )}
                    </div>
 -                </PageSection>
 -              </EditorPageDockDrawer>
 -            </Page>
 -          </>
 -        )}
 -      />
 -    </OnlineEditorPage>
 +                </div>
 +              </PageSection>
 +            </EditorPageDockDrawer>
 +          </Page>
 +        </>
 +      )}
 +    />
    );
  }
diff --cc packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx
index 50a4dc4635,f385ac1bd6..46ae59ab4b
--- a/packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx
@@@ -93,15 -92,12 +91,14 @@@ import { WorkspaceStatusIndicator } fro
  import { WorkspaceKind } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceOrigin";
  import { useEditorEnvelopeLocator } from "../envelopeLocator/EditorEnvelopeLocatorContext";
  import { UrlType, useImportableUrl } from "../workspace/hooks/ImportableUrlHooks";
+ import { useEnv } from "../env/EnvContext";
+ import { useGlobalAlert, useGlobalAlertsDispatchContext } from "../alerts/GlobalAlertsContext";
 +import { Link } from "react-router-dom";
 +import { routes } from "../navigation/Routes";
  
  export interface Props {
-   alerts: AlertsController | undefined;
-   alertsRef: (controller: AlertsController) => void;
    editor: EmbeddedEditorRef | undefined;
    workspaceFile: WorkspaceFile;
-   editorPageDock: EditorPageDockDrawerRef | undefined;
  }
  
  const showWhenSmall: ToolbarItemProps["visibility"] = {
diff --cc packages/serverless-logic-web-tools/src/editor/NewFileDropdownMenu.tsx
index 5996576438,fb59b77f64..62782c4830
--- a/packages/serverless-logic-web-tools/src/editor/NewFileDropdownMenu.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/NewFileDropdownMenu.tsx
@@@ -38,7 -38,7 +37,8 @@@ import { FileTypes } from "@kie-tools-c
  import { decoder } from "@kie-tools-core/workspaces-git-fs/dist/encoderdecoder/EncoderDecoder";
  import { extractExtension } from "@kie-tools-core/workspaces-git-fs/dist/relativePath/WorkspaceFileRelativePathParser";
  import { UrlType } from "../workspace/hooks/ImportableUrlHooks";
+ import { useGlobalAlert } from "../alerts/GlobalAlertsContext";
 +import { ValidatedOptions } from "@patternfly/react-core/dist/js";
  
  const ROOT_MENU_ID = "addFileRootMenu";
  
diff --cc packages/serverless-logic-web-tools/src/editor/hooks/useDeployDropdownItems.tsx
index 0000000000,05183e17d4..e0f1e6be5b
mode 000000,100644..100644
--- a/packages/serverless-logic-web-tools/src/editor/hooks/useDeployDropdownItems.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/hooks/useDeployDropdownItems.tsx
@@@ -1,0 -1,410 +1,411 @@@
+ /*
+  * Copyright 2021 Red Hat, Inc. and/or its affiliates.
+  *
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+  *        http://www.apache.org/licenses/LICENSE-2.0
+  *
+  * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  */
+ 
+ import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
+ import { Divider } from "@patternfly/react-core/dist/js/components/Divider";
+ import { Spinner } from "@patternfly/react-core/dist/js/components/Spinner";
+ import { List, ListItem } from "@patternfly/react-core/dist/js/components/List";
+ import { DropdownItem } from "@patternfly/react-core/dist/js/components/Dropdown";
+ import { Text } from "@patternfly/react-core/dist/js/components/Text";
+ import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
+ import { Flex, FlexItem } from "@patternfly/react-core/dist/js/layouts/Flex";
+ import { RegistryIcon, ExclamationCircleIcon } from "@patternfly/react-icons/dist/js/icons";
+ import { OpenshiftIcon } from "@patternfly/react-icons/dist/js/icons/openshift-icon";
+ import { UploadIcon } from "@patternfly/react-icons/dist/js/icons/upload-icon";
+ import * as React from "react";
+ import { useCallback, useMemo, useState, useEffect } from "react";
+ import { useAppI18n } from "../../i18n";
+ import { FeatureDependentOnKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/FeatureDependentOnKieSandboxExtendedServices";
+ import {
+   DependentFeature,
+   useKieSandboxExtendedServices,
+ } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
+ import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
+ import { useOpenShift } from "../../openshift/OpenShiftContext";
+ import { OpenShiftInstanceStatus } from "../../openshift/OpenShiftInstanceStatus";
 -import { useSettings, useSettingsDispatch } from "../../settings/SettingsContext";
 -import { SettingsTabs } from "../../settings/SettingsModalBody";
++import { useSettings } from "../../settings/SettingsContext";
+ import { useVirtualServiceRegistryDependencies } from "../../virtualServiceRegistry/hooks/useVirtualServiceRegistryDependencies";
+ import { FileLabel } from "../../workspace/components/FileLabel";
+ import { ActiveWorkspace } from "@kie-tools-core/workspaces-git-fs/dist/model/ActiveWorkspace";
+ import { WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+ import { useDevMode, useDevModeDispatch } from "../../openshift/swfDevMode/DevModeContext";
+ import { Alert, AlertActionCloseButton, AlertActionLink } from "@patternfly/react-core/dist/js/components/Alert";
+ import { useEnv } from "../../env/EnvContext";
+ import { useGlobalAlert } from "../../alerts/GlobalAlertsContext";
+ import { useEditor } from "../hooks/EditorContext";
+ import { isOfKind } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
++import { useHistory } from "react-router";
++import { routes } from "../../navigation/Routes";
+ 
+ const FETCH_DEV_MODE_DEPLOYMENT_POLLING_TIME = 2000;
+ 
+ interface Props {
+   workspace: ActiveWorkspace;
+   workspaceFile: WorkspaceFile;
+ }
+ 
+ export function useDeployDropdownItems(props: Props) {
+   const { env } = useEnv();
+   const { notifications } = useEditor();
+   const { i18n } = useAppI18n();
+   const devMode = useDevMode();
+   const devModeDispatch = useDevModeDispatch();
+   const settings = useSettings();
 -  const settingsDispatch = useSettingsDispatch();
+   const kieSandboxExtendedServices = useKieSandboxExtendedServices();
+   const openshift = useOpenShift();
+   const [canContentBeDeployed, setCanContentBeDeployed] = useState(true);
+   const { needsDependencyDeployment } = useVirtualServiceRegistryDependencies({
+     workspace: props.workspace,
+   });
++  const history = useHistory();
+ 
+   useEffect(() => {
+     props.workspaceFile.getFileContentsAsString().then((content) => {
+       setCanContentBeDeployed(content.trim().length > 0 && !notifications.some((d) => d.severity === "ERROR"));
+     });
+   }, [notifications, props.workspaceFile]);
+ 
+   const devModeUploadingAlert = useGlobalAlert(
+     useCallback(({ close }) => {
+       return (
+         <Alert
+           className="pf-u-mb-md"
+           variant="info"
+           title={
+             <>
+               <Spinner size={"sm"} />
+               &nbsp;&nbsp; Uploading files to Dev Mode...
+             </>
+           }
+           aria-live="polite"
+           data-testid="alert-dev-mode-uploading"
+           actionClose={<AlertActionCloseButton onClose={close} />}
+         />
+       );
+     }, [])
+   );
+ 
+   const devModeReadyAlert = useGlobalAlert<{ routeUrl: string; filePaths: string[] }>(
+     useCallback(({ close }, { routeUrl, filePaths }) => {
+       return (
+         <Alert
+           isExpandable
+           className="pf-u-mb-md"
+           variant="success"
+           title={"Your Dev Mode has been successfully updated"}
+           aria-live="polite"
+           data-testid="alert-dev-mode-ready"
+           actionClose={<AlertActionCloseButton onClose={close} />}
+           actionLinks={
+             <AlertActionLink onClick={() => window.open(routeUrl, "_blank")}>
+               {"Go to Serverless Workflow Dev UI ↗"}
+             </AlertActionLink>
+           }
+         >
+           <>
+             <Text component="p" style={{ marginBottom: "4px" }}>
+               Files that have been uploaded:
+             </Text>
+             <List>
+               {filePaths.map((p) => (
+                 <ListItem key={`uploaded-file-path-${p}`}>{p}</ListItem>
+               ))}
+             </List>
+           </>
+         </Alert>
+       );
+     }, [])
+   );
+ 
+   const uploadToDevModeSuccessAlert = useGlobalAlert(
+     useCallback(({ close }) => {
+       return (
+         <Alert
+           className="pf-u-mb-md"
+           variant="info"
+           title={
+             <>
+               <Spinner size={"sm"} />
+               &nbsp;&nbsp; Updating the Dev Mode deployment...
+             </>
+           }
+           aria-live="polite"
+           data-testid="alert-dev-mode-updating"
+           actionClose={<AlertActionCloseButton onClose={close} />}
+         />
+       );
+     }, [])
+   );
+ 
+   const uploadToDevModeErrorAlert = useGlobalAlert<{ messages: string[] }>(
+     useCallback(({ close }, { messages }) => {
+       return (
+         <Alert
+           isExpandable
+           className="pf-u-mb-md"
+           variant="warning"
+           title={"Something went wrong while uploading to the Dev Mode."}
+           aria-live="polite"
+           data-testid="alert-upload-error"
+           actionClose={<AlertActionCloseButton onClose={close} />}
+         >
+           {messages.length > 1 ? (
+             <List>
+               {messages.map((p) => (
+                 <ListItem key={`error-message-upload-${p}`}>{p}</ListItem>
+               ))}
+             </List>
+           ) : (
+             <Text component="p">{messages[0]}</Text>
+           )}
+         </Alert>
+       );
+     }, [])
+   );
+ 
+   const uploadToDevModeTimeoutErrorAlert = useGlobalAlert(
+     useCallback(({ close }) => {
+       return (
+         <Alert
+           className="pf-u-mb-md"
+           variant="warning"
+           title={
+             <>
+               Something went wrong while uploading to the Dev Mode.
+               <br />
+               Please check your Dev Mode deployment logs for more details.
+             </>
+           }
+           aria-live="polite"
+           data-testid="alert-upload-error"
+           actionClose={<AlertActionCloseButton onClose={close} />}
+         />
+       );
+     }, [])
+   );
+ 
+   const isKieSandboxExtendedServicesRunning = useMemo(
+     () => kieSandboxExtendedServices.status === KieSandboxExtendedServicesStatus.RUNNING,
+     [kieSandboxExtendedServices.status]
+   );
+ 
+   const isOpenShiftConnected = useMemo(
+     () => settings.openshift.status === OpenShiftInstanceStatus.CONNECTED,
+     [settings.openshift.status]
+   );
+ 
+   const isUploadToDevModeEnabled = useMemo(
+     () => devMode.isEnabled && isOfKind("sw", props.workspaceFile.name),
+     [devMode.isEnabled, props.workspaceFile.name]
+   );
+ 
+   const onSetup = useCallback(() => {
 -    settingsDispatch.open(SettingsTabs.OPENSHIFT);
 -  }, [settingsDispatch]);
++    history.push(routes.settings.openshift.path({}));
++  }, [history]);
+ 
+   const onDeploy = useCallback(() => {
+     if (isKieSandboxExtendedServicesRunning) {
+       openshift.setConfirmDeployModalOpen(true);
+       return;
+     }
+     kieSandboxExtendedServices.setInstallTriggeredBy(DependentFeature.OPENSHIFT);
+     kieSandboxExtendedServices.setModalOpen(true);
+   }, [isKieSandboxExtendedServicesRunning, kieSandboxExtendedServices, openshift]);
+ 
+   const onUploadDevMode = useCallback(async () => {
+     if (isKieSandboxExtendedServicesRunning) {
+       devModeUploadingAlert.show();
+       const result = await devModeDispatch.upload({
+         targetSwfFile: props.workspaceFile,
+         allFiles: props.workspace.files,
+       });
+       devModeUploadingAlert.close();
+ 
+       if (result.success) {
+         uploadToDevModeSuccessAlert.show();
+ 
+         let attemptsLeft = 15;
+         const fetchDevModeDeploymentTask = window.setInterval(async () => {
+           const isReady = await devModeDispatch.checkHealthReady();
+           attemptsLeft--;
+           if (attemptsLeft === 0) {
+             uploadToDevModeSuccessAlert.close();
+             uploadToDevModeTimeoutErrorAlert.show();
+             window.clearInterval(fetchDevModeDeploymentTask);
+             return;
+           }
+           if (!isReady) {
+             return;
+           }
+           uploadToDevModeSuccessAlert.close();
+           devModeReadyAlert.show({ routeUrl: devMode.endpoints!.swfDevUi, filePaths: result.uploadedPaths });
+           window.clearInterval(fetchDevModeDeploymentTask);
+         }, FETCH_DEV_MODE_DEPLOYMENT_POLLING_TIME);
+       } else {
+         uploadToDevModeErrorAlert.show({ messages: result.messages });
+       }
+     } else {
+       kieSandboxExtendedServices.setInstallTriggeredBy(DependentFeature.OPENSHIFT);
+       kieSandboxExtendedServices.setModalOpen(true);
+     }
+   }, [
+     isKieSandboxExtendedServicesRunning,
+     devModeUploadingAlert,
+     devModeDispatch,
+     props.workspaceFile,
+     props.workspace.files,
+     uploadToDevModeSuccessAlert,
+     devModeReadyAlert,
+     devMode.endpoints,
+     uploadToDevModeErrorAlert,
+     kieSandboxExtendedServices,
+     uploadToDevModeTimeoutErrorAlert,
+   ]);
+ 
+   return useMemo(() => {
+     return [
+       <React.Fragment key={"deploy-dropdown-items"}>
+         {props.workspace && (
+           <FeatureDependentOnKieSandboxExtendedServices isLight={false} position="left">
+             {isUploadToDevModeEnabled && (
+               <DropdownItem
+                 icon={<UploadIcon />}
+                 id="upload-dev-mode-button"
+                 key={`dropdown-upload-dev-mode`}
+                 component={"button"}
+                 onClick={onUploadDevMode}
+                 isDisabled={isKieSandboxExtendedServicesRunning && (!isOpenShiftConnected || !canContentBeDeployed)}
+                 ouiaId={"upload-to-openshift-dev-mode-dropdown-button"}
+               >
+                 {props.workspace.files.length > 1 && (
+                   <Flex flexWrap={{ default: "nowrap" }}>
+                     <FlexItem>
+                       Upload <b>{`"${props.workspace.descriptor.name}"`}</b> to Dev Mode
+                     </FlexItem>
+                   </Flex>
+                 )}
+                 {props.workspace.files.length === 1 && (
+                   <Flex flexWrap={{ default: "nowrap" }}>
+                     <FlexItem>
+                       Upload <b>{`"${props.workspace.files[0].nameWithoutExtension}"`}</b> to Dev Mode
+                     </FlexItem>
+                     <FlexItem>
+                       <b>
+                         <FileLabel extension={props.workspace.files[0].extension} />
+                       </b>
+                     </FlexItem>
+                   </Flex>
+                 )}
+               </DropdownItem>
+             )}
+             <DropdownItem
+               icon={<OpenshiftIcon />}
+               id="deploy-your-model-button"
+               key={`dropdown-deploy`}
+               component={"button"}
+               onClick={onDeploy}
+               isDisabled={isKieSandboxExtendedServicesRunning && (!isOpenShiftConnected || !canContentBeDeployed)}
+               ouiaId={"deploy-to-openshift-dropdown-button"}
+             >
+               {props.workspace.files.length > 1 && (
+                 <Flex flexWrap={{ default: "nowrap" }}>
+                   <FlexItem>
+                     Deploy models in <b>{`"${props.workspace.descriptor.name}"`}</b>
+                   </FlexItem>
+                 </Flex>
+               )}
+               {props.workspace.files.length === 1 && (
+                 <Flex flexWrap={{ default: "nowrap" }}>
+                   <FlexItem>
+                     Deploy <b>{`"${props.workspace.files[0].nameWithoutExtension}"`}</b>
+                   </FlexItem>
+                   <FlexItem>
+                     <b>
+                       <FileLabel extension={props.workspace.files[0].extension} />
+                     </b>
+                   </FlexItem>
+                 </Flex>
+               )}
+             </DropdownItem>
+             {needsDependencyDeployment && (
+               <>
+                 <Divider />
+                 <Tooltip content={i18n.deployments.virtualServiceRegistry.dependencyWarningTooltip} position="bottom">
+                   <DropdownItem icon={<RegistryIcon color="var(--pf-global--warning-color--100)" />} isDisabled>
+                     <Flex flexWrap={{ default: "nowrap" }}>
+                       <FlexItem>
+                         <Text component="small" style={{ color: "var(--pf-global--warning-color--200)" }}>
+                           This model has foreign workspace dependencies
+                         </Text>
+                       </FlexItem>
+                     </Flex>
+                   </DropdownItem>
+                 </Tooltip>
+               </>
+             )}
+             {!canContentBeDeployed && (
+               <>
+                 <Divider />
+                 <Tooltip
+                   content={
+                     "Models with errors or empty ones cannot be deployed. Check the Problems tab for more information."
+                   }
+                   position="bottom"
+                 >
+                   <DropdownItem icon={<ExclamationCircleIcon color="var(--pf-global--danger-color--100)" />} isDisabled>
+                     <Flex flexWrap={{ default: "nowrap" }}>
+                       <FlexItem>
+                         <Text component="small" style={{ color: "var(--pf-global--danger-color--300)" }}>
+                           This model cannot be deployed
+                         </Text>
+                       </FlexItem>
+                     </Flex>
+                   </DropdownItem>
+                 </Tooltip>
+               </>
+             )}
+           </FeatureDependentOnKieSandboxExtendedServices>
+         )}
+         {!isOpenShiftConnected && isKieSandboxExtendedServicesRunning && (
+           <>
+             <Divider />
+             <DropdownItem
+               id="deploy-setup-button"
+               key={`dropdown-deploy-setup`}
+               onClick={onSetup}
+               ouiaId={"setup-deploy-dropdown-button"}
+             >
+               <Button isInline={true} variant={ButtonVariant.link}>
+                 Setup...
+               </Button>
+             </DropdownItem>
+           </>
+         )}
+       </React.Fragment>,
+     ];
+   }, [
+     props.workspace,
+     onDeploy,
+     isKieSandboxExtendedServicesRunning,
+     isOpenShiftConnected,
+     canContentBeDeployed,
+     isUploadToDevModeEnabled,
+     onUploadDevMode,
+     needsDependencyDeployment,
+     i18n.deployments.virtualServiceRegistry.dependencyWarningTooltip,
+     onSetup,
+   ]);
+ }
diff --cc packages/serverless-logic-web-tools/src/home/sample/SampleCard.tsx
index aa81206b59,86e53b1dad..deed941efe
--- a/packages/serverless-logic-web-tools/src/home/sample/SampleCard.tsx
+++ b/packages/serverless-logic-web-tools/src/home/sample/SampleCard.tsx
@@@ -14,19 -14,19 +14,19 @@@
   * limitations under the License.
   */
  
 -import * as React from "react";
 -import { useMemo, useRef, useEffect } from "react";
 -import { Card, CardTitle, CardFooter, CardBody } from "@patternfly/react-core/dist/js/components/Card";
 -import { Grid, GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
 -import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
 -import { useRoutes } from "../../navigation/Hooks";
 -import { Link } from "react-router-dom";
 -import { Text } from "@patternfly/react-core/dist/js/components/Text";
 +import { Button, Modal, ModalVariant, Skeleton } from "@patternfly/react-core/dist/js";
 +import { Card, CardBody, CardTitle } from "@patternfly/react-core/dist/js/components/Card";
  import { Label, LabelProps } from "@patternfly/react-core/dist/js/components/Label";
 -import { FolderIcon, FileIcon, MonitoringIcon } from "@patternfly/react-icons/dist/js/icons";
+ import { Sample, SampleCategory } from "./SampleApi";
 +import { Text } from "@patternfly/react-core/dist/js/components/Text";
  import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
  import { Bullseye } from "@patternfly/react-core/dist/js/layouts/Bullseye";
 +import { Grid, GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
 +import { FileIcon, FolderIcon, MonitoringIcon, SearchPlusIcon } from "@patternfly/react-icons/dist/js/icons";
 +import * as React from "react";
 +import { useCallback, useEffect, useMemo, useState } from "react";
 +import { useHistory } from "react-router-dom";
 +import { useRoutes } from "../../navigation/Hooks";
- import { Sample, SampleCategory } from "./sampleApi";
  
  const tagMap: Record<SampleCategory, { label: string; icon: React.ComponentClass; color: LabelProps["color"] }> = {
    ["serverless-workflow"]: {
diff --cc packages/serverless-logic-web-tools/src/home/sample/SampleConstants.ts
index e956c766d7,b9cec21a1a..2a8a289605
--- a/packages/serverless-logic-web-tools/src/home/sample/SampleConstants.ts
+++ b/packages/serverless-logic-web-tools/src/home/sample/SampleConstants.ts
@@@ -14,17 -14,12 +14,14 @@@
   * limitations under the License.
   */
  
- import { TextEditor, WebView } from "vscode-extension-tester";
++export const SAMPLE_COVERS_CACHE_FILE_PATH = "/covers.json";
 +
- /**
-  * Helper class to easen work with swf text editor.
-  * Make sure you switch to the webview's frame before creating and instance
-  * via contructor.
-  */
- export default class SwfTextEditorTestHelper {
-   constructor(private readonly webview: WebView) {}
+ export const SAMPLES_FS_MOUNT_POINT_PREFIX = "lfs_v1__samples__";
+ 
+ export const SAMPLE_DEFINITIONS_CACHE_FILE_PATH = "/definitions.json";
+ 
+ export const SAMPLE_SEARCH_KEYS = ["definition.category", "definition.title", "definition.description"];
  
-   public async getSwfTextEditor(): Promise<TextEditor> {
-     return Promise.resolve(new TextEditor());
-   }
- }
+ export const resolveSampleFsMountPoint = (appVersion: string) => {
+   return `${SAMPLES_FS_MOUNT_POINT_PREFIX}${appVersion}`;
+ };
diff --cc packages/serverless-logic-web-tools/src/home/sample/SamplesCatalog.tsx
index 76258ddfb2,0000000000..619bd13d4a
mode 100644,000000..100644
--- a/packages/serverless-logic-web-tools/src/home/sample/SamplesCatalog.tsx
+++ b/packages/serverless-logic-web-tools/src/home/sample/SamplesCatalog.tsx
@@@ -1,309 -1,0 +1,309 @@@
 +/*
 + * Copyright 2023 Red Hat, Inc. and/or its affiliates.
 + *
 + * Licensed under the Apache License, Version 2.0 (the "License");
 + * you may not use this file except in compliance with the License.
 + * You may obtain a copy of the License at
 + *
 + *     http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing, software
 + * distributed under the License is distributed on an "AS IS" BASIS,
 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 + * See the License for the specific language governing permissions and
 + * limitations under the License.
 + */
 +
 +import { Pagination, PaginationVariant, PerPageOptions, Skeleton } from "@patternfly/react-core/dist/js";
 +import {
 +  Dropdown,
 +  DropdownItem,
 +  DropdownSeparator,
 +  DropdownToggle,
 +} from "@patternfly/react-core/dist/js/components/Dropdown";
 +import { EmptyState, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
 +import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
 +import { SearchInput } from "@patternfly/react-core/dist/js/components/SearchInput";
 +import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
 +import { Title } from "@patternfly/react-core/dist/js/components/Title";
 +import { Toolbar, ToolbarContent, ToolbarItem } from "@patternfly/react-core/dist/js/components/Toolbar";
 +import { Gallery } from "@patternfly/react-core/dist/js/layouts/Gallery";
 +import { CubesIcon } from "@patternfly/react-icons/dist/js/icons/cubes-icon";
 +import * as React from "react";
 +import { useCallback, useEffect, useMemo, useState } from "react";
 +import { useHistory, useLocation } from "react-router";
 +import { QueryParams } from "../../navigation/Routes";
 +import { setPageTitle } from "../../PageTitle";
 +import { useQueryParam } from "../../queryParams/QueryParamsContext";
 +import { FileLabel } from "../../workspace/components/FileLabel";
 +import { useSampleDispatch } from "./hooks/SampleContext";
- import { Sample, SampleCategories, SampleCategory, SampleCoversHashtable } from "./sampleApi";
++import { Sample, SampleCategories, SampleCategory, SampleCoversHashtable } from "./SampleApi";
 +import { SampleCard } from "./SampleCard";
 +import { SampleCardSkeleton } from "./SampleCardSkeleton";
 +import { SamplesLoadError } from "./SamplesLoadError";
 +
 +type SearchParams = { searchValue: string; category?: SampleCategory };
 +
 +const PAGE_TITLE = "Samples Catalog";
 +const SAMPLE_PRIORITY: Record<SampleCategory, number> = {
 +  ["serverless-workflow"]: 1,
 +  ["dashbuilder"]: 2,
 +  ["serverless-decision"]: 3,
 +};
 +
 +const LABEL_MAP: Record<SampleCategory, JSX.Element> = {
 +  ["serverless-workflow"]: <FileLabel extension="sw.yaml" labelProps={{ isCompact: true }} />,
 +  ["dashbuilder"]: <FileLabel extension="dash.yaml" labelProps={{ isCompact: true }} />,
 +  ["serverless-decision"]: <FileLabel extension="yard.yaml" labelProps={{ isCompact: true }} />,
 +};
 +
 +const ALL_CATEGORIES_LABEL = "All categories";
 +const CARDS_PER_PAGE = 9;
 +const CATEGORY_ARRAY = Object.keys(SAMPLE_PRIORITY) as SampleCategory[];
 +
 +export const SAMPLE_CARDS_PER_PAGE_OPTIONS: PerPageOptions[] = [
 +  {
 +    title: `${CARDS_PER_PAGE}`,
 +    value: CARDS_PER_PAGE,
 +  },
 +];
 +
 +export function SamplesCatalog() {
 +  const sampleDispatch = useSampleDispatch();
 +  const [loading, setLoading] = useState<boolean>(true);
 +  const [samples, setSamples] = useState<Sample[]>([]);
 +  const [sampleCovers, setSampleCovers] = useState<SampleCoversHashtable>({});
 +  const [sampleLoadingError, setSampleLoadingError] = useState("");
 +  const [searchFilter, setSearchFilter] = useState("");
 +  const [searchParams, setSearchParams] = useState<SearchParams | undefined>(undefined);
 +  const [page, setPage] = React.useState(1);
 +  const [isCategoryFilterDropdownOpen, setCategoryFilterDropdownOpen] = useState(false);
 +  const history = useHistory();
 +  const location = useLocation();
 +
 +  const categoryFilter = useQueryParam(QueryParams.SAMPLES_CATEGORY) as SampleCategory;
 +
 +  const visibleSamples = useMemo(
 +    () => samples.slice((page - 1) * CARDS_PER_PAGE, page * CARDS_PER_PAGE),
 +    [samples, page]
 +  );
 +
 +  const samplesCount = useMemo(() => samples.length, [samples]);
 +
 +  const filterResultMessage = useMemo(() => {
 +    if (samplesCount === 0) {
 +      return;
 +    }
 +    const isPlural = samplesCount > 1;
 +    return `Showing ${samplesCount} sample${isPlural ? "s" : ""}`;
 +  }, [samplesCount]);
 +
 +  const selectedCategory = useMemo(() => {
 +    if (categoryFilter) {
 +      return LABEL_MAP[categoryFilter];
 +    }
 +    return ALL_CATEGORIES_LABEL;
 +  }, [categoryFilter]);
 +
 +  const setCategoryFilter = useCallback(
 +    (category?: SampleCategory) => {
 +      const searchParams = new URLSearchParams(location.search);
 +      if (category) {
 +        searchParams.set(QueryParams.SAMPLES_CATEGORY, category);
 +      } else {
 +        searchParams.delete(QueryParams.SAMPLES_CATEGORY);
 +      }
 +      const newSearchString = searchParams.toString();
 +      history.push({ search: newSearchString });
 +    },
 +    [history, location]
 +  );
 +
 +  const onSearch = useCallback(
 +    async (args: SearchParams) => {
 +      if (searchParams && args.searchValue === searchParams.searchValue && args.category === searchParams.category) {
 +        return;
 +      }
 +      setSearchFilter(args.searchValue);
 +      setCategoryFilter(args.category);
 +      setSearchParams(args);
 +      setPage(1);
 +      setSamples(await sampleDispatch.getSamples({ searchFilter: args.searchValue, categoryFilter: args.category }));
 +    },
 +    [sampleDispatch, setCategoryFilter, searchParams]
 +  );
 +
 +  useEffect(() => {
 +    if (categoryFilter && !SampleCategories.includes(categoryFilter)) {
 +      setCategoryFilter(undefined);
 +      return;
 +    }
 +
 +    onSearch({ searchValue: searchFilter, category: categoryFilter });
 +  }, [categoryFilter, onSearch, searchFilter, setCategoryFilter]);
 +
 +  useEffect(() => {
 +    if (searchParams && searchFilter === searchParams.searchValue && categoryFilter === searchParams.category) {
 +      return;
 +    }
 +    setSearchParams({ searchValue: searchFilter, category: categoryFilter });
 +
 +    sampleDispatch
 +      .getSamples({ categoryFilter })
 +      .then((data) => {
 +        const sortedSamples = data.sort(
 +          (a: Sample, b: Sample) => SAMPLE_PRIORITY[a.definition.category] - SAMPLE_PRIORITY[b.definition.category]
 +        );
 +        setSamples([...sortedSamples]);
 +      })
 +      .catch((e) => {
 +        setSampleLoadingError(e.toString());
 +      })
 +      .finally(() => {
 +        setLoading(false);
 +      });
 +  }, [sampleDispatch, categoryFilter, searchFilter, searchParams]);
 +
 +  useEffect(() => {
 +    sampleDispatch.getSampleCovers({ samples: visibleSamples, prevState: sampleCovers }).then(setSampleCovers);
 +    // eslint-disable-next-line react-hooks/exhaustive-deps
 +  }, [visibleSamples, sampleDispatch]);
 +
 +  const categoryFilterDropdownItems = useMemo(
 +    () => [
 +      <DropdownItem
 +        key="category-filter-all-categories"
 +        onClick={() => onSearch({ searchValue: searchFilter, category: undefined })}
 +      >
 +        {ALL_CATEGORIES_LABEL}
 +      </DropdownItem>,
 +      <DropdownSeparator key="category-filter-separator" />,
 +      ...CATEGORY_ARRAY.map((category: SampleCategory) => (
 +        <DropdownItem
 +          key={`category-filter-${category}`}
 +          onClick={() => onSearch({ searchValue: searchFilter, category })}
 +        >
 +          {LABEL_MAP[category]}
 +        </DropdownItem>
 +      )),
 +    ],
 +    [onSearch, searchFilter]
 +  );
 +
 +  const onSetPage = useCallback((_e, v) => {
 +    setPage(v);
 +  }, []);
 +
 +  useEffect(() => {
 +    setPageTitle([PAGE_TITLE]);
 +  }, []);
 +
 +  return (
 +    <Page>
 +      <PageSection variant={"light"}>
 +        <TextContent>
 +          <Text component={TextVariants.h1}>{PAGE_TITLE}</Text>
 +          <Text component={TextVariants.p}>Try one of our samples to start defining your model.</Text>
 +        </TextContent>
 +        <Toolbar style={{ paddingBottom: "0" }}>
 +          <ToolbarContent style={{ paddingLeft: "0", paddingRight: "0", paddingBottom: "0" }}>
 +            <ToolbarItem variant="search-filter">
 +              <SearchInput
 +                value={""}
 +                type={"search"}
 +                onChange={(_ev, value) => onSearch({ searchValue: value, category: categoryFilter })}
 +                onClear={() => onSearch({ searchValue: "", category: categoryFilter })}
 +                onFocus={() => setCategoryFilterDropdownOpen(false)}
 +                placeholder={"Find samples"}
 +                style={{ width: "400px" }}
 +                onClick={(e) => {
 +                  e.stopPropagation();
 +                }}
 +              />
 +            </ToolbarItem>
 +            <ToolbarItem>
 +              <Dropdown
 +                style={{ backgroundColor: "white" }}
 +                onSelect={() => setCategoryFilterDropdownOpen(false)}
 +                dropdownItems={categoryFilterDropdownItems}
 +                toggle={
 +                  <DropdownToggle
 +                    id="category-filter-dropdown"
 +                    onToggle={(isOpen: boolean) => setCategoryFilterDropdownOpen(isOpen)}
 +                  >
 +                    {selectedCategory}
 +                  </DropdownToggle>
 +                }
 +                isOpen={isCategoryFilterDropdownOpen}
 +              />
 +            </ToolbarItem>
 +            <ToolbarItem>
 +              {filterResultMessage && (
 +                <TextContent>
 +                  <Text>{filterResultMessage}</Text>
 +                </TextContent>
 +              )}
 +            </ToolbarItem>
 +            <ToolbarItem variant="pagination">
 +              {loading && <Skeleton width="200px" />}
 +              {!loading && (
 +                <Pagination
 +                  isCompact
 +                  itemCount={samplesCount}
 +                  onSetPage={onSetPage}
 +                  page={page}
 +                  perPage={CARDS_PER_PAGE}
 +                  perPageOptions={SAMPLE_CARDS_PER_PAGE_OPTIONS}
 +                  variant="top"
 +                />
 +              )}
 +            </ToolbarItem>
 +          </ToolbarContent>
 +        </Toolbar>
 +      </PageSection>
 +
 +      <PageSection isFilled>
 +        {sampleLoadingError && <SamplesLoadError errors={[sampleLoadingError]} />}
 +        {!sampleLoadingError && (
 +          <>
 +            {loading && <SampleCardSkeleton numberOfCards={6} />}
 +            {!loading && samplesCount === 0 && (
 +              <PageSection variant={"light"} isFilled={true} style={{ marginRight: "25px" }}>
 +                <EmptyState style={{ height: "350px" }}>
 +                  <EmptyStateIcon icon={CubesIcon} />
 +                  <Title headingLevel="h4" size="lg">
 +                    {"None of the available samples matched this search"}
 +                  </Title>
 +                </EmptyState>
 +              </PageSection>
 +            )}
 +            {!loading && samplesCount > 0 && (
 +              <>
 +                <Gallery hasGutter={true} minWidths={{ sm: "calc(100%/3.1 - 16px)", default: "100%" }}>
 +                  {visibleSamples.map((sample) => (
 +                    <SampleCard
 +                      sample={sample}
 +                      key={`sample-${sample.sampleId}`}
 +                      cover={sampleCovers[sample.sampleId]}
 +                    />
 +                  ))}
 +                </Gallery>
 +                <br />
 +                <Pagination
 +                  itemCount={samplesCount}
 +                  onSetPage={onSetPage}
 +                  page={page}
 +                  perPage={CARDS_PER_PAGE}
 +                  perPageComponent="button"
 +                  perPageOptions={SAMPLE_CARDS_PER_PAGE_OPTIONS}
 +                  variant={PaginationVariant.bottom}
 +                  widgetId="bottom-example"
 +                />
 +              </>
 +            )}
 +          </>
 +        )}
 +      </PageSection>
 +    </Page>
 +  );
 +}
diff --cc packages/serverless-logic-web-tools/src/home/sample/hooks/SampleContext.tsx
index 65204accd1,ad3357cf41..6a197f141f
--- a/packages/serverless-logic-web-tools/src/home/sample/hooks/SampleContext.tsx
+++ b/packages/serverless-logic-web-tools/src/home/sample/hooks/SampleContext.tsx
@@@ -20,21 -20,11 +20,23 @@@ import { LocalFile } from "@kie-tools-c
  import * as React from "react";
  import { useContext, useMemo, useCallback, useState } from "react";
  import { useSettingsDispatch } from "../../../settings/SettingsContext";
 -import { fetchSampleDefinitions, fetchSampleFiles, Sample, SampleCategory } from "../SampleApi";
 +import {
 +  fetchSampleCover,
 +  fetchSampleDefinitions,
 +  fetchSampleFiles,
 +  Sample,
 +  SampleCategory,
 +  SampleCoversHashtable,
- } from "../sampleApi";
++} from "../SampleApi";
  import { decoder, encoder } from "@kie-tools-core/workspaces-git-fs/dist/encoderdecoder/EncoderDecoder";
  import Fuse from "fuse.js";
- 
- const SAMPLE_DEFINITIONS_CACHE_FILE_PATH = "/definitions.json";
- const SAMPLE_COVERS_CACHE_FILE_PATH = "/covers.json";
- const SAMPLES_FS_MOUNT_POINT = `lfs_v1__samples__${process.env.WEBPACK_REPLACE__version!}`;
- const SEARCH_KEYS = ["definition.category", "definition.title", "definition.description"];
 -import { SAMPLE_DEFINITIONS_CACHE_FILE_PATH, SAMPLE_SEARCH_KEYS, resolveSampleFsMountPoint } from "../SampleConstants";
++import {
++  SAMPLE_DEFINITIONS_CACHE_FILE_PATH,
++  SAMPLE_SEARCH_KEYS,
++  resolveSampleFsMountPoint,
++  SAMPLE_COVERS_CACHE_FILE_PATH,
++} from "../SampleConstants";
+ import { useEnv } from "../../../env/EnvContext";
  
  export interface SampleDispatchContextType {
    getSamples(args: { categoryFilter?: SampleCategory; searchFilter?: string }): Promise<Sample[]>;
diff --cc packages/serverless-logic-web-tools/src/homepage/recentModels/RecentModels.tsx
index c7f3120d85,0000000000..51c3119e31
mode 100644,000000..100644
--- a/packages/serverless-logic-web-tools/src/homepage/recentModels/RecentModels.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/recentModels/RecentModels.tsx
@@@ -1,267 -1,0 +1,263 @@@
 +/*
 + * Copyright 2023 Red Hat, Inc. and/or its affiliates.
 + *
 + * Licensed under the Apache License, Version 2.0 (the "License");
 + * you may not use this file except in compliance with the License.
 + * You may obtain a copy of the License at
 + *
 + *       http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing, software
 + * distributed under the License is distributed on an "AS IS" BASIS,
 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 + * See the License for the specific language governing permissions and
 + * limitations under the License.
 + */
 +
 +import { PromiseStateWrapper } from "@kie-tools-core/react-hooks/dist/PromiseState";
 +import { useController } from "@kie-tools-core/react-hooks/dist/useController";
 +import { useWorkspaces } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
 +import { useWorkspaceDescriptorsPromise } from "@kie-tools-core/workspaces-git-fs/dist/hooks/WorkspacesHooks";
 +import { WorkspaceDescriptor } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/WorkspaceDescriptor";
 +import { Alert, AlertActionCloseButton } from "@patternfly/react-core/dist/js/components/Alert";
 +import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
 +import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
 +import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
 +import { Title } from "@patternfly/react-core/dist/js/components/Title";
 +import { Bullseye } from "@patternfly/react-core/dist/js/layouts/Bullseye";
 +import { CubesIcon } from "@patternfly/react-icons/dist/js/icons/cubes-icon";
 +import * as React from "react";
 +import { useCallback, useEffect, useMemo, useState } from "react";
- import { Alerts, AlertsController, useAlert } from "../../alerts/Alerts";
++import { useGlobalAlert } from "../../alerts/GlobalAlertsContext";
 +import { splitFiles } from "../../extension";
 +import { setPageTitle } from "../../PageTitle";
 +import { ConfirmDeleteModal } from "../../table/ConfirmDeleteModal";
 +import { defaultPerPageOptions, TablePagination } from "../../table/TablePagination";
 +import { TableToolbar } from "../../table/TableToolbar";
 +import { WorkspacesTable } from "./WorkspacesTable";
 +
 +const PAGE_TITLE = "Recent models";
 +
 +export function RecentModels() {
 +  const workspaceDescriptorsPromise = useWorkspaceDescriptorsPromise();
 +  const [selectedWorkspaceIds, setSelectedWorkspaceIds] = useState<WorkspaceDescriptor["workspaceId"][]>([]);
 +  const [isConfirmDeleteModalOpen, setIsConfirmDeleteModalOpen] = useState(false);
 +  const [searchValue, setSearchValue] = React.useState("");
 +  const [page, setPage] = React.useState(1);
 +  const [perPage, setPerPage] = React.useState(5);
 +  const workspaces = useWorkspaces();
 +  const [selectedFoldersCount, setSelectedFoldersCount] = useState(0);
 +  const [firstSelectedWorkspaceName, setFirstSelectedWorkspaceName] = useState("");
 +  const [deleteModalDataLoaded, setDeleteModalDataLoaded] = useState(false);
 +  const [deleteModalFetchError, setDeleteModalFetchError] = useState(false);
-   const [alerts, alertsRef] = useController<AlertsController>();
 +  const isSelectedWorkspacePlural = useMemo(() => selectedWorkspaceIds.length > 1, [selectedWorkspaceIds]);
 +
 +  const selectedElementTypesName = useMemo(() => {
 +    if (selectedWorkspaceIds.length > 1) {
 +      return selectedFoldersCount ? "workspaces" : "models";
 +    }
 +    return selectedFoldersCount ? "workspace" : "model";
 +  }, [selectedFoldersCount, selectedWorkspaceIds]);
 +
 +  const deleteModalMessage = useMemo(
 +    () => (
 +      <>
 +        Deleting {isSelectedWorkspacePlural ? "these" : "this"}{" "}
 +        <b>{isSelectedWorkspacePlural ? selectedWorkspaceIds.length : firstSelectedWorkspaceName}</b>{" "}
 +        {selectedElementTypesName}
 +        {selectedFoldersCount ? ` removes the ${selectedElementTypesName} and all the models inside.` : "."}
 +      </>
 +    ),
 +    [
 +      isSelectedWorkspacePlural,
 +      selectedWorkspaceIds,
 +      firstSelectedWorkspaceName,
 +      selectedElementTypesName,
 +      selectedFoldersCount,
 +    ]
 +  );
 +
 +  const onConfirmDeleteModalClose = useCallback(() => setIsConfirmDeleteModalOpen(false), []);
 +
-   const deleteSuccessAlert = useAlert<{ modelsWord: string }>(
-     alerts,
++  const deleteSuccessAlert = useGlobalAlert<{ modelsWord: string }>(
 +    useCallback(({ close }, { modelsWord }) => {
 +      return <Alert variant="success" title={`${capitalizeString(modelsWord)} deleted successfully`} />;
 +    }, []),
 +    { durationInSeconds: 2 }
 +  );
 +
-   const deleteErrorAlert = useAlert<{ modelsWord: string }>(
-     alerts,
++  const deleteErrorAlert = useGlobalAlert<{ modelsWord: string }>(
 +    useCallback(({ close }, { modelsWord }) => {
 +      return (
 +        <Alert
 +          variant="danger"
 +          title={`Oops, something went wrong while trying to delete the selected ${modelsWord}. Please refresh the page and try again. If the problem persists, you can try deleting site data for this application in your browser's settings.`}
 +          actionClose={<AlertActionCloseButton onClose={close} />}
 +        />
 +      );
 +    }, [])
 +  );
 +
 +  const onConfirmDeleteModalDelete = useCallback(
 +    async (workspaceDescriptors: WorkspaceDescriptor[]) => {
 +      const modelsWord = selectedWorkspaceIds.length > 1 ? "Models" : "Model";
 +      setIsConfirmDeleteModalOpen(false);
 +
 +      Promise.all(
 +        workspaceDescriptors
 +          .filter((w) => selectedWorkspaceIds.includes(w.workspaceId))
 +          .map((w) => workspaces.deleteWorkspace(w))
 +      )
 +        .then(() => {
 +          deleteSuccessAlert.show({ modelsWord });
 +        })
 +        .catch((e) => {
 +          console.error(e);
 +          deleteErrorAlert.show({ modelsWord });
 +        })
 +        .finally(() => {
 +          setSelectedWorkspaceIds([]);
 +        });
 +    },
 +    [selectedWorkspaceIds, workspaces, deleteErrorAlert, deleteSuccessAlert]
 +  );
 +
 +  const onWsToggle = useCallback((workspaceId: WorkspaceDescriptor["workspaceId"], checked: boolean) => {
 +    setSelectedWorkspaceIds((prevSelected) => {
 +      const otherSelectedIds = prevSelected.filter((r) => r !== workspaceId);
 +      return checked ? [...otherSelectedIds, workspaceId] : otherSelectedIds;
 +    });
 +  }, []);
 +
 +  const onToggleAllElements = useCallback((checked: boolean, workspaceDescriptors: WorkspaceDescriptor[]) => {
 +    setSelectedWorkspaceIds(checked ? workspaceDescriptors.map((e) => e.workspaceId) : []);
 +  }, []);
 +
 +  const onClearFilters = useCallback(() => {
 +    setSearchValue("");
 +  }, []);
 +
 +  const isWsFolder = useCallback(
 +    async (workspaceId: WorkspaceDescriptor["workspaceId"]) => {
 +      const { editableFiles, readonlyFiles } = splitFiles(await workspaces.getFiles({ workspaceId }));
 +      return editableFiles.length > 1 || readonlyFiles.length > 0;
 +    },
 +    [workspaces]
 +  );
 +
 +  const getWorkspaceName = useCallback(
 +    async (workspaceId: WorkspaceDescriptor["workspaceId"]) => {
 +      if (selectedWorkspaceIds.length !== 1) {
 +        return "";
 +      }
 +      const workspaceData = await workspaces.getWorkspace({ workspaceId });
 +      return (await isWsFolder(workspaceId))
 +        ? workspaceData.name
 +        : (await workspaces.getFiles({ workspaceId }))[0].nameWithoutExtension;
 +    },
 +    [isWsFolder, selectedWorkspaceIds, workspaces]
 +  );
 +
 +  useEffect(() => {
 +    Promise.all([
 +      Promise.all(selectedWorkspaceIds.map(isWsFolder)).then((results) => {
 +        const foldersCount = results.filter((r) => r).length;
 +        setSelectedFoldersCount(foldersCount);
 +      }),
 +      getWorkspaceName(selectedWorkspaceIds[0]).then(setFirstSelectedWorkspaceName),
 +    ])
 +      .then(() => setDeleteModalDataLoaded(true))
 +      .catch(() => setDeleteModalFetchError(true));
 +  }, [getWorkspaceName, selectedWorkspaceIds, isWsFolder]);
 +
 +  useEffect(() => {
 +    setPageTitle([PAGE_TITLE]);
 +  }, []);
 +
 +  return (
 +    <PromiseStateWrapper
 +      promise={workspaceDescriptorsPromise}
 +      rejected={(e) => <>Error fetching workspaces: {e + ""}</>}
 +      resolved={(workspaceDescriptors: WorkspaceDescriptor[]) => {
 +        const itemCount = workspaceDescriptors.length;
 +
 +        return (
 +          <>
-             <Alerts ref={alertsRef} width={"500px"} />
 +            <Page>
 +              <PageSection variant={"light"}>
 +                <TextContent>
 +                  <Text component={TextVariants.h1}>{PAGE_TITLE}</Text>
 +                  <Text component={TextVariants.p}>
 +                    Use your recent models from GitHub Repository, a GitHub Gist or saved in your browser.
 +                  </Text>
 +                </TextContent>
 +              </PageSection>
 +
 +              <PageSection isFilled aria-label="workspaces-table-section">
 +                <PageSection variant={"light"} padding={{ default: "noPadding" }}>
 +                  {itemCount > 0 && (
 +                    <>
 +                      <TableToolbar
 +                        itemCount={itemCount}
 +                        onDeleteActionButtonClick={() => setIsConfirmDeleteModalOpen(true)}
 +                        onToggleAllElements={(checked) => onToggleAllElements(checked, workspaceDescriptors)}
 +                        searchValue={searchValue}
 +                        selectedElementsCount={selectedWorkspaceIds.length}
 +                        setSearchValue={setSearchValue}
 +                        page={page}
 +                        perPage={perPage}
 +                        perPageOptions={defaultPerPageOptions}
 +                        setPage={setPage}
 +                        setPerPage={setPerPage}
 +                      />
 +                      <WorkspacesTable
 +                        page={page}
 +                        perPage={perPage}
 +                        onClearFilters={onClearFilters}
 +                        onWsToggle={onWsToggle}
 +                        searchValue={searchValue}
 +                        selectedWorkspaceIds={selectedWorkspaceIds}
 +                        workspaceDescriptors={workspaceDescriptors}
 +                      />
 +                      <TablePagination
 +                        itemCount={itemCount}
 +                        page={page}
 +                        perPage={perPage}
 +                        perPageOptions={defaultPerPageOptions}
 +                        setPage={setPage}
 +                        setPerPage={setPerPage}
 +                        variant="bottom"
 +                      />
 +                    </>
 +                  )}
 +                  {workspaceDescriptors.length === 0 && (
 +                    <Bullseye>
 +                      <EmptyState>
 +                        <EmptyStateIcon icon={CubesIcon} />
 +                        <Title headingLevel="h4" size="lg">
 +                          {`Nothing here`}
 +                        </Title>
 +                        <EmptyStateBody>{`Start by adding a new model`}</EmptyStateBody>
 +                      </EmptyState>
 +                    </Bullseye>
 +                  )}
 +                </PageSection>
 +              </PageSection>
 +            </Page>
 +            <ConfirmDeleteModal
 +              isOpen={isConfirmDeleteModalOpen}
 +              onClose={onConfirmDeleteModalClose}
 +              onDelete={() => onConfirmDeleteModalDelete(workspaceDescriptors)}
 +              elementsTypeName={selectedElementTypesName}
 +              deleteMessage={deleteModalMessage}
 +              dataLoaded={deleteModalDataLoaded}
 +              fetchError={deleteModalFetchError}
 +            />
 +          </>
 +        );
 +      }}
 +    />
 +  );
 +}
 +
 +const capitalizeString = (value: string) => value.charAt(0).toUpperCase() + value.slice(1);
diff --cc packages/serverless-logic-web-tools/src/homepage/recentModels/workspaceFiles/WorkspaceFiles.tsx
index 9829c9dd3f,0000000000..01438e496f
mode 100644,000000..100644
--- a/packages/serverless-logic-web-tools/src/homepage/recentModels/workspaceFiles/WorkspaceFiles.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/recentModels/workspaceFiles/WorkspaceFiles.tsx
@@@ -1,307 -1,0 +1,302 @@@
 +/*
 + * Copyright 2023 Red Hat, Inc. and/or its affiliates.
 + *
 + * Licensed under the Apache License, Version 2.0 (the "License");
 + * you may not use this file except in compliance with the License.
 + * You may obtain a copy of the License at
 + *
 + *       http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing, software
 + * distributed under the License is distributed on an "AS IS" BASIS,
 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 + * See the License for the specific language governing permissions and
 + * limitations under the License.
 + */
 +
 +import { PromiseStateWrapper } from "@kie-tools-core/react-hooks/dist/PromiseState";
 +import { useController } from "@kie-tools-core/react-hooks/dist/useController";
 +import { useWorkspaces, WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
 +import { useWorkspacePromise } from "@kie-tools-core/workspaces-git-fs/dist/hooks/WorkspaceHooks";
 +import { ActiveWorkspace } from "@kie-tools-core/workspaces-git-fs/dist/model/ActiveWorkspace";
 +import { Breadcrumb } from "@patternfly/react-core/components/Breadcrumb";
 +import { BreadcrumbItem, Checkbox, Dropdown, DropdownToggle, ToolbarItem } from "@patternfly/react-core/dist/js";
 +import { Alert, AlertActionCloseButton } from "@patternfly/react-core/dist/js/components/Alert";
 +import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
 +import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
 +import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
 +import { Title } from "@patternfly/react-core/dist/js/components/Title";
 +import { Bullseye } from "@patternfly/react-core/dist/js/layouts/Bullseye";
 +import { CaretDownIcon, PlusIcon } from "@patternfly/react-icons/dist/js/icons";
 +import { CubesIcon } from "@patternfly/react-icons/dist/js/icons/cubes-icon";
 +import * as React from "react";
 +import { useCallback, useEffect, useMemo, useState } from "react";
 +import { useHistory } from "react-router";
- import { Alerts, AlertsController, useAlert } from "../../../alerts/Alerts";
++import { useGlobalAlert } from "../../../alerts/GlobalAlertsContext";
 +import { NewFileDropdownMenu } from "../../../editor/NewFileDropdownMenu";
 +import { splitFiles } from "../../../extension";
 +import { routes } from "../../../navigation/Routes";
 +import { setPageTitle } from "../../../PageTitle";
 +import { ConfirmDeleteModal } from "../../../table/ConfirmDeleteModal";
 +import { defaultPerPageOptions, TablePagination } from "../../../table/TablePagination";
 +import { TableToolbar } from "../../../table/TableToolbar";
 +import { WorkspaceFilesTable } from "./WorkspaceFilesTable";
 +
 +export interface Props {
 +  workspaceId: string;
 +}
 +
 +export function WorkspaceFiles(props: Props) {
 +  const { workspaceId } = props;
 +  const workspacePromise = useWorkspacePromise(workspaceId);
 +  const [selectedWorkspaceFiles, setSelectedWorkspaceFiles] = useState<WorkspaceFile[]>([]);
 +  const [isConfirmDeleteModalOpen, setIsConfirmDeleteModalOpen] = useState(false);
 +  const [searchValue, setSearchValue] = React.useState("");
 +  const [page, setPage] = React.useState(1);
 +  const [perPage, setPerPage] = React.useState(5);
 +  const [isViewRoFilesChecked, setIsViewRoFilesChecked] = useState(false);
 +  const [isNewFileDropdownMenuOpen, setNewFileDropdownMenuOpen] = useState(false);
 +  const workspaces = useWorkspaces();
 +  const history = useHistory();
-   const [alerts, alertsRef] = useController<AlertsController>();
 +  const isSelectedWorkspaceFilesPlural = useMemo(() => selectedWorkspaceFiles.length > 1, [selectedWorkspaceFiles]);
 +  const selectedElementTypesName = useMemo(
 +    () => (isSelectedWorkspaceFilesPlural ? "files" : "file"),
 +    [isSelectedWorkspaceFilesPlural]
 +  );
 +
 +  const deleteModalMessage = useMemo(
 +    () => (
 +      <>
 +        Deleting {isSelectedWorkspaceFilesPlural ? "these" : "this"}{" "}
 +        <b>{isSelectedWorkspaceFilesPlural ? selectedWorkspaceFiles.length : selectedWorkspaceFiles[0]?.name}</b>{" "}
 +        {selectedElementTypesName}
 +      </>
 +    ),
 +    [isSelectedWorkspaceFilesPlural, selectedWorkspaceFiles, selectedElementTypesName]
 +  );
 +
 +  const onConfirmDeleteModalClose = useCallback(() => setIsConfirmDeleteModalOpen(false), []);
 +
-   const deleteSuccessAlert = useAlert<{ selectedElementTypesName: string }>(
-     alerts,
++  const deleteSuccessAlert = useGlobalAlert<{ selectedElementTypesName: string }>(
 +    useCallback(({ close }, { selectedElementTypesName }) => {
 +      return <Alert variant="success" title={`${capitalizeString(selectedElementTypesName)} deleted successfully`} />;
 +    }, []),
 +    { durationInSeconds: 2 }
 +  );
 +
-   const deleteErrorAlert = useAlert<{ selectedElementTypesName: string }>(
-     alerts,
++  const deleteErrorAlert = useGlobalAlert<{ selectedElementTypesName: string }>(
 +    useCallback(({ close }, { selectedElementTypesName }) => {
 +      return (
 +        <Alert
 +          variant="danger"
 +          title={`Oops, something went wrong while trying to delete the selected ${selectedElementTypesName}. Please refresh the page and try again. If the problem persists, you can try deleting site data for this application in your browser's settings.`}
 +          actionClose={<AlertActionCloseButton onClose={close} />}
 +        />
 +      );
 +    }, [])
 +  );
 +
 +  const onConfirmDeleteModalDelete = useCallback(
 +    async (totalFilesCount: number) => {
 +      setIsConfirmDeleteModalOpen(false);
 +
 +      if (selectedWorkspaceFiles.length === totalFilesCount) {
 +        workspaces.deleteWorkspace({ workspaceId });
 +        history.push({ pathname: routes.recentModels.path({}) });
 +        deleteSuccessAlert.show({ selectedElementTypesName });
 +        return;
 +      }
 +
 +      Promise.all(selectedWorkspaceFiles.map((file) => workspaces.deleteFile({ file })))
 +        .then(() => {
 +          deleteSuccessAlert.show({ selectedElementTypesName });
 +        })
 +        .catch((e) => {
 +          console.error(e);
 +          deleteErrorAlert.show({ selectedElementTypesName });
 +        })
 +        .finally(() => {
 +          setSelectedWorkspaceFiles([]);
 +        });
 +    },
 +    [
 +      selectedWorkspaceFiles,
 +      workspaces,
 +      history,
 +      workspaceId,
 +      deleteErrorAlert,
 +      deleteSuccessAlert,
 +      selectedElementTypesName,
 +    ]
 +  );
 +
 +  const onFileToggle = useCallback((workspaceFile: WorkspaceFile, checked: boolean) => {
 +    setSelectedWorkspaceFiles((prevSelected) => {
 +      const otherSelectedFiles = [...prevSelected.filter((f) => f !== workspaceFile)];
 +      return checked ? [...otherSelectedFiles, workspaceFile] : otherSelectedFiles;
 +    });
 +  }, []);
 +
 +  const onToggleAllElements = useCallback((checked: boolean, files: WorkspaceFile[]) => {
 +    setSelectedWorkspaceFiles(checked ? files : []);
 +  }, []);
 +
 +  const handleViewRoCheckboxChange = useCallback((checked: boolean) => {
 +    setIsViewRoFilesChecked(checked);
 +  }, []);
 +
 +  useEffect(() => {
 +    setSelectedWorkspaceFiles([]);
 +  }, [workspacePromise]);
 +
 +  return (
 +    <PromiseStateWrapper
 +      promise={workspacePromise}
 +      rejected={(e) => <>Error fetching workspaces: {e + ""}</>}
 +      resolved={(workspace: ActiveWorkspace) => {
 +        const allFiles = splitFiles(workspace.files);
 +        const isViewRoFilesDisabled = !allFiles.editableFiles.length || !allFiles.readonlyFiles.length;
 +        const isViewRoFilesCheckedInternal = isViewRoFilesDisabled ? true : isViewRoFilesChecked;
 +        const files = [...allFiles.editableFiles, ...(isViewRoFilesCheckedInternal ? allFiles.readonlyFiles : [])];
 +        const filesCount = files.length;
 +        const allFilesCount = workspace.files.length;
 +
 +        setPageTitle([workspace.descriptor.name]);
 +
 +        return (
 +          <>
-             <Alerts ref={alertsRef} width={"500px"} />
 +            <Page
 +              breadcrumb={
 +                <Breadcrumb>
 +                  <BreadcrumbItem to={"#" + routes.recentModels.path({})}>Recent Models</BreadcrumbItem>
 +                  <BreadcrumbItem to="#" isActive>
 +                    {workspace.descriptor.name}
 +                  </BreadcrumbItem>
 +                </Breadcrumb>
 +              }
 +            >
 +              <PageSection variant={"light"}>
 +                <TextContent>
 +                  <Text component={TextVariants.h1}>Files in &lsquo;{workspace.descriptor.name}&rsquo;</Text>
 +                  <Text component={TextVariants.p}>
 +                    Use your recent models from GitHub Repository, a GitHub Gist or saved in your browser.
 +                  </Text>
 +                </TextContent>
 +              </PageSection>
 +
 +              <PageSection isFilled aria-label="workspaces-table-section">
 +                <PageSection variant={"light"} padding={{ default: "noPadding" }}>
 +                  {filesCount > 0 && (
 +                    <>
 +                      <TableToolbar
 +                        itemCount={filesCount}
 +                        onDeleteActionButtonClick={() => setIsConfirmDeleteModalOpen(true)}
 +                        onToggleAllElements={(checked) => onToggleAllElements(checked, files)}
 +                        searchValue={searchValue}
 +                        selectedElementsCount={selectedWorkspaceFiles.length}
 +                        setSearchValue={setSearchValue}
 +                        page={page}
 +                        perPage={perPage}
 +                        perPageOptions={defaultPerPageOptions}
 +                        setPage={setPage}
 +                        setPerPage={setPerPage}
 +                        additionalComponents={
 +                          <>
 +                            <ToolbarItem>
 +                              <Dropdown
 +                                position={"right"}
 +                                isOpen={isNewFileDropdownMenuOpen}
 +                                toggle={
 +                                  <DropdownToggle
 +                                    onToggle={setNewFileDropdownMenuOpen}
 +                                    toggleIndicator={CaretDownIcon}
 +                                    toggleVariant="primary"
 +                                  >
 +                                    <PlusIcon />
 +                                    &nbsp;&nbsp;New file
 +                                  </DropdownToggle>
 +                                }
 +                              >
 +                                <NewFileDropdownMenu
-                                   alerts={alerts}
 +                                  workspaceId={workspaceId}
 +                                  destinationDirPath={""}
 +                                  onAddFile={async (file) => {
 +                                    setNewFileDropdownMenuOpen(false);
 +                                    if (!file) {
 +                                      return;
 +                                    }
 +
 +                                    history.push({
 +                                      pathname: routes.workspaceWithFilePath.path({
 +                                        workspaceId: file.workspaceId,
 +                                        fileRelativePath: file.relativePathWithoutExtension,
 +                                        extension: file.extension,
 +                                      }),
 +                                    });
 +                                  }}
 +                                />
 +                              </Dropdown>
 +                            </ToolbarItem>
 +                            <ToolbarItem>
 +                              <Checkbox
 +                                id="viewRoFiles"
 +                                label="View readonly files"
 +                                isChecked={isViewRoFilesCheckedInternal}
 +                                isDisabled={isViewRoFilesDisabled}
 +                                onChange={handleViewRoCheckboxChange}
 +                              ></Checkbox>
 +                            </ToolbarItem>
 +                          </>
 +                        }
 +                      />
 +
 +                      <WorkspaceFilesTable
 +                        page={page}
 +                        perPage={perPage}
 +                        onFileToggle={onFileToggle}
 +                        searchValue={searchValue}
 +                        selectedWorkspaceFiles={selectedWorkspaceFiles}
 +                        totalFilesCount={allFilesCount}
 +                        workspaceFiles={files}
 +                      />
 +
 +                      <TablePagination
 +                        itemCount={filesCount}
 +                        page={page}
 +                        perPage={perPage}
 +                        perPageOptions={defaultPerPageOptions}
 +                        setPage={setPage}
 +                        setPerPage={setPerPage}
 +                        variant="bottom"
 +                      />
 +                    </>
 +                  )}
 +                  {files.length === 0 && (
 +                    <Bullseye>
 +                      <EmptyState>
 +                        <EmptyStateIcon icon={CubesIcon} />
 +                        <Title headingLevel="h4" size="lg">
 +                          {`Nothing here`}
 +                        </Title>
 +                        <EmptyStateBody>{`Start by adding a new model`}</EmptyStateBody>
 +                      </EmptyState>
 +                    </Bullseye>
 +                  )}
 +                </PageSection>
 +              </PageSection>
 +            </Page>
 +            <ConfirmDeleteModal
 +              isOpen={isConfirmDeleteModalOpen}
 +              onClose={onConfirmDeleteModalClose}
 +              onDelete={() => onConfirmDeleteModalDelete(workspace.files.length)}
 +              elementsTypeName={selectedElementTypesName}
 +              deleteMessage={deleteModalMessage}
 +            />
 +          </>
 +        );
 +      }}
 +    />
 +  );
 +}
 +
 +const capitalizeString = (value: string) => value.charAt(0).toUpperCase() + value.slice(1);
diff --cc packages/serverless-logic-web-tools/src/openshift/dropdown/OpenshiftDeploymentsDropdown.tsx
index ae3746a328,9ec9127921..caa87e3bde
--- a/packages/serverless-logic-web-tools/src/openshift/dropdown/OpenshiftDeploymentsDropdown.tsx
+++ b/packages/serverless-logic-web-tools/src/openshift/dropdown/OpenshiftDeploymentsDropdown.tsx
@@@ -29,14 -29,28 +29,30 @@@ import { useSettings, useSettingsDispat
  import { useOpenShift } from "../OpenShiftContext";
  import { OpenShiftDeploymentDropdownItem } from "./OpenShiftDeploymentDropdownItem";
  import { OpenShiftInstanceStatus } from "../OpenShiftInstanceStatus";
+ import { WebToolsOpenShiftDeployedModel } from "../deploy/types";
+ import { useEnv } from "../../env/EnvContext";
+ import { PromiseStateStatus, useLivePromiseState } from "@kie-tools-core/react-hooks/dist/PromiseState";
+ import { useDevModeDispatch } from "../swfDevMode/DevModeContext";
+ import { Skeleton } from "@patternfly/react-core/dist/js/components/Skeleton";
+ import { Holder } from "@kie-tools-core/react-hooks/dist/Holder";
+ import { Flex } from "@patternfly/react-core/dist/js/layouts/Flex";
+ import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
+ import { Divider } from "@patternfly/react-core/dist/js/components/Divider";
 +import { routes } from "../../navigation/Routes";
 +import { useHistory } from "react-router";
  
+ const REFRESH_COUNTDOWN_INITIAL_VALUE_IN_SECONDS = 20;
+ 
  export function OpenshiftDeploymentsDropdown() {
+   const { env } = useEnv();
    const settings = useSettings();
    const settingsDispatch = useSettingsDispatch();
    const openshift = useOpenShift();
+   const devModeDispatch = useDevModeDispatch();
+   const [refreshCountdownInSeconds, setRefreshCountdownInSeconds] = useState(
+     REFRESH_COUNTDOWN_INITIAL_VALUE_IN_SECONDS
+   );
 +  const history = useHistory();
  
    const isConnected = useMemo(
      () => settings.openshift.status === OpenShiftInstanceStatus.CONNECTED,
@@@ -44,28 -58,71 +60,71 @@@
    );
  
    const openOpenShiftSettings = useCallback(() => {
 -    settingsDispatch.open(SettingsTabs.OPENSHIFT);
 -  }, [settingsDispatch]);
 +    history.push(routes.settings.openshift.path({}));
 +  }, [history]);
  
-   const items = useMemo(() => {
-     const common = isConnected
-       ? [
-           <DropdownItem
-             key={"dropdown-openshift-setup-as"}
-             component={"button"}
-             onClick={openOpenShiftSettings}
-             ouiaId={"setup-as-openshift-dropdown-button"}
-             description={"Change..."}
-           >
-             {`Connected to ${settings.openshift.config.namespace}`}
-           </DropdownItem>,
-           <DropdownSeparator key={"dropdown-openshift-separator-deployments-2"} />,
-         ]
-       : [];
- 
-     if (openshift.deployments.length === 0) {
+   const [deployments, refresh] = useLivePromiseState<WebToolsOpenShiftDeployedModel[]>(
+     useMemo(() => {
+       if (settings.openshift.status !== OpenShiftInstanceStatus.CONNECTED) {
+         return { error: "Can't load deployments." };
+       }
+       return async () => {
+         setRefreshCountdownInSeconds(REFRESH_COUNTDOWN_INITIAL_VALUE_IN_SECONDS);
+         const res = await Promise.all([openshift.loadDeployments(), devModeDispatch.loadDeployments()]);
+         return res.flat();
+       };
+     }, [devModeDispatch, openshift, settings.openshift.status])
+   );
+ 
+   useEffect(() => {
+     if (deployments.status === PromiseStateStatus.PENDING) {
+       return;
+     }
+ 
+     const interval = window.setInterval(() => {
+       setRefreshCountdownInSeconds((prev) => prev - 1);
+     }, 1000);
+ 
+     return () => {
+       window.clearInterval(interval);
+     };
+   }, [deployments.status]);
+ 
+   useEffect(() => {
+     if (refreshCountdownInSeconds > 0) {
+       return;
+     }
+     refresh(new Holder(false));
+   }, [refresh, refreshCountdownInSeconds]);
+ 
+   const connectionItem = useMemo(
+     () => [
+       <DropdownItem
+         key={"dropdown-openshift-setup-as"}
+         component={"button"}
+         onClick={openOpenShiftSettings}
+         ouiaId={"setup-as-openshift-dropdown-button"}
+         description={"Change..."}
+       >
+         {`Connected to ${settings.openshift.config.namespace}`}
+       </DropdownItem>,
+       <DropdownSeparator key={"dropdown-openshift-separator-deployments-2"} />,
+     ],
+     [openOpenShiftSettings, settings.openshift.config.namespace]
+   );
+ 
+   const deploymentItems = useMemo(() => {
+     if (deployments.status === PromiseStateStatus.PENDING) {
+       return [
+         Array.from({ length: 3 }, (_, idx) => (
+           <DropdownItem key={`deployment-skeleton-${idx}`} isDisabled={true}>
+             <Skeleton width={"80%"} style={{ marginBottom: "4px" }} />
+             <Skeleton width={"50%"} />
+           </DropdownItem>
+         )),
+       ];
+     } else if (deployments.status === PromiseStateStatus.REJECTED) {
        return [
-         ...common,
          <DropdownItem key="disabled link" isDisabled>
            <Bullseye>
              <EmptyState>
@@@ -78,30 -148,47 +150,54 @@@
          </DropdownItem>,
        ];
      } else {
+       const dropdownItems = [];
+ 
+       const [devModeDeployments, userDeployments] = deployments.data
+         .sort((a, b) => b.creationTimestamp.getTime() - a.creationTimestamp.getTime())
+         .reduce(
+           ([devModeDeployments, userDeployments], d: WebToolsOpenShiftDeployedModel) =>
+             d.devMode ? [[...devModeDeployments, d], userDeployments] : [devModeDeployments, [...userDeployments, d]],
+           [[] as WebToolsOpenShiftDeployedModel[], [] as WebToolsOpenShiftDeployedModel[]]
+         );
+ 
+       if (devModeDeployments.length > 0) {
+         dropdownItems.push(
+           <OpenShiftDeploymentDropdownItem
+             key={devModeDeployments[0].creationTimestamp.getTime()}
+             id={0}
+             deployment={devModeDeployments[0]}
+             refreshDeployments={refresh}
+           />
+         );
+ 
+         if (userDeployments.length > 0) {
+           dropdownItems.push(<DropdownSeparator key={"dropdown-openshift-separator-deployments-2"} />);
+         }
+       }
+ 
        return [
-         ...common,
-         openshift.deployments
-           .sort((a, b) => b.creationTimestamp.getTime() - a.creationTimestamp.getTime())
-           .map((deployment, i) => {
-             return (
-               <OpenShiftDeploymentDropdownItem
-                 key={deployment.creationTimestamp.getTime()}
-                 id={i}
-                 deployment={deployment}
-               />
-             );
-           }),
+         ...dropdownItems,
+         userDeployments.map((deployment, i) => {
+           return (
+             <OpenShiftDeploymentDropdownItem
+               key={deployment.creationTimestamp.getTime()}
+               id={i + 1}
+               deployment={deployment}
+               refreshDeployments={refresh}
+             />
+           );
+         }),
        ];
      }
-   }, [openshift.deployments, isConnected, openOpenShiftSettings, settings.openshift.config.namespace]);
+   }, [deployments.data, deployments.status, refresh]);
  
 +  const onDeploymensDropdownToggle = useCallback(() => {
 +    if (!isConnected) {
 +      history.push(routes.settings.openshift.path({}));
 +    }
 +    openshift.setDeploymentsDropdownOpen((dropdownOpen) => isConnected && !dropdownOpen);
 +  }, [history, isConnected, openshift]);
 +
    return (
      <>
        <Tooltip
diff --cc packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx
index 10a8856bba,18497e2099..d9eaaef0ae
--- a/packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx
@@@ -14,23 -14,30 +14,24 @@@
   * limitations under the License.
   */
  
 +import { Octokit } from "@octokit/rest";
  import * as React from "react";
 -import { useCallback, useContext, useEffect, useMemo, useState } from "react";
 +import { useContext, useEffect, useMemo, useState } from "react";
  import { getCookie, setCookie } from "../cookies";
 -import { Octokit } from "@octokit/rest";
 -import { useQueryParams } from "../queryParams/QueryParamsContext";
 -import { Modal, ModalVariant } from "@patternfly/react-core/dist/js/components/Modal";
 -import { SettingsModalBody, SettingsTabs } from "./SettingsModalBody";
 +import { SwfServiceCatalogStore } from "../editor/api/SwfServiceCatalogStore";
 +import { useKieSandboxExtendedServices } from "../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
 +import { KieSandboxExtendedServicesStatus } from "../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
+ import { readDevModeEnabledConfigCookie, readOpenShiftConfigCookie } from "./openshift/OpenShiftSettingsConfig";
 -import { isKubernetesConnectionValid } from "@kie-tools-core/kubernetes-bridge/dist/service";
  import { OpenShiftInstanceStatus } from "../openshift/OpenShiftInstanceStatus";
  import { OpenShiftService } from "@kie-tools-core/kubernetes-bridge/dist/service/OpenShiftService";
 -import { useHistory } from "react-router";
 -import { QueryParams } from "../navigation/Routes";
 -import { GITHUB_AUTH_TOKEN_COOKIE_NAME } from "./github/GitHubSettingsTab";
 +import { FeaturePreviewSettingsConfig, readFeaturePreviewConfigCookie } from "./featurePreview/FeaturePreviewConfig";
 +import { GITHUB_AUTH_TOKEN_COOKIE_NAME } from "./github/GitHubSettings";
- import { readOpenShiftConfigCookie } from "./openshift/OpenShiftSettingsConfig";
  import { readServiceAccountConfigCookie, ServiceAccountSettingsConfig } from "./serviceAccount/ServiceAccountConfig";
  import {
    readServiceRegistryConfigCookie,
    ServiceRegistrySettingsConfig,
  } from "./serviceRegistry/ServiceRegistryConfig";
 -import { useKieSandboxExtendedServices } from "../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
 -import { KieSandboxExtendedServicesStatus } from "../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
 -import { SwfServiceCatalogStore } from "../editor/api/SwfServiceCatalogStore";
 -import { FeaturePreviewSettingsConfig, readFeaturePreviewConfigCookie } from "./featurePreview/FeaturePreviewConfig";
+ import { useEnv } from "../env/EnvContext";
  import { KubernetesConnection } from "@kie-tools-core/kubernetes-bridge/dist/service";
  
  export enum AuthStatus {
@@@ -117,6 -129,32 +120,7 @@@ export const SettingsContext = React.cr
  export const SettingsDispatchContext = React.createContext<SettingsDispatchContextType>({} as any);
  
  export function SettingsContextProvider(props: any) {
 -  const queryParams = useQueryParams();
 -  const history = useHistory();
+   const { env } = useEnv();
 -  const [isOpen, setOpen] = useState(false);
 -  const [activeTab, setActiveTab] = useState(SettingsTabs.GITHUB);
 -
 -  useEffect(() => {
 -    setOpen(queryParams.has(QueryParams.SETTINGS));
 -    setActiveTab((queryParams.get(QueryParams.SETTINGS) as SettingsTabs) ?? SettingsTabs.GITHUB);
 -  }, [queryParams]);
 -
 -  const open = useCallback(
 -    (activeTab = SettingsTabs.GITHUB) => {
 -      history.replace({
 -        search: queryParams.with(QueryParams.SETTINGS, activeTab).toString(),
 -      });
 -    },
 -    [history, queryParams]
 -  );
 -
 -  const close = useCallback(() => {
 -    history.replace({
 -      search: queryParams.without(QueryParams.SETTINGS).toString(),
 -    });
 -  }, [history, queryParams]);
 -
    //github
    const [githubAuthStatus, setGitHubAuthStatus] = useState(AuthStatus.LOADING);
    const [githubOctokit, setGitHubOctokit] = useState<Octokit>(new Octokit());
@@@ -272,8 -314,11 +274,9 @@@
        },
      };
    }, [
 -    isOpen,
 -    activeTab,
      openshiftStatus,
      openshiftConfig,
+     isOpenShiftDevModeEnabled,
      githubAuthStatus,
      githubToken,
      githubUser,
diff --cc packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettings.tsx
index 70e28a0b6e,0000000000..5768ffdbed
mode 100644,000000..100644
--- a/packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettings.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettings.tsx
@@@ -1,163 -1,0 +1,170 @@@
 +/*
 + * Copyright 2023 Red Hat, Inc. and/or its affiliates.
 + *
 + * Licensed under the Apache License, Version 2.0 (the "License");
 + * you may not use this file except in compliance with the License.
 + * You may obtain a copy of the License at
 + *
 + *        http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing, software
 + * distributed under the License is distributed on an "AS IS" BASIS,
 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 + * See the License for the specific language governing permissions and
 + * limitations under the License.
 + */
 +
 +import React from "react";
 +import { KubernetesConnection } from "@kie-tools-core/kubernetes-bridge/dist/service";
 +import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
 +import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
 +import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
 +import { Modal, ModalVariant } from "@patternfly/react-core/dist/js/components/Modal";
 +import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
 +import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
 +import { AddCircleOIcon } from "@patternfly/react-icons/dist/js/icons/add-circle-o-icon";
 +import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-circle-icon";
- import { useCallback, useEffect, useState } from "react";
++import { useCallback, useEffect, useState, useMemo } from "react";
 +import { Link } from "react-router-dom";
 +import { SETTINGS_PAGE_SECTION_TITLE } from "../SettingsContext";
 +import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
 +import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
 +import { routes } from "../../navigation/Routes";
 +import { OpenShiftInstanceStatus } from "../../openshift/OpenShiftInstanceStatus";
 +import { setPageTitle } from "../../PageTitle";
 +import { obfuscate } from "../github/GitHubSettings";
 +import { useSettings, useSettingsDispatch } from "../SettingsContext";
 +import { SettingsPageProps } from "../types";
 +import { saveConfigCookie } from "./OpenShiftSettingsConfig";
 +import { OpenShiftSettingsSimpleConfig } from "./OpenShiftSettingsSimpleConfig";
 +
 +const PAGE_TITLE = "OpenShift";
 +
 +export function OpenShiftSettings(props: SettingsPageProps) {
 +  const settings = useSettings();
 +  const settingsDispatch = useSettingsDispatch();
 +  const [isModalOpen, setIsModalOpen] = useState(false);
 +  const kieSandboxExtendedServices = useKieSandboxExtendedServices();
 +
 +  const handleModalToggle = useCallback(() => {
 +    setIsModalOpen((prevIsModalOpen) => !prevIsModalOpen);
 +  }, []);
 +
 +  const onDisconnect = useCallback(() => {
 +    settingsDispatch.openshift.setStatus(OpenShiftInstanceStatus.DISCONNECTED);
 +    const newConfig: KubernetesConnection = {
 +      namespace: settings.openshift.config.namespace,
 +      host: settings.openshift.config.host,
 +      token: "",
 +    };
 +    settingsDispatch.openshift.setConfig(newConfig);
 +    saveConfigCookie(newConfig);
 +  }, [settings.openshift.config, settingsDispatch.openshift]);
 +
++  const devModeEnabledLabel = useMemo(
++    () => (settings.openshift.isDevModeEnabled ? "enabled" : "disabled"),
++    [settings.openshift.isDevModeEnabled]
++  );
++
 +  useEffect(() => {
 +    setPageTitle([SETTINGS_PAGE_SECTION_TITLE, PAGE_TITLE]);
 +  }, []);
 +
 +  return (
 +    <Page>
 +      <PageSection variant={"light"} isWidthLimited>
 +        <TextContent>
 +          <Text component={TextVariants.h1}>{PAGE_TITLE}</Text>
 +          <Text component={TextVariants.p}>
 +            Data you provide here is necessary for deploying models you design to your OpenShift instance.
 +            <br />
 +            All information is locally stored in your browser and never shared with anyone.
 +          </Text>
 +        </TextContent>
 +      </PageSection>
 +
 +      <PageSection>
 +        {kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.RUNNING && (
 +          <>
 +            <Alert
 +              variant="danger"
 +              title={
 +                <Text>
 +                  Connect to{" "}
 +                  <Link to={routes.settings.kie_sandbox_extended_services.path({})}>KIE Sandbox Extended Services</Link>{" "}
 +                  before configuring your OpenShift instance
 +                </Text>
 +              }
 +              aria-live="polite"
 +              isInline
 +            >
 +              KIE Sandbox Extended Services is necessary for proxying Serverless Logic Web Tools requests to OpenShift,
 +              thus making it possible to deploy models.
 +            </Alert>
 +            <br />
 +          </>
 +        )}
 +        <PageSection variant={"light"}>
 +          {settings.openshift.status === OpenShiftInstanceStatus.CONNECTED ? (
 +            <EmptyState>
 +              <EmptyStateIcon icon={CheckCircleIcon} color={"var(--pf-global--success-color--100)"} />
 +              <TextContent>
 +                <Text component={"h2"}>{"You're connected to OpenShift."}</Text>
 +              </TextContent>
 +              <EmptyStateBody>
 +                Deploying models is <b>enabled</b>.
 +                <br />
++                Uploading models to Dev Mode is <b>{devModeEnabledLabel}</b>.
++                <br />
 +                <b>Token: </b>
 +                <i>{obfuscate(settings.openshift.config.token)}</i>
 +                <br />
 +                <b>Host: </b>
 +                <i>{settings.openshift.config.host}</i>
 +                <br />
 +                <b>Namespace (project): </b>
 +                <i>{settings.openshift.config.namespace}</i>
 +                <br />
 +                <br />
 +                <Button variant={ButtonVariant.tertiary} onClick={onDisconnect}>
 +                  Disconnect
 +                </Button>
 +              </EmptyStateBody>
 +            </EmptyState>
 +          ) : (
 +            <EmptyState>
 +              <EmptyStateIcon icon={AddCircleOIcon} />
 +              <TextContent>
 +                <Text component={"h2"}>You are not connected to OpenShift.</Text>
 +              </TextContent>
 +              <EmptyStateBody>
 +                You currently have no OpenShift connections. <br />
 +                <br />
 +                <Button variant={ButtonVariant.primary} onClick={handleModalToggle} data-testid="add-connection-button">
 +                  Add connection
 +                </Button>
 +              </EmptyStateBody>
 +            </EmptyState>
 +          )}
 +        </PageSection>
 +      </PageSection>
 +
 +      {props.pageContainerRef.current && (
 +        <Modal
 +          title="Add connection"
 +          isOpen={
 +            isModalOpen &&
 +            kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.STOPPED &&
 +            (settings.openshift.status === OpenShiftInstanceStatus.DISCONNECTED ||
 +              settings.openshift.status === OpenShiftInstanceStatus.EXPIRED)
 +          }
 +          onClose={handleModalToggle}
 +          variant={ModalVariant.large}
 +          appendTo={props.pageContainerRef.current || document.body}
 +        >
 +          <OpenShiftSettingsSimpleConfig />
 +        </Modal>
 +      )}
 +    </Page>
 +  );
 +}
diff --cc packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettingsSimpleConfig.tsx
index c3de7692a6,b4e4d3d280..e9333adc72
--- a/packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettingsSimpleConfig.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/openshift/OpenShiftSettingsSimpleConfig.tsx
@@@ -23,23 -24,21 +23,25 @@@ import { Text } from "@patternfly/react
  import { TextInput } from "@patternfly/react-core/dist/js/components/TextInput";
  import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
  import { TimesIcon } from "@patternfly/react-icons/dist/js/icons/times-icon";
 -import { useCallback, useEffect, useState } from "react";
 +import * as React from "react";
 +import { useCallback, useEffect, useState, useContext } from "react";
 +import { Link } from "react-router-dom";
  import { useAppI18n } from "../../i18n";
+ import { OpenShiftInstanceStatus } from "../../openshift/OpenShiftInstanceStatus";
+ import { EMPTY_CONFIG, saveConfigCookie, saveDevModeEnabledConfigCookie } from "./OpenShiftSettingsConfig";
  import {
    isKubernetesConnectionValid,
    KubernetesConnection,
    KubernetesConnectionStatus,
  } from "@kie-tools-core/kubernetes-bridge/dist/service";
+ import { useSettings, useSettingsDispatch } from "../SettingsContext";
  import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
  import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
 -import { SettingsTabs } from "../SettingsModalBody";
+ import { Checkbox } from "@patternfly/react-core/dist/js/components/Checkbox";
+ import { DEV_MODE_FEATURE_NAME } from "../../openshift/swfDevMode/DevModeConstants";
 +import { routes } from "../../navigation/Routes";
- import { OpenShiftInstanceStatus } from "../../openshift/OpenShiftInstanceStatus";
 +import { QuickStartIds } from "../../quickstarts-data";
- import { useSettings, useSettingsDispatch } from "../SettingsContext";
- import { EMPTY_CONFIG, saveConfigCookie } from "./OpenShiftSettingsConfig";
 +import { QuickStartContext, QuickStartContextValues } from "@patternfly/quickstarts";
  
  enum FormValiationOptions {
    INITIAL = "INITIAL",
@@@ -56,7 -55,7 +58,8 @@@ export function OpenShiftSettingsSimple
    const [isConfigValidated, setConfigValidated] = useState(FormValiationOptions.INITIAL);
    const [isConnecting, setConnecting] = useState(false);
    const kieSandboxExtendedServices = useKieSandboxExtendedServices();
+   const [isDevModeConfigEnabled, setDevModeConfigEnabled] = useState(settings.openshift.isDevModeEnabled);
 +  const qsContext = useContext<QuickStartContextValues>(QuickStartContext);
  
    useEffect(() => {
      setConfig(settings.openshift.config);
@@@ -306,19 -326,39 +318,51 @@@
                </Button>
              </InputGroupText>
            </InputGroup>
 +          <br />
 +          <Button
 +            isInline={true}
 +            key="quickstart"
 +            variant="link"
 +            onClick={() => {
 +              qsContext.setActiveQuickStartID?.(QuickStartIds.OpenShiftIntegrationQuickStart);
 +              setTimeout(() => qsContext.setQuickStartTaskNumber?.(QuickStartIds.OpenShiftIntegrationQuickStart, 1), 0);
 +            }}
 +          >
 +            Need help getting started? Follow our quickstart guide.
 +          </Button>
          </FormGroup>
+         <FormGroup
+           label={DEV_MODE_FEATURE_NAME}
+           labelIcon={
+             <Popover
+               bodyContent={
+                 "Automatically spins up a deployment running Quarkus in dev mode, making it quick to try model changes"
+               }
+             >
+               <button
+                 type="button"
+                 aria-label="More info for Dev Mode field"
+                 onClick={(e) => e.preventDefault()}
+                 aria-describedby="dev-mode-field"
+                 className="pf-c-form__group-label-help"
+               >
+                 <HelpIcon noVerticalAlign />
+               </button>
+             </Popover>
+           }
+           isRequired
+           fieldId="dev-mode-field"
+         >
+           <Checkbox
+             id="enable-dev-mode-checkbox"
+             label="Enable Dev Mode"
+             description={
+               "Be sure to set up at least 4GB of ram for your OpenShift deployments, otherwise, the Dev Mode deployment may run into issues."
+             }
+             isChecked={isDevModeConfigEnabled}
+             onChange={onEnableDevModeConfigChanged}
+           />
+         </FormGroup>
          <ActionGroup>
            <Button
              id="openshift-config-save-button"
diff --cc packages/serverless-logic-web-tools/src/settings/storage/StorageSettings.tsx
index ccba6c851f,0000000000..4996d1f571
mode 100644,000000..100644
--- a/packages/serverless-logic-web-tools/src/settings/storage/StorageSettings.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/storage/StorageSettings.tsx
@@@ -1,199 -1,0 +1,195 @@@
 +/*
 + * Copyright 2023 Red Hat, Inc. and/or its affiliates.
 + *
 + * Licensed under the Apache License, Version 2.0 (the "License");
 + * you may not use this file except in compliance with the License.
 + * You may obtain a copy of the License at
 + *
 + *        http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing, software
 + * distributed under the License is distributed on an "AS IS" BASIS,
 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 + * See the License for the specific language governing permissions and
 + * limitations under the License.
 + */
 +
 +import React from "react";
 +import { useController } from "@kie-tools-core/react-hooks/dist/useController";
 +import { Alert, AlertActionCloseButton, Button } from "@patternfly/react-core/dist/js";
 +import { Checkbox } from "@patternfly/react-core/dist/js/components/Checkbox";
 +import { Form } from "@patternfly/react-core/dist/js/components/Form";
 +import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
 +import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
 +import { useCallback, useEffect, useState } from "react";
- import { Alerts, AlertsController, useAlert } from "../../alerts/Alerts";
 +import { APP_NAME } from "../../AppConstants";
 +import { routes } from "../../navigation/Routes";
 +import { setPageTitle } from "../../PageTitle";
 +import { ConfirmDeleteModal } from "../../table/ConfirmDeleteModal";
 +import { SETTINGS_PAGE_SECTION_TITLE } from "../SettingsContext";
 +import { deleteAllCookies } from "../../cookies";
 +import { isBrowserChromiumBased } from "../../workspace/startupBlockers/SupportedBrowsers";
 +import { useHistory } from "react-router";
++import { useGlobalAlert } from "../../alerts/GlobalAlertsContext";
 +
 +const PAGE_TITLE = "Storage";
 +/**
 + * delete alert delay in seconds before reloading the app.
 + */
 +const DELETE_ALERT_DELAY = 5;
 +
 +/**
 + * Delete all indexed DBs
 + */
 +const deleteAllIndexedDBs = async () => {
 +  Promise.all(
 +    (await indexedDB.databases()).filter((db) => db.name).map(async (db) => indexedDB.deleteDatabase(db.name!))
 +  );
 +};
 +
 +function Timer(props: { delay: number }) {
 +  const [delay, setDelay] = useState(props.delay);
 +
 +  useEffect(() => {
 +    const timer = setInterval(() => {
 +      setDelay((prevDelay) => prevDelay - 1);
 +    }, 1000);
 +
 +    return () => {
 +      clearInterval(timer);
 +    };
 +  }, []);
 +
 +  return <>{delay}</>;
 +}
 +
 +export function StorageSettings() {
 +  const [isDeleteCookiesChecked, setIsDeleteCookiesChecked] = useState(false);
 +  const [isDeleteLocalStorageChecked, setIsDeleteLocalStorageChecked] = useState(false);
 +  const [isConfirmDeleteModalOpen, setIsConfirmDeleteModalOpen] = useState(false);
-   const [alerts, alertsRef] = useController<AlertsController>();
 +  const history = useHistory();
 +
 +  const toggleConfirmModal = useCallback(() => {
 +    setIsConfirmDeleteModalOpen((isOpen) => !isOpen);
 +  }, []);
 +
-   const deleteSuccessAlert = useAlert(
-     alerts,
++  const deleteSuccessAlert = useGlobalAlert(
 +    useCallback(({ close }) => {
 +      setTimeout(() => {
 +        window.location.href = window.location.origin + window.location.pathname;
 +      }, DELETE_ALERT_DELAY * 1000);
 +      return (
 +        <Alert
 +          variant="success"
 +          title={
 +            <>
 +              Data deleted successfully. <br />
 +              You will be redirected to the home page in <Timer delay={DELETE_ALERT_DELAY} /> seconds
 +            </>
 +          }
 +        />
 +      );
 +    }, [])
 +  );
 +
-   const deleteErrorAlert = useAlert(
-     alerts,
++  const deleteErrorAlert = useGlobalAlert(
 +    useCallback(({ close }) => {
 +      return (
 +        <Alert
 +          variant="danger"
 +          title={`Oops, something went wrong while trying to delete the selected data. Please refresh the page and try again. If the problem persists, you can try deleting site data for this application in your browser's settings.`}
 +          actionClose={<AlertActionCloseButton onClose={close} />}
 +        />
 +      );
 +    }, [])
 +  );
 +
 +  const onConfirmDeleteModalDelete = useCallback(async () => {
 +    toggleConfirmModal();
 +
 +    try {
 +      await deleteAllIndexedDBs();
 +      if (isDeleteLocalStorageChecked) {
 +        localStorage.clear();
 +      }
 +      if (isDeleteCookiesChecked) {
 +        deleteAllCookies();
 +      }
 +      deleteSuccessAlert.show();
 +    } catch (e) {
 +      deleteErrorAlert.show();
 +    }
 +  }, [toggleConfirmModal, deleteSuccessAlert, isDeleteLocalStorageChecked, deleteErrorAlert, isDeleteCookiesChecked]);
 +
 +  useEffect(() => {
 +    if (!isBrowserChromiumBased()) {
 +      history.replace(routes.settings.home.path({}));
 +    }
 +    setPageTitle([SETTINGS_PAGE_SECTION_TITLE, PAGE_TITLE]);
 +  }, [history]);
 +
 +  return (
 +    <>
-       <Alerts ref={alertsRef} width={"500px"} />
 +      <Page>
 +        <PageSection variant={"light"} isWidthLimited>
 +          <TextContent>
 +            <Text component={TextVariants.h1}>{PAGE_TITLE}</Text>
 +            <Text component={TextVariants.p}>
 +              Here, you have the ability to completely erase all stored data in your browser.
 +              <br />
 +              Safely delete your cookies, modules, settings and all information locally stored in your browser, giving a
 +              fresh start to {APP_NAME}.
 +            </Text>
 +          </TextContent>
 +        </PageSection>
 +
 +        <PageSection>
 +          <PageSection variant={"light"}>
 +            <Form>
 +              <Checkbox
 +                id="delete-indexedDB"
 +                label="Storage"
 +                description={"Delete all databases. You will lose all your modules and workspaces."}
 +                isChecked
 +                isDisabled
 +              />
 +              <Alert
 +                variant="warning"
 +                isInline
 +                title="By selecting the cookies and local storage, all your saved settings will be permanently erased."
 +              >
 +                <br />
 +                <Checkbox
 +                  id="delete-cookies"
 +                  label="Cookies"
 +                  description={"Delete all cookies."}
 +                  isChecked={isDeleteCookiesChecked}
 +                  onChange={setIsDeleteCookiesChecked}
 +                />
 +                <br />
 +                <Checkbox
 +                  id="delete-localStorage"
 +                  label="LocalStorage"
 +                  description={"Delete all localStorage information."}
 +                  isChecked={isDeleteLocalStorageChecked}
 +                  onChange={setIsDeleteLocalStorageChecked}
 +                />
 +              </Alert>
 +            </Form>
 +            <br />
 +            <Button variant="danger" onClick={toggleConfirmModal}>
 +              Delete data
 +            </Button>
 +          </PageSection>
 +        </PageSection>
 +        <ConfirmDeleteModal
 +          isOpen={isConfirmDeleteModalOpen}
 +          onClose={toggleConfirmModal}
 +          onDelete={onConfirmDeleteModalDelete}
 +          elementsTypeName="data"
 +          deleteMessage="By deleting this data will permanently erase your stored information."
 +        />
 +      </Page>
 +    </>
 +  );
 +}
diff --cc packages/serverless-logic-web-tools/src/workspace/components/NewWorkspaceFromSample.tsx
index 500a06bd09,1c1b81bb4c..1083f71a90
--- a/packages/serverless-logic-web-tools/src/workspace/components/NewWorkspaceFromSample.tsx
+++ b/packages/serverless-logic-web-tools/src/workspace/components/NewWorkspaceFromSample.tsx
@@@ -24,9 -24,10 +24,9 @@@ import { Spinner } from "@patternfly/re
  import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
  import { QueryParams } from "../../navigation/Routes";
  import { useQueryParam } from "../../queryParams/QueryParamsContext";
 -import { OnlineEditorPage } from "../../pageTemplate/OnlineEditorPage";
  import { PageSection } from "@patternfly/react-core/dist/js/components/Page";
  import { EditorPageErrorPage } from "../../editor/EditorPageErrorPage";
- import { KIE_SAMPLES_REPO } from "../../home/sample/sampleApi";
+ import { KIE_SAMPLES_REPO } from "../../home/sample/SampleApi";
  import { useSampleDispatch } from "../../home/sample/hooks/SampleContext";
  
  export function NewWorkspaceFromSample() {
diff --cc pnpm-lock.yaml
index e676671d44,541f19f201..4c0ea5231d
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@@ -6101,9 -6120,12 +6126,15 @@@ importers
        react-router-dom:
          specifier: ^5.2.1
          version: 5.3.0(react@17.0.2)
+       short-unique-id:
+         specifier: ^4.4.4
+         version: 4.4.4
 +      showdown:
 +        specifier: ^2.1.0
 +        version: 2.1.0
+       uuid:
+         specifier: ^8.3.2
+         version: 8.3.2
        vscode-languageserver-types:
          specifier: ^3.16.0
          version: 3.17.2
@@@ -31829,14 -31734,12 +31777,20 @@@ packages
      dev: true
      optional: true
  
+   /short-unique-id@4.4.4:
+     resolution:
+       { integrity: sha512-oLF1NCmtbiTWl2SqdXZQbo5KM1b7axdp0RgQLq8qCBBLoq+o3A5wmLrNM6bZIh54/a8BJ3l69kTXuxwZ+XCYuw== }
+     hasBin: true
+     dev: false
+ 
 +  /showdown@2.1.0:
 +    resolution:
 +      { integrity: sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ== }
 +    hasBin: true
 +    dependencies:
 +      commander: 9.4.1
 +    dev: false
 +
    /side-channel@1.0.4:
      resolution:
        { integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 19/27: NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1616)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit 22d37d1fb1e644d63b5c1592b0a355d82fb4c485
Merge: 1ec2244016 8f4d575d76
Author: Guilherme Caponetto <63...@users.noreply.github.com>
AuthorDate: Mon May 8 06:12:30 2023 -0300

    NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1616)

 .ci/jenkins/Jenkinsfile.vscode                     |   66 +-
 .github/workflows/daily_dev_publish.yml            |   18 +-
 .github/workflows/release_build.yml                |   47 +-
 .github/workflows/staging_build.yml                |   43 +-
 .gitignore                                         |    7 +-
 README.md                                          |    8 +-
 .../base64png-editor-vscode-extension/package.json |    2 +-
 examples/base64png-editor/package.json             |    1 -
 examples/base64png-editor/src/Base64PngEditor.tsx  |    2 -
 .../src/Base64PngEditorInterface.tsx               |   10 -
 .../todo-list-view-vscode-extension/package.json   |    2 +-
 packages/backend-extended-services/index.js        |   33 -
 .../kogito-extended-services-quarkus/pom.xml       |   71 -
 .../main/resources/META-INF/resources/index.html   |   24 -
 .../src/main/resources/application.properties      |    2 -
 packages/backend-extended-services/package.json    |   40 -
 packages/backend-extended-services/pom.xml         |  220 -
 packages/backend/src/vscode/commands/index.ts      |   17 -
 .../src/vscode/commands/runTestScenarioCommand.ts  |  103 -
 packages/backend/src/vscode/index.ts               |    1 -
 packages/boxed-expression-component/package.json   |    2 +-
 .../.vscode/launch.json                            |    0
 .../.vscode/settings.json                          |    0
 .../.vscode/tasks.json                             |    0
 .../CHANGELOG.md                                   |   11 +
 .../LICENSE                                        |    0
 .../README.md                                      |    0
 .../env/index.js                                   |    0
 .../gifs/bpmn.gif                                  |  Bin
 .../icon.png                                       |  Bin
 .../package.json                                   |   10 +-
 .../src/extension/extension.ts                     |    2 +-
 .../src/webview/BpmnEditorEnvelopeApp.ts           |    0
 .../static/svg-icon-dark.png                       |  Bin
 .../static/svg-icon-light.png                      |  Bin
 .../tsconfig.json                                  |    0
 .../webpack.config.js                              |    0
 packages/dashbuilder-editor/package.json           |    1 -
 .../src/editor/DashbuilderEditor.tsx               |    8 +-
 .../src/editor/DashbuilderEditorView.tsx           |    5 -
 .../src/impl/DashbuilderEditorChannelApiImpl.ts    |    8 +-
 .../src/monaco/augmentation/commands/index.ts      |    4 +-
 packages/dashbuilder-language-service/package.json |    2 +
 .../api/DashbuilderLanguageServiceChannelApi.ts    |   29 +-
 .../src/channel/DashbuilderLanguageService.ts      |  274 +-
 .../DashbuilderLanguageServiceCodeCompletion.ts    |   53 +-
 .../DashbuilderLanguageServiceCodeLenses.ts        |   39 +-
 .../src/channel/DashbuilderYamlLanguageService.ts  |  125 +
 .../src/channel/index.ts                           |    1 +
 .../src/channel/types.ts                           |   33 +-
 ...t.ts => DashbuilderYamlLanguageService.test.ts} |   13 +-
 ...=> DashbuilderYamlLanguageService.test.ts.snap} |    0
 .../tests/testUtils.ts                             |    4 +-
 packages/dashbuilder-viewer/package.json           |    1 -
 .../src/envelope/DashbuilderViewerView.tsx         |    5 -
 .../client/editor/DisplayerDragComponent.java      |   19 +-
 .../external/ExternalDataSetClientProvider.java    |    9 +-
 .../client/external/SupportedMimeType.java         |   23 +-
 .../client/external/csv/CSVColumnsFunction.java    |   48 +
 .../client/external/{ => csv}/CSVParser.java       |    6 +-
 .../external/metrics/MetricsColumnsFunction.java   |   39 +
 .../external/{ => metrics}/MetricsParser.java      |    2 +-
 .../services/RuntimeDataSetClientServices.java     |  162 +-
 .../client/widgets/view/SampleCardView.java        |    2 +-
 .../external/csv/CSVColumnsFunctionTest.java       |   61 +
 .../client/external/{ => csv}/CSVParserTest.java   |    4 +-
 .../external/{ => metrics}/MetricsParserTest.java  |    2 +-
 .../marshalling/LayoutTemplateJSONMarshaller.java  |    4 +-
 .../dashbuilder/displayer/DisplayerSettings.java   |   10 +
 .../.vscode/launch.json                            |    0
 .../.vscode/settings.json                          |    0
 .../.vscode/tasks.json                             |    0
 .../CHANGELOG.md                                   |   12 +
 .../{guided-tour => dmn-vscode-extension}/LICENSE  |    0
 .../README.md                                      |    0
 .../env/index.js                                   |    0
 .../gifs/dmn.gif                                   |  Bin
 .../gifs/scesim.gif                                |  Bin
 .../icon.png                                       |  Bin
 .../package.json                                   |   10 +-
 .../src/extension/extension.ts                     |    2 +-
 .../src/webview/DmnEditorEnvelopeApp.ts            |    0
 .../src/webview/SceSimEditorEnvelopeApp.ts         |    0
 .../static/svg-icon-dark.png                       |  Bin
 .../static/svg-icon-light.png                      |  Bin
 .../tsconfig.json                                  |    0
 .../webpack.config.js                              |    0
 packages/editor/package.json                       |    1 -
 packages/editor/src/api/Editor.ts                  |    2 -
 packages/editor/src/api/KogitoEditorChannelApi.ts  |    4 +-
 packages/editor/src/api/KogitoEditorEnvelopeApi.ts |    3 +-
 .../src/embedded/embedded/EmbeddedEditor.tsx       |   11 +-
 .../embedded/EmbeddedEditorChannelApiImpl.ts       |   10 -
 .../src/envelope/KogitoEditorEnvelopeApiImpl.ts    |    5 -
 .../tests/embedded/stateControl/Hooks.test.ts      |    1 -
 packages/editor/tests/envelope/DummyEditor.tsx     |    5 -
 packages/extended-services-api/src/jsonSchema.ts   |    1 +
 packages/guided-tour/package.json                  |   49 -
 .../guided-tour/src/api/GuidedTourChannelApi.ts    |   23 -
 .../guided-tour/src/api/GuidedTourEnvelopeApi.ts   |   21 -
 packages/guided-tour/src/api/Mode.ts               |   38 -
 packages/guided-tour/src/api/Rect.ts               |   37 -
 packages/guided-tour/src/api/Step.ts               |   36 -
 packages/guided-tour/src/api/Tutorial.ts           |   21 -
 packages/guided-tour/src/api/UserInteraction.ts    |   19 -
 packages/guided-tour/src/api/index.ts              |   23 -
 packages/guided-tour/src/channel/Hooks.ts          |   34 -
 packages/guided-tour/src/components/Colors.sass    |   18 -
 packages/guided-tour/src/components/Dialog.sass    |   55 -
 packages/guided-tour/src/components/Dialog.tsx     |  141 -
 packages/guided-tour/src/components/GuidedTour.tsx |   64 -
 .../guided-tour/src/components/HighlightLayer.sass |   25 -
 .../guided-tour/src/components/HighlightLayer.tsx  |   73 -
 .../src/components/NavigationControls.sass         |   52 -
 .../src/components/NavigationControls.tsx          |   76 -
 .../src/components/utils/GuidedTourBusListeners.ts |   52 -
 .../src/components/utils/GuidedTourContent.tsx     |  139 -
 .../components/utils/GuidedTourSelectorHandler.ts  |   58 -
 .../src/components/utils/GuidedTourStepsHelper.ts  |   46 -
 .../components/utils/GuidedTourUserInteractions.ts |   92 -
 .../src/components/utils/PositionCalculator.ts     |   56 -
 packages/guided-tour/src/components/utils/index.ts |   22 -
 .../src/contexts/CurrentTutorialContext.ts         |   38 -
 packages/guided-tour/src/contexts/index.ts         |   17 -
 .../guided-tour/src/core/GuidedTourDomUtils.ts     |   49 -
 .../guided-tour/src/core/GuidedTourEventBus.ts     |   66 -
 packages/guided-tour/src/core/index.ts             |   18 -
 packages/guided-tour/src/i18n/GuidedTourI18n.ts    |   30 -
 packages/guided-tour/src/i18n/index.ts             |   18 -
 packages/guided-tour/src/i18n/locales/en.ts        |   28 -
 packages/guided-tour/src/i18n/locales/index.ts     |   17 -
 packages/guided-tour/src/i18n/setup.ts             |   30 -
 packages/guided-tour/src/index.tsx                 |  133 -
 packages/guided-tour/tests/__mocks__/styleMock.js  |    1 -
 .../guided-tour/tests/components/Dialog.test.tsx   |  209 -
 .../tests/components/GuidedTour.test.tsx           |   27 -
 .../tests/components/HighlightLayer.test.tsx       |   97 -
 .../tests/components/NavigationControls.test.tsx   |  123 -
 .../components/__snapshots__/Dialog.test.tsx.snap  |  776 ---
 .../__snapshots__/GuidedTour.test.tsx.snap         |   66 -
 .../__snapshots__/HighlightLayer.test.tsx.snap     |   75 -
 .../__snapshots__/NavigationControls.test.tsx.snap |  426 --
 .../utils/GuidedTourBusListeners.test.ts           |   74 -
 .../utils/GuidedTourSelectorHandler.test.ts        |  104 -
 .../components/utils/GuidedTourStepsHelper.test.ts |   59 -
 .../utils/GuidedTourUserInteractions.test.ts       |  142 -
 .../components/utils/PositionCalculator.test.ts    |   73 -
 .../tests/core/GuidedTourDomUtils.test.ts          |   55 -
 .../tests/core/GuidedTourEventBus.test.ts          |  137 -
 .../__snapshots__/GuidedTourDomUtils.test.ts.snap  |   14 -
 packages/guided-tour/tests/index.test.tsx          |  140 -
 packages/guided-tour/tests/test_context.tsx        |   76 -
 packages/guided-tour/tests/utils.ts                |   67 -
 .../LICENSE                                        |    0
 packages/json-yaml-language-service/README.md      |   17 +
 .../env/index.js                                   |    2 +-
 .../jest.config.js                                 |    5 +-
 .../package.json                                   |    4 +-
 .../src/api/EditorLanguageServiceChannelApi.ts     |   34 +
 .../src/api/index.ts                               |   26 +-
 .../src/channel/EditorJsonLanguageService.ts}      |  131 +-
 .../src/channel/EditorLanguageService.ts           |  202 +
 .../channel/EditorLanguageServiceCodeCompletion.ts |   84 +
 .../src/channel/EditorLanguageServiceCodeLenses.ts |  141 +
 .../src/channel/EditorYamlLanguageService.ts}      |  110 +-
 .../src/channel/findNodesAtLocation.ts             |   10 +-
 .../src/channel/getLineContentFromOffset.ts        |    2 +-
 .../src/channel/getNodeFormat.ts                   |    4 +-
 .../src/channel/indentText.ts                      |    0
 .../src/channel/index.ts                           |   20 +-
 .../src/channel/matchNodeWithLocation.ts           |   10 +-
 .../src/channel/nodeUpUntilType.ts                 |    7 +-
 .../src/channel/refValidation.ts                   |   28 +-
 .../src/channel/types.ts                           |  116 +
 .../tests/EditorJsonLanguageService.test.ts        |  628 +++
 .../tests/EditorYamlLanguageService.test.ts        |  677 +++
 .../EditorJsonLanguageService.test.ts.snap         |  537 ++
 .../EditorYamlLanguageService.test.ts.snap         | 5362 ++++++++++++++++++++
 .../tests/findNodesAtLocation.test.ts              |  125 +-
 .../tests/getFileLanguage.test.ts                  |   52 +
 .../tests/getLineContentFromOffset.test.ts         |    2 +-
 .../tests/getNodeFormat.test.ts                    |   63 +-
 .../tests/indentText.test.ts                       |    0
 .../tests/matchNodeWithLocation.test.ts            |  114 +-
 .../tests/nodeUpUntilType.test.ts                  |   27 +-
 .../tests/refValidations.test.ts                   |  155 +
 .../testLanguageService/TestJsonLanguageService.ts |  114 +
 .../testLanguageService/TestLanguageService.ts     |  160 +
 .../TestLanguageServiceCodeLenses.ts               |   42 +
 .../testLanguageService/TestYamlLanguageService.ts |  115 +
 .../tests/testLanguageService}/index.ts            |   11 +-
 .../testLanguageService/testRefValidationMap.ts    |   57 +
 .../tests/testLanguageService/workflow.ts          | 2398 +++++++++
 .../tests/testUtils.ts                             |   32 +-
 .../tsconfig.json                                  |    3 +-
 packages/kie-bc-editors/package.json               |    1 -
 .../kie-bc-editors/src/common/GwtEditorWrapper.tsx |    6 +-
 .../src/common/GwtEditorWrapperFactory.ts          |   14 -
 .../GwtAppFormerConsumedInteropApi.ts              |   13 -
 .../GuidedTourExposedInteropApi.ts                 |   28 -
 .../src/common/exposedInteropApi/index.ts          |    1 -
 packages/kie-bc-editors/tests/DummyEditor.tsx      |    5 -
 .../.mocharc.json                                  |    0
 .../.vscode/launch.json                            |    0
 .../.vscode/settings.json                          |    0
 .../.vscode/tasks.json                             |    0
 .../.vscodeignore                                  |    0
 .../LICENSE                                        |    0
 .../README.md                                      |    0
 .../env/index.js                                   |    0
 .../it-tests/extension-editors-bpmn.test.ts        |    0
 .../it-tests/extension-editors-dmn.test.ts         |    0
 .../it-tests/extension-editors-scesim.test.ts      |    0
 .../it-tests/extension-editors-smoke.test.ts       |    0
 .../it-tests/helpers/CommonAsserts.ts              |    0
 .../it-tests/helpers/CommonLocators.ts             |    0
 .../it-tests/helpers/PmmlEditorTestHelper.ts       |    0
 .../it-tests/helpers/ScesimEditorTestHelper.ts     |    0
 .../it-tests/helpers/VSCodeTestHelper.ts           |   16 +-
 .../it-tests/helpers/bpmn/BpmnEditorTestHelper.ts  |    0
 .../it-tests/helpers/bpmn/BpmnLocators.ts          |    0
 .../it-tests/helpers/bpmn/Correlation.ts           |    0
 .../helpers/bpmn/CorrelationModalHelper.ts         |    0
 .../helpers/bpmn/DataAssignmentsModalHelper.ts     |    0
 .../it-tests/helpers/bpmn/DataInputAssignment.ts   |    0
 .../it-tests/helpers/bpmn/DiagramExplorerHelper.ts |    0
 .../helpers/bpmn/ImplementationExecutionHelper.ts  |    0
 .../it-tests/helpers/bpmn/ProcessVariable.ts       |    0
 .../helpers/bpmn/ProcessVariablesWidgetHelper.ts   |    0
 .../it-tests/helpers/bpmn/PropertiesPanelHelper.ts |    0
 .../it-tests/helpers/dmn/BuiltInType.ts            |    0
 .../helpers/dmn/DecisionNavigatorHelper.ts         |    0
 .../it-tests/helpers/dmn/DmnEditorTestHelper.ts    |    0
 .../it-tests/helpers/dmn/EditorTabs.ts             |    0
 .../it-tests/helpers/dmn/ExpressionEditorHelper.ts |    0
 .../it-tests/helpers/dmn/ExpressionType.ts         |    0
 .../it-tests/helpers/dmn/PropertiesPanelHelper.ts  |    0
 .../resources/MultipleInstanceSubprocess.bpmn      |    0
 .../resources/ProcessWithCollaboration.bpmn        |    0
 .../it-tests/resources/ProcessWithGenerics.bpmn    |    0
 .../it-tests/resources/ReuseDataTypeTest.bpmn      |    0
 .../it-tests/resources/SaveAssetTest.bpmn          |    0
 .../it-tests/resources/UserTask.bpmn               |    0
 .../it-tests/resources/demo-dmn.scesim             |    0
 .../it-tests/resources/demo-expression.dmn         |    0
 .../it-tests/resources/demo.bpmn                   |    0
 .../it-tests/resources/demo.dmn                    |    0
 .../it-tests/resources/demo.pmml                   |    0
 .../it-tests/resources/demo.scesim                 |    0
 .../it-tests/resources/example.bpmn                |    0
 .../it-tests/resources/example.txt                 |    0
 .../it-tests/resources/global/default-global.wid   |    0
 .../it-tests/resources/reusable-model.dmn          |    0
 .../resources/src/main/java/org/kie/Log.wid        |    0
 .../src/main/java/org/kie/businessapp/Email.wid    |    0
 .../main/java/org/kie/businessapp/process-wid.bpmn |    0
 .../it-tests/settings.json                         |    0
 .../jest.config.js                                 |    0
 .../mocha-reporter-config.json                     |    2 +-
 .../package.json                                   |    6 +-
 .../src/extension/extension.ts                     |   15 +-
 .../src/webview/BpmnEditorEnvelopeApp.ts           |    0
 .../src/webview/DmnEditorEnvelopeApp.ts            |    0
 .../src/webview/PMMLEditorEnvelopeApp.ts           |    0
 .../src/webview/SceSimEditorEnvelopeApp.ts         |    0
 .../static/svg-icon-dark.png                       |  Bin
 .../static/svg-icon-light.png                      |  Bin
 .../tsconfig.it-tests.json                         |    0
 .../tsconfig.json                                  |    0
 .../webpack.config.js                              |    0
 packages/kie-editors-standalone/README.md          |    1 -
 packages/kie-editors-standalone/package.json       |    3 +-
 .../kie-editors-standalone/src/common/Editor.ts    |    1 -
 .../StandaloneEditorsEditorChannelApiImpl.ts       |    9 -
 packages/kn-plugin-workflow/env/index.js           |    2 +-
 packages/kn-plugin-workflow/pkg/command/create.go  |    2 +-
 .../kn-plugin-workflow/pkg/metadata/constants.go   |    2 +-
 .../it-tests/e2e/DMNDocumentation.cy.ts            |    3 -
 .../it-tests/e2e/DMNExpressionEditor.cy.ts         |   24 -
 .../online-editor/it-tests/e2e/DMNGuidedTour.cy.ts |   42 -
 .../online-editor/it-tests/e2e/DMNRunner.cy.ts     |    3 -
 packages/online-editor/it-tests/e2e/NewFile.cy.ts  |    3 -
 .../it-tests/e2e/OpenFromSource.cy.ts              |    3 -
 .../online-editor/it-tests/e2e/TrySample.cy.ts     |    3 -
 .../online-editor/it-tests/e2e/UploadFile.cy.ts    |    6 -
 packages/online-editor/package.json                |    3 +-
 .../src/dmnRunner/DmnRunnerContextProvider.tsx     |  207 +-
 .../src/dmnRunner/DmnRunnerDrawer.tsx              |   10 +-
 .../src/dmnRunner/DmnRunnerDrawerPanelContent.tsx  |  347 +-
 .../src/dmnRunner/DmnRunnerErrorBoundary.tsx       |   77 +
 .../online-editor/src/dmnRunner/DmnRunnerTable.tsx |   98 +-
 packages/online-editor/src/editor/EditorPage.tsx   |   48 +-
 .../src/editor/EditorPageDockContextProvider.tsx   |   18 +-
 .../src/editor/EditorPageDockDrawer.tsx            |    7 +-
 packages/online-editor/src/i18n/OnlineI18n.ts      |   41 +-
 packages/online-editor/src/i18n/locales/en.ts      |   54 +-
 .../online-editor/src/jsonSchema/dereference.ts    |   67 +
 .../online-editor/src/settings/SettingsContext.tsx |   32 +-
 .../src/tour/GuidedTourInitializer.tsx             |  145 -
 packages/online-editor/src/tour/index.ts           |   17 -
 packages/pmml-editor/package.json                  |    3 +-
 .../pmml-editor/src/editor/PMMLEditorInterface.tsx |    5 -
 .../.vscode/launch.json                            |    0
 .../.vscode/settings.json                          |    0
 .../.vscode/tasks.json                             |    0
 .../CHANGELOG.md                                   |    8 +
 .../LICENSE                                        |    0
 .../README.md                                      |    0
 .../env/index.js                                   |    0
 .../gifs/pmml.gif                                  |  Bin
 .../icon.png                                       |  Bin
 .../package.json                                   |   10 +-
 .../src/extension/extension.ts                     |    2 +-
 .../src/webview/PmmlEditorEnvelopeApp.ts           |    0
 .../tsconfig.json                                  |    0
 .../webpack.config.js                              |    0
 packages/serverless-logic-web-tools/package.json   |    2 +-
 .../Deploy/ConfirmOptions/SwfDeployOptions.tsx     |   26 +-
 .../src/editor/WebToolsEmbeddedEditor.tsx          |    4 +-
 .../DashbuilderLanguageServiceChannelApiImpl.ts    |    4 +-
 .../src/editor/channel/DashChannelComponent.tsx    |    4 +-
 .../src/navigation/Routes.ts                       |    1 -
 .../strategies/DashboardSingleModelDeployment.ts   |    1 -
 .../strategies/DashboardWorkspaceDeployment.ts     |    1 -
 .../deploy/strategies/KogitoProjectDeployment.ts   |    1 -
 .../deploy/strategies/KogitoSwfModelDeployment.ts  |    1 -
 .../src/openshift/deploy/types.ts                  |   20 +-
 .../src/openshift/hooks/useDeploymentStrategy.ts   |   18 +-
 .../openshift/pipelines/KnativeBuilderPipeline.ts  |   48 -
 .../src/settings/SettingsContext.tsx               |   15 -
 .../src/settings/kafka/ApacheKafkaSettings.tsx     |  320 --
 .../src/settings/kafka/KafkaSettingsConfig.tsx     |   70 -
 .../src/settings/routes/SettingsPageRoutes.tsx     |    4 -
 .../serviceAccount/ServiceAccountSettings.tsx      |    5 +-
 .../src/settings/uiNav/SettingsPageNav.tsx         |    3 -
 .../static/resources/application-services.css      |   39 -
 .../package.json                                   |    1 -
 .../ServerlessWorkflowCombinedEditorView.tsx       |    5 -
 ...erverlessWorkflowDiagramEditorChannelApiImpl.ts |    9 -
 .../ServerlessWorkflowTextEditorChannelApiImpl.ts  |    9 -
 .../src/impl/SwfCombinedEditorChannelApiImpl.ts    |    9 -
 .../package.json                                   |    1 -
 .../client/guided/tour/GuidedTourBridge.java       |  101 -
 .../GuidedTourCustomSelectorPositionProvider.java  |  108 -
 .../client/guided/tour/GuidedTourObserver.java     |   51 -
 .../guided/tour/observers/GlobalHTMLObserver.java  |  117 -
 .../guided/tour/service/GuidedTourService.java     |   66 -
 .../tour/service/GuidedTourServiceEnvelope.java    |   45 -
 .../service/GuidedTourServiceNativeEnvelope.java   |   35 -
 .../tour/service/GuidedTourServiceProducer.java    |   45 -
 .../client/guided/tour/service/api/AutoMode.java   |   32 -
 .../client/guided/tour/service/api/BlockMode.java  |   36 -
 .../client/guided/tour/service/api/DemoMode.java   |   29 -
 .../client/guided/tour/service/api/Mode.java       |   27 -
 .../client/guided/tour/service/api/Rect.java       |   58 -
 .../client/guided/tour/service/api/Step.java       |   54 -
 .../guided/tour/service/api/SubTutorialMode.java   |   32 -
 .../client/guided/tour/service/api/Tutorial.java   |   36 -
 .../guided/tour/service/api/UserInteraction.java   |   35 -
 .../client/guided/tour/GuidedTourBridgeTest.java   |  137 -
 ...idedTourCustomSelectorPositionProviderTest.java |  107 -
 .../client/guided/tour/GuidedTourObserverTest.java |   65 -
 .../tour/observers/GlobalHTMLObserverTest.java     |  130 -
 .../service/GuidedTourServiceEnvelopeTest.java     |   74 -
 .../service/GuidedTourServiceProducerTest.java     |   71 -
 .../items/tooltip/PrimitiveTextTooltip.java        |   29 +-
 .../client/core/shape/wires/WiresManager.java      |    6 +-
 .../items/tooltip/PrimitiveTextTooltipTest.java    |   19 +-
 .../client/core/shape/wires/WiresShapeTest.java    |    6 +-
 .../stunner/sw/resources/i18n/SWConstants.java     |   15 +
 .../sw/resources/i18n/SWConstants.properties       |   10 +-
 .../shapes/HasConditionsAndHasDataFilter.java      |   65 +
 .../client/shapes/ServerlessWorkflowShapeView.java |    3 -
 .../stunner/sw/client/shapes/StateShapeView.java   |    3 -
 .../stunner/sw/client/shapes/SwitchStateShape.java |   14 +-
 .../sw/client/shapes/icons/BottomDepiction.java    |    2 -
 .../stunner/sw/client/shapes/icons/BottomText.java |   15 -
 .../stunner/sw/client/shapes/icons/CornerIcon.java |   21 +-
 .../stunner/sw/client/shapes/icons/IconPath.java   |    1 +
 .../shapes/HasConditionsAndHasDataFilterTest.java  |  156 +
 .../package.json                                   |    1 +
 .../src/api/SwfLanguageServiceChannelApi.ts        |   33 +-
 .../src/api/SwfOffsetsApi.ts                       |  133 -
 .../src/api/index.ts                               |   20 +-
 .../assets/code-completions/states-completions.ts  |    2 +-
 .../code-completions/workflow-completions.ts       |    2 +-
 .../src/channel/SwfJsonLanguageService.ts          |  132 +-
 .../src/channel/SwfLanguageService.ts              |  238 +-
 .../channel/SwfLanguageServiceCodeCompletion.ts    |   96 +-
 .../src/channel/SwfLanguageServiceCodeLenses.ts    |  278 +-
 .../src/channel/SwfYamlLanguageService.ts          |  312 +-
 .../src/channel/indentText.ts                      |   37 -
 .../src/channel/index.ts                           |    7 -
 .../src/channel/modelQueries.ts                    |   15 +-
 .../src/channel/swfRefValidationMap.ts             |   13 +-
 .../src/channel/types.ts                           |   66 +-
 .../src/editor/SwfJsonOffsets.ts                   |   40 +-
 .../src/editor/SwfOffsets.ts                       |   92 +
 .../src/editor/SwfYamlOffsets.ts                   |   50 +-
 .../src/editor/index.ts                            |   24 +-
 .../tests/SwfJsonLanguageService.test.ts           |  500 +-
 .../tests/SwfJsonOffsets.test.ts                   |  160 +-
 .../tests/SwfYamlLanguageService.test.ts           |  559 +-
 .../tests/SwfYamlOffsets.test.ts                   |  156 +-
 .../SwfJsonLanguageService.test.ts.snap            |  146 -
 .../SwfYamlLanguageService.test.ts.snap            | 4983 ------------------
 .../tests/refValidations.test.ts                   |  218 +-
 .../tests/testUtils.ts                             |   18 +-
 .../package.json                                   |    1 -
 .../viewer/ServerlessWorkflowMermaidViewerView.tsx |    5 -
 .../README.md                                      |    1 -
 .../package.json                                   |    1 -
 .../src/common/Editor.ts                           |    1 -
 .../StandaloneEditorsEditorChannelApiImpl.ts       |    9 -
 ...neServerlessWorkflowCombinedEditorChannelApi.ts |    9 -
 .../channel/SwfTextEditorChannelApiImpl.ts         |    9 -
 .../serverless-workflow-text-editor/package.json   |    1 -
 .../editor/ServerlessWorkflowTextEditorView.tsx    |    5 -
 .../editor/textEditor/SwfTextEditorController.ts   |   36 +-
 .../textEditor/augmentation/commands/index.tsx     |    4 +-
 .../.mocharc.json                                  |    0
 .../.vscode/launch.json                            |    0
 .../.vscode/settings.json                          |    0
 .../.vscode/tasks.json                             |    0
 .../CHANGELOG.md                                   |   24 +
 .../LICENSE                                        |    0
 .../README.md                                      |    2 +-
 .../env/index.js                                   |    0
 .../icon.png                                       |  Bin
 .../it-tests/helpers/CommonAsserts.ts              |    0
 .../it-tests/helpers/VSCodeTestHelper.ts           |   12 +-
 .../it-tests/helpers/swf/SwfEditorTestHelper.ts    |  182 +
 .../helpers/swf/SwfTextEditorTestHelper.ts}        |   22 +-
 .../autocompletion/autocompletion.sw.json          |   15 +
 .../autocompletion/autocompletion.sw.json.result   |   28 +
 .../autocompletion/autocompletion.sw.yaml          |   16 +
 .../autocompletion/autocompletion.sw.yaml.result   |   27 +
 .../emptyfile_autocompletion.sw.json}              |    0
 .../emptyfile_autocompletion.sw.json.result        |   41 +
 .../emptyfile_autocompletion.sw.yaml}              |    0
 .../emptyfile_autocompletion.sw.yaml.result        |   25 +
 .../emptyworkflow_autocompletion.sw.json}          |    0
 .../emptyworkflow_autocompletion.sw.json.result    |   11 +
 .../resources/autocompletion/specs/api.yaml        |   15 +
 .../resources/basic-operations/greet.sw.json       |   67 +
 .../resources/basic-operations/hello-world.sw.json |   18 +
 .../applicant-request-decision.sw.json             |   59 +
 .../resources/expression/expression.sw.json        |   35 +
 .../resources/expression/expression.sw.yaml        |   22 +
 .../resources/expression/schema/schema.json        |   24 +
 .../resources/expression/specs/openapi.json        |   49 +
 .../it-tests/resources/functions/function.sw.json  |   14 +
 .../resources/functions/function.sw.json.result    |   30 +
 .../it-tests/resources/functions/function.sw.yaml  |   10 +
 .../resources/functions/function.sw.yaml.result    |   18 +
 .../it-tests/resources/functions/routes/camel.json |   29 +
 .../it-tests/resources/functions/routes/camel.yaml |   12 +
 .../resources/functions/specs/asyncapi.json        |   17 +
 .../resources/functions/specs/asyncapi.yaml        |   10 +
 .../resources/functions/specs/openapi.json         |   41 +
 .../resources/functions/specs/openapi.yaml         |   25 +
 .../it-tests/resources/greeting-flow/.dockerignore |    5 +
 .../it-tests/resources/greeting-flow/.gitignore    |   39 +
 .../it-tests/resources/greeting-flow/pom.xml       |  144 +
 .../org/kie/tools/it/tests/GreetingResource.java   |   16 +
 .../src/main/resources/application.properties      |    1 +
 .../src/main/resources/greetings.sw.json           |   81 +
 .../greeting-flow/src/main/resources/openapi.yaml  |   37 +
 .../org/kie/tools/it/tests/GreetingResourceIT.java |    9 +
 .../kie/tools/it/tests/GreetingResourceTest.java   |   21 +
 .../syntax-highlight-hello-world.sw.json           |   18 +
 ...orkflow-editor-extension-autocompletion.test.ts |  255 +
 ...kflow-editor-extension-basic-operations.test.ts |  141 +
 ...low-editor-extension-diagram-navigation.test.ts |   84 +
 ...ss-workflow-editor-extension-expression.test.ts |   85 +
 ...ess-workflow-editor-extension-functions.test.ts |  177 +
 ...erless-workflow-editor-extension-smoke.test.ts} |   37 +-
 ...kflow-editor-extension-syntax-highlight.test.ts |   96 +
 .../it-tests/settings.json                         |    3 +-
 .../jsonLanguageConfiguration.json                 |    0
 .../yamlLanguageConfiguration.json                 |    0
 .../mocha-reporter-config.json                     |    6 +-
 .../package.json                                   |   11 +-
 .../src/debounce.ts}                               |   16 +-
 .../src/extension/RedHatAuthExtensionStateStore.ts |   53 +
 ...erverlessWorkflowDiagramEditorChannelApiImpl.ts |   39 +-
 ...rlessWorkflowDiagramEditorChannelApiProducer.ts |   70 +
 .../builtInVsCodeEditorSwfContributions.ts         |   17 +-
 .../src/extension/commandIds.ts                    |    0
 .../src/extension/configuration.ts                 |    0
 .../src/extension/extension.ts                     |    2 +-
 .../fs/JqExpressionsReadSchemaFromFs.ts            |   62 +
 .../SwfLanguageServiceChannelApiImpl.ts}           |   28 +-
 .../languageService/VsCodeSwfLanguageService.ts    |  212 +
 .../SwfServiceCatalogChannelApiImpl.ts             |   63 +
 .../serviceCatalog/SwfServiceCatalogStore.ts       |   71 +
 .../SwfServiceCatalogSupportActions.ts             |   74 +
 .../fs/FsWatchingServiceCatalogRelativeStore.ts    |  220 +
 .../src/extension/serviceCatalog/fs}/index.ts      |    7 +-
 .../serviceRegistry/ServiceRegistriesStore.ts      |  174 +
 .../ServiceRegistryInstanceClient.ts               |   88 +
 .../serviceRegistry/auth/AuthProvider.ts}          |   17 +-
 .../serviceRegistry/auth/AuthProviderFactory.ts    |   45 +
 .../serviceRegistry/auth/NoOpAuthProvider.ts}      |   30 +-
 .../serviceRegistry/auth/RhhccAuthProvider.ts      |   77 +
 .../serviceCatalog/serviceRegistry/auth}/index.ts  |    7 +-
 .../serviceCatalog/serviceRegistry/index.ts}       |   16 +-
 .../serviceCatalog/serviceRegistryCommands.ts      |   50 +
 .../extension/setupDiagramEditorCompanionTab.ts}   |   46 +-
 .../ServerlessWorkflowDiagramEditorEnvelopeApp.ts  |   44 +
 .../ServerlessWorkflowMermaidViewerEnvelopeApp.ts} |   10 +-
 .../static/svg-icon-dark.png                       |  Bin
 .../static/svg-icon-light.png                      |  Bin
 .../syntaxes/JSON.tmLanguage.json                  |  213 +
 .../syntaxes/YAML.tmLanguage.json                  |    0
 .../tsconfig.it-tests.json                         |    0
 .../tsconfig.json                                  |    0
 .../webpack.config.js                              |   34 +-
 .../appformer-kogito-bridge/pom.xml                |   15 -
 .../client/guided/tour/GuidedTourBridge.java       |  101 -
 .../GuidedTourCustomSelectorPositionProvider.java  |  108 -
 .../client/guided/tour/GuidedTourObserver.java     |   51 -
 .../guided/tour/observers/GlobalHTMLObserver.java  |  117 -
 .../guided/tour/service/GuidedTourService.java     |   66 -
 .../tour/service/GuidedTourServiceEnvelope.java    |   45 -
 .../service/GuidedTourServiceNativeEnvelope.java   |   35 -
 .../tour/service/GuidedTourServiceProducer.java    |   45 -
 .../client/guided/tour/service/api/AutoMode.java   |   32 -
 .../client/guided/tour/service/api/BlockMode.java  |   36 -
 .../client/guided/tour/service/api/DemoMode.java   |   29 -
 .../client/guided/tour/service/api/Mode.java       |   27 -
 .../client/guided/tour/service/api/Rect.java       |   58 -
 .../client/guided/tour/service/api/Step.java       |   54 -
 .../guided/tour/service/api/SubTutorialMode.java   |   32 -
 .../client/guided/tour/service/api/Tutorial.java   |   36 -
 .../guided/tour/service/api/UserInteraction.java   |   35 -
 .../client/guided/tour/GuidedTourBridgeTest.java   |  137 -
 ...idedTourCustomSelectorPositionProviderTest.java |  107 -
 .../client/guided/tour/GuidedTourObserverTest.java |   65 -
 .../tour/observers/GlobalHTMLObserverTest.java     |  130 -
 .../service/GuidedTourServiceEnvelopeTest.java     |   74 -
 .../service/GuidedTourServiceProducerTest.java     |   71 -
 .../README.md                                      |    4 +-
 .../README.md                                      |    4 +-
 .../stunner-editors/kie-wb-common-dmn/README.md    |    2 +-
 .../expressions/ExpressionEditorViewImpl.java      |   11 +-
 .../expressions/SaveCurrentStateCommand.java       |    9 -
 .../editors/expressions/util/ExpressionState.java  |    9 -
 .../expressions/ExpressionEditorViewImplTest.java  |   11 +-
 .../expressions/SaveCurrentStateCommandTest.java   |    2 -
 .../expressions/util/ExpressionStateTest.java      |    8 +-
 .../client/editor/AbstractDMNDiagramEditor.java    |    5 -
 .../client/tour/GuidedTourBridgeInitializer.java   |   79 -
 .../client/tour/common/GuidedTourActions.java      |   21 -
 .../common/client/tour/common/GuidedTourUtils.java |   60 -
 .../tour/observers/GuidedTourGraphObserver.java    |   80 -
 .../tour/observers/GuidedTourGridObserver.java     |   84 -
 .../GraphElementsPositionProviderFactory.java      |  122 -
 .../HTMLElementsPositionProviderFactory.java       |   72 -
 .../tour/providers/PositionProviderFactory.java    |   24 -
 .../common/client/tour/tutorial/DMNTutorial.java   |  170 -
 .../client/tour/tutorial/DMNTutorialView.html      |  118 -
 .../client/tour/tutorial/DMNTutorialView.java      |   35 -
 .../editor/AbstractDMNDiagramEditorTest.java       |    8 -
 .../tour/GuidedTourBridgeInitializerTest.java      |   76 -
 .../client/tour/common/GuidedTourUtilsTest.java    |  104 -
 .../observers/GuidedTourGraphObserverTest.java     |  124 -
 .../tour/observers/GuidedTourGridObserverTest.java |  119 -
 .../GraphElementsPositionProviderFactoryTest.java  |  141 -
 .../HTMLElementsPositionProviderFactoryTest.java   |   73 -
 .../showcase/client/editor/DMNDiagramEditor.java   |    3 -
 .../command/impl/KogitoKeyEventHandlerImpl.java    |    3 -
 packages/text-editor/package.json                  |    1 -
 packages/text-editor/src/editor/TextEditorView.tsx |    5 -
 packages/unitables/src/Unitables.tsx               |    1 -
 packages/unitables/src/bee/UnitablesBeeTable.tsx   |    3 -
 packages/vscode-extension-backend/.vscodeignore    |   12 -
 packages/vscode-extension-backend/README.md        |    1 -
 packages/vscode-extension-backend/jest.config.js   |   34 -
 packages/vscode-extension-backend/package.json     |  111 -
 .../src/extension/extension.ts                     |   44 -
 .../vscode-extension-backend/webpack.config.js     |   47 -
 .../CHANGELOG.md                                   |   13 +
 .../it-tests/helpers/VSCodeTestHelper.ts           |   12 +-
 .../package.json                                   |    3 +-
 .../src/api/DashbuilderViewerChannelApiImpl.ts     |    7 -
 .../builtInVsCodeEditorDashbuilderContributions.ts |    6 +-
 .../VsCodeDashbuilderLanguageService.ts            |   10 +-
 .../vscode-extension-kie-ba-bundle/CHANGELOG.md    |   16 +
 .../vscode-extension-kie-ba-bundle/package.json    |    6 +-
 .../vscode-extension-kogito-bundle/CHANGELOG.md    |   43 +
 .../vscode-extension-kogito-bundle/package.json    |    8 +-
 .../vscode-extension-pmml-editor/tsconfig.json     |    8 -
 .../CHANGELOG.md                                   |  472 --
 .../LICENSE                                        |  201 -
 .../README.md                                      |   22 -
 .../env/index.js                                   |   24 -
 .../gifs/bpmn.gif                                  |  Bin 1076785 -> 0 bytes
 .../gifs/dmn.gif                                   |  Bin 1233525 -> 0 bytes
 .../package.json                                   |   56 -
 .../src/extension/extension.ts                     |   22 -
 .../tsconfig.json                                  |    8 -
 .../webpack.config.js                              |   36 -
 .../CHANGELOG.md                                   |   20 +
 .../README.md                                      |    5 +-
 .../it-tests/helpers/VSCodeTestHelper.ts           |   12 +-
 .../package.json                                   |    8 +-
 ...erverlessWorkflowDiagramEditorChannelApiImpl.ts |   41 +-
 .../builtInVsCodeEditorSwfContributions.ts         |   18 +-
 .../src/extension/commandIds.ts                    |    1 +
 .../src/extension/configuration.ts                 |   11 +
 .../src/extension/extension.ts                     |    6 +
 .../extension/languageService/initSwfOffsetsApi.ts |   34 -
 .../src/extension/setupDeprecationNotification.ts  |   49 +
 packages/vscode-extension-yard-editor/LICENSE      |  201 -
 packages/vscode-extension-yard-editor/env/index.js |   24 -
 packages/vscode-extension/package.json             |    1 -
 .../src/DefaultVsCodeKieEditorChannelApiImpl.ts    |    9 -
 .../src/VsCodeKieEditorController.ts               |    4 -
 .../README.md                                      |    2 +-
 .../index.js                                       |    4 +-
 .../pom.xml                                        |    7 +-
 .../internal/handlers/GetAccessorsHandler.java     |   37 +-
 .../core/internal/handlers/GetClassesHandler.java  |   12 +-
 .../internal/handlers/GetClassesHandlerTest.java   |   50 -
 packages/workspaces-git-fs/package.json            |    2 +-
 .../src/services/WorkspaceService.tsx              |    9 +-
 packages/yard-editor/package.json                  |    1 -
 packages/yard-editor/src/editor/YardEditorView.tsx |    5 -
 .../.mocharc.json                                  |    0
 .../.vscode/launch.json                            |    0
 .../.vscode/settings.json                          |    0
 .../.vscode/tasks.json                             |    0
 .../.vscodeignore                                  |    0
 .../CHANGELOG.md                                   |    0
 .../LICENSE                                        |    0
 .../README.md                                      |    0
 .../env/index.js                                   |    0
 .../icon.png                                       |  Bin
 .../it-tests/helpers/CommonAsserts.ts              |    0
 .../it-tests/helpers/VSCodeTestHelper.ts           |   12 +-
 .../it-tests/helpers/yard/YardEditorTestHelper.ts  |    0
 .../helpers/yard/YardTextEditorTestHelper.ts       |    0
 .../it-tests/resources/empty.yard.json             |    0
 .../it-tests/resources/empty.yard.yaml             |    0
 .../it-tests/resources/empty.yard.yml              |    0
 .../it-tests/settings.json                         |    0
 .../it-tests/yard-editor.test.ts                   |    0
 .../jsonLanguageConfiguration.json                 |    0
 .../yamlLanguageConfiguration.json                 |    0
 .../mocha-reporter-config.json                     |    2 +-
 .../package.json                                   |    9 +-
 .../src/extension/commandIds.ts                    |    0
 .../src/extension/configuration.ts                 |    0
 .../src/extension/extension.ts                     |    2 +-
 .../src/extension/setupDiagramEditorControls.ts    |    0
 .../src/webview/YardEditorEnvelopeApp.ts           |    0
 .../syntaxes/YAML.tmLanguage.json                  |    0
 .../tsconfig.it-tests.json                         |    0
 .../tsconfig.json                                  |    0
 .../webpack.config.js                              |    0
 pnpm-lock.yaml                                     | 1432 ++++--
 repo/graph.dot                                     |   83 +-
 repo/graph.json                                    |  184 +-
 664 files changed, 18656 insertions(+), 22101 deletions(-)


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 18/27: Applied "KOGITO-9057: Remove Streams for Apache Kafka tab from Serverless Logic Web Tools" updates

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit 8f4d575d76462da9cf41bca93d18bd912e9744ec
Author: fantonangeli <fa...@gmail.com>
AuthorDate: Fri May 5 15:09:45 2023 +0200

    Applied "KOGITO-9057: Remove Streams for Apache Kafka tab from
    Serverless Logic Web Tools" updates
---
 .../src/navigation/Routes.ts                       |  1 -
 .../src/settings/SettingsContext.tsx               |  1 -
 .../src/settings/routes/SettingsPageRoutes.tsx     |  4 ---
 .../serviceAccount/ServiceAccountSettings.tsx      |  5 ++-
 .../src/settings/uiNav/SettingsPageNav.tsx         |  3 --
 .../static/resources/application-services.css      | 39 ----------------------
 6 files changed, 2 insertions(+), 51 deletions(-)

diff --git a/packages/serverless-logic-web-tools/src/navigation/Routes.ts b/packages/serverless-logic-web-tools/src/navigation/Routes.ts
index 0c36e8c953..9230e52175 100644
--- a/packages/serverless-logic-web-tools/src/navigation/Routes.ts
+++ b/packages/serverless-logic-web-tools/src/navigation/Routes.ts
@@ -146,7 +146,6 @@ export const routes = {
     kie_sandbox_extended_services: new Route<{}>(() => `${SETTINGS_ROUTE}/kie_sandbox_extended_services`),
     service_account: new Route<{}>(() => `${SETTINGS_ROUTE}/serviceAccount`),
     service_registry: new Route<{}>(() => `${SETTINGS_ROUTE}/serviceRegistry`),
-    kafka: new Route<{}>(() => `${SETTINGS_ROUTE}/kafka`),
     feature_preview: new Route<{}>(() => `${SETTINGS_ROUTE}/featurePreview`),
   },
 
diff --git a/packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx b/packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx
index 207d01543f..d626bc2d06 100644
--- a/packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx
@@ -25,7 +25,6 @@ import { OpenShiftInstanceStatus } from "../openshift/OpenShiftInstanceStatus";
 import { OpenShiftService } from "@kie-tools-core/kubernetes-bridge/dist/service/OpenShiftService";
 import { FeaturePreviewSettingsConfig, readFeaturePreviewConfigCookie } from "./featurePreview/FeaturePreviewConfig";
 import { GITHUB_AUTH_TOKEN_COOKIE_NAME } from "./github/GitHubSettings";
-import { KafkaSettingsConfig, readKafkaConfigCookie } from "./kafka/KafkaSettingsConfig";
 import { readOpenShiftConfigCookie } from "./openshift/OpenShiftSettingsConfig";
 import { readServiceAccountConfigCookie, ServiceAccountSettingsConfig } from "./serviceAccount/ServiceAccountConfig";
 import {
diff --git a/packages/serverless-logic-web-tools/src/settings/routes/SettingsPageRoutes.tsx b/packages/serverless-logic-web-tools/src/settings/routes/SettingsPageRoutes.tsx
index f7b7c9f7a4..ed3da455c8 100644
--- a/packages/serverless-logic-web-tools/src/settings/routes/SettingsPageRoutes.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/routes/SettingsPageRoutes.tsx
@@ -21,7 +21,6 @@ import { useRoutes } from "../../navigation/Hooks";
 import { GitHubSettings } from "../github/GitHubSettings";
 import { KieSandboxExtendedServicesSettings } from "../extendedServices/KieSandboxExtendedServicesSettings";
 import { FeaturePreviewSettings } from "../featurePreview/FeaturePreviewSettings";
-import { ApacheKafkaSettings } from "../kafka/ApacheKafkaSettings";
 import { OpenShiftSettings } from "../openshift/OpenShiftSettings";
 import { ServiceAccountSettings } from "../serviceAccount/ServiceAccountSettings";
 import { ServiceRegistrySettings } from "../serviceRegistry/ServiceRegistrySettings";
@@ -50,9 +49,6 @@ export function SettingsPageRoutes(props: {} & SettingsPageProps) {
       <Route path={routes.settings.service_registry.path({})}>
         <ServiceRegistrySettings {...settingsPageProps} />
       </Route>
-      <Route path={routes.settings.kafka.path({})}>
-        <ApacheKafkaSettings {...settingsPageProps} />
-      </Route>
       <Route path={routes.settings.feature_preview.path({})}>
         <FeaturePreviewSettings />
       </Route>
diff --git a/packages/serverless-logic-web-tools/src/settings/serviceAccount/ServiceAccountSettings.tsx b/packages/serverless-logic-web-tools/src/settings/serviceAccount/ServiceAccountSettings.tsx
index 3235b2386f..93060e14dc 100644
--- a/packages/serverless-logic-web-tools/src/settings/serviceAccount/ServiceAccountSettings.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/serviceAccount/ServiceAccountSettings.tsx
@@ -102,8 +102,7 @@ export function ServiceAccountSettings(props: SettingsPageProps) {
           <Text component={TextVariants.h1}>Service Account</Text>
           <Text component={TextVariants.p}>
             Data you provide here is necessary for uploading Open API specs associated with models you design to your
-            Service Registry instance and also connecting deployments with your Streams for Apache Kafka instance.
-            <br /> All information is locally stored in your browser and never shared with anyone.
+            Service Registry instance. All information is locally stored in your browser and never shared with anyone.
           </Text>
         </TextContent>
       </PageSection>
@@ -138,7 +137,7 @@ export function ServiceAccountSettings(props: SettingsPageProps) {
                 <Text component={"h2"}>{"Your Service Account information is set."}</Text>
               </TextContent>
               <EmptyStateBody>
-                Accessing your Service Registry and Streams for Apache Kafka is <b>enabled</b>.
+                Accessing your Service Registry is <b>enabled</b>.
                 <br />
                 <b>Client ID: </b>
                 <i>{config.clientId}</i>
diff --git a/packages/serverless-logic-web-tools/src/settings/uiNav/SettingsPageNav.tsx b/packages/serverless-logic-web-tools/src/settings/uiNav/SettingsPageNav.tsx
index be2a7221de..021cc91557 100644
--- a/packages/serverless-logic-web-tools/src/settings/uiNav/SettingsPageNav.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/uiNav/SettingsPageNav.tsx
@@ -58,9 +58,6 @@ export function SettingsPageNav(props: { pathname: string }) {
           >
             <Link to={routes.settings.service_registry.path({})}>Service Registry</Link>
           </NavItem>
-          <NavItem itemId={0} key={`Settings-kafka-nav`} isActive={props.pathname === routes.settings.kafka.path({})}>
-            <Link to={routes.settings.kafka.path({})}>Streams for Apache Kafka</Link>
-          </NavItem>
           <NavItem
             itemId={0}
             key={`Settings-feature_preview-nav`}
diff --git a/packages/serverless-logic-web-tools/static/resources/application-services.css b/packages/serverless-logic-web-tools/static/resources/application-services.css
index cb1afe1004..43cb4df5c7 100644
--- a/packages/serverless-logic-web-tools/static/resources/application-services.css
+++ b/packages/serverless-logic-web-tools/static/resources/application-services.css
@@ -122,13 +122,6 @@ main.applicationServices {
   width: 100%;
 }
 
-.kafka-overview--page-section--marketing {
-  --pf-c-page__main-section--PaddingTop: 0;
-  --pf-c-page__main-section--PaddingRight: var(--pf-global--spacer--lg);
-  --pf-c-page__main-section--PaddingBottom: var(--pf-global--spacer--xl);
-  --pf-c-page__main-section--PaddingLeft: var(--pf-global--spacer--lg);
-}
-
 .appserv-devpreview {
   height: 100%;
 }
@@ -146,29 +139,6 @@ tr.mas--ResponsiveTable__Tr--deleted > td {
   color: var(--pf-global--Color--200);
 }
 
-.kafka-ui-form-group--readonly .pf-c-form-control[readonly] {
-  --pf-c-form-control--readonly--BackgroundColor: transparent;
-  --pf-c-form-control--readonly--focus--PaddingBottom: 0;
-  border: none;
-  padding: 0;
-}
-
-.kafka-ui-form-group--readonly .pf-c-form__group-label {
-  --pf-c-form__group-label--PaddingBottom: 0;
-}
-
-.mas--CreateKafkaInstance__sidebar .pf-c-content dl {
-  display: block;
-}
-
-.mas--CreateKafkaInstance__sidebar dt {
-  font-size: var(--pf-global--FontSize--sm);
-}
-
-.mas--CreateKafkaInstance__creationTimeAlert {
-  margin-top: var(--pf-global--spacer--md);
-}
-
 .mas--details__drawer--tab-content {
   padding-bottom: var(--pf-global--spacer--lg);
   padding-top: var(--pf-global--spacer--lg);
@@ -195,15 +165,6 @@ tr.mas--ResponsiveTable__Tr--deleted > td {
   color: var(--pf-global--Color--200);
 }
 
-.mas-KafkaMessageBrowser-Toolbar {
-  z-index: 999;
-}
-
-.mas-KafkaMessageBrowser-Toolbar .pf-c-toolbar__content-section,
-.mas-KafkaMessageBrowser-Toolbar .pf-c-toolbar__group {
-  align-items: flex-start;
-}
-
 .pf-c-label.mas-m-solid {
   --pf-c-label__content--before--BorderColor: transparent;
   --pf-c-label--BackgroundColor: var(--pf-global--palette--black-600);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 13/27: NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1557)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit 414c4cbca7c2ac4f7ba96460e2e84909b08f01e8
Author: Fabrizio Antonangeli <fa...@gmail.com>
AuthorDate: Mon Apr 10 11:59:28 2023 +0200

    NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1557)
    
    Signed-off-by: dependabot[bot] <su...@github.com>
    Signed-off-by: Tomas David <td...@redhat.com>
    Signed-off-by: Kirill Gaevskii <kg...@redhat.com>
    Co-authored-by: Handreyrc <47...@users.noreply.github.com>
    Co-authored-by: Roger Martinez <ro...@gmail.com>
    Co-authored-by: Tiago Bento <15...@users.noreply.github.com>
    Co-authored-by: Kumar Aditya Raj <se...@gmail.com>
    Co-authored-by: Kirill Gaevskii <kg...@redhat.com>
    Co-authored-by: William Antônio Siqueira <wi...@gmail.com>
    Co-authored-by: Jaime Enriquez <ja...@inodesoft.com>
    Co-authored-by: Luiz João Motta <lu...@gmail.com>
    Co-authored-by: Zbyněk Drápela <61...@users.noreply.github.com>
    Co-authored-by: Manaswini Das <da...@gmail.com>
    Co-authored-by: Pere Fernández <pe...@users.noreply.github.com>
    Co-authored-by: Paulo Martins <pa...@gmail.com>
    Co-authored-by: Guilherme Caponetto <63...@users.noreply.github.com>
    Co-authored-by: Thiago Lugli <th...@users.noreply.github.com>
    Co-authored-by: Daniel J dos Santos <da...@users.noreply.github.com>
    Co-authored-by: Daniel J dos Santos <da...@ibm.com>
    Co-authored-by: Lubo Terifaj <lu...@gmail.com>
    Co-authored-by: dependabot[bot] <49...@users.noreply.github.com>
    Co-authored-by: Barbora Kapustova (Siskova) <ba...@users.noreply.github.com>
    Co-authored-by: Saravana Balaji Srinivasan <40...@users.noreply.github.com>
    Co-authored-by: Bai Xiaofeng <bx...@gmail.com>
    Co-authored-by: Kbowers <92...@users.noreply.github.com>
    Co-authored-by: Kennedy Bowers <ke...@ibm.com>
    Co-authored-by: Ajay Jaganathan <36...@users.noreply.github.com>
    Co-authored-by: Jan Stastny <st...@gmail.com>
    Co-authored-by: jstastny-cz <ja...@ibm.com>
    Co-authored-by: Tiago <ti...@gmail.com>
    Co-authored-by: Tomáš David <td...@redhat.com>
    Co-authored-by: William Antônio Siqueira <ws...@redhat.com>
    Co-authored-by: Yeser Amer <ye...@ibm.com>
---
 .github/workflows/release_build.yml                |    2 +
 .github/workflows/staging_build.yml                |    2 +
 README.md                                          |    4 +-
 package.json                                       |    3 +
 packages/boxed-expression-component/package.json   |    2 +-
 .../package.json                                   |    4 +-
 .../dashbuilder-component-table/static/index.html  |    1 -
 .../src/TimeSeriesComponent.tsx                    |    9 +-
 .../src/api/DashbuilderEditorChannelApi.ts         |   10 +-
 .../src/editor/DashbuilderEditor.tsx               |   18 +-
 .../src/impl/DashbuilderEditorChannelApiImpl.ts    |    5 +
 .../src/monaco/DashbuilderMonacoEditorApi.ts       |   13 +-
 .../external/ExternalComponentDisplayer.java       |    8 +-
 .../renderer/client/metric/MetricDisplayer.java    |    3 +-
 .../echarts/client/EChartsDisplayerView.java       |    1 +
 .../external/ExternalDataSetClientProvider.java    |   39 +-
 .../services/RuntimeDataSetClientServices.java     |    8 +-
 .../ExternalDataSetClientProviderTest.java         |   87 +
 .../RuntimeModelJSONMarshallerTest.java            |    3 +-
 .../dashbuilder/displayer/DisplayerSettings.java   |    4 +-
 .../dataset/def/ExternalDataSetDef.java            |   17 +-
 .../dataset/group/AggregateFunctionType.java       |   16 +-
 .../dataset/json/ExternalDataSetJSONParser.java    |    1 -
 .../dataset/json/ExternalDefJSONMarshaller.java    |    4 +
 .../dataset/engine/SharedDataSetOpEngine.java      |    3 +-
 .../function/AggregateFunctionManagerImpl.java     |    3 +
 .../engine/function/JoinCommaFunction.java}        |   27 +-
 .../{MedianFunction.java => JoinFunction.java}     |   42 +-
 .../engine/function/JoinHyphenFunction.java}       |   28 +-
 .../dataset/engine/function/MedianFunction.java    |    2 +-
 .../engine/function/AggregateFunctionsTest.java    |   38 +
 .../src/DmnFormToolbar.tsx                         |    6 +-
 .../src/DmnDecision.ts}                            |   12 +-
 .../src/DmnDocumentData.ts}                        |   25 +-
 packages/dmn-language-service/src/index.ts         |   29 +
 .../tests/fixtures/decisions.dmn                   |   64 +
 packages/dmn-language-service/tests/index.test.ts  |   25 +-
 packages/editor/src/api/Editor.ts                  |    1 -
 packages/kie-bc-editors/package.json               |    1 +
 .../src/bpmn/envelope/BpmnEditorFactory.ts         |   28 +
 .../envelope/exposedInteropApi/DmnDecision.ts}     |   12 +-
 .../envelope/exposedInteropApi/DmnDocumentData.ts} |   25 +-
 .../DmnLanguageServiceExposedInteropApi.ts}        |   16 +-
 .../kie-bc-editors/src/common/GwtEditorWrapper.tsx |    2 +-
 .../GwtAppFormerConsumedInteropApi.ts              |    2 +-
 packages/kie-bc-editors/tests/DummyEditor.tsx      |    5 +-
 .../kie-bc-editors/tests/GwtEditorWrapper.test.ts  |    5 +
 packages/kie-editors-standalone/package.json       |    2 +-
 packages/online-editor/package.json                |    2 +-
 .../online-editor/src/aboutModal/AboutButton.tsx   |    6 +-
 .../src/accelerators/AcceleratorsHooks.tsx         |    6 +-
 .../EditorEnvelopeLocatorFactory.ts                |   36 +-
 .../startupBlockers/StartupBlockerTemplate.tsx     |    8 +-
 packages/pmml-editor/package.json                  |    2 +-
 packages/serverless-logic-web-tools/env/index.js   |   10 +
 .../it-tests/e2e/CreateNewFile.cy.ts               |    3 +
 .../it-tests/e2e/TrySample.cy.ts                   |  141 -
 .../it-tests/e2e/UploadFiles.cy.ts                 |    3 +
 packages/serverless-logic-web-tools/package.json   |    4 +-
 packages/serverless-logic-web-tools/src/App.tsx    |    2 +
 .../src/editor/Deploy/ConfirmDeployModal.tsx       |    6 +-
 .../src/editor/EditorPage.tsx                      |  272 +-
 .../src/editor/EditorPageDockDrawer.tsx            |   13 +-
 .../src/editor/EditorToolbar.tsx                   |    6 +-
 .../src/editor/NewFileDropdownMenu.tsx             |   50 +-
 .../src/editor/WebToolsEmbeddedEditor.tsx          |  168 +
 .../src/editor/api/SwfServiceCatalogStore.ts       |    6 +-
 .../src/editor/channel/DashChannelComponent.tsx    |   75 +
 .../src/editor/channel/SwfChannelComponent.tsx     |  143 +
 .../src/editor/hooks/useEditorNotifications.tsx    |   73 +
 .../src/extension/index.ts                         |   60 +-
 .../src/home/sample/SampleCard.tsx                 |  117 +
 .../src/home/sample/SampleCardSkeleton.css         |   56 +
 .../src/home/sample/SampleCardSkeleton.tsx         |   64 +
 .../src/home/sample/SamplesLoadError.tsx           |   74 +
 .../src/home/sample/Showcase.tsx                   |  211 +
 .../src/home/sample/hooks/SampleContext.tsx        |  109 +
 .../src/home/sample/sampleApi.ts                   |  232 +
 .../src/homepage/overView/Overview.tsx             |    2 +-
 .../src/homepage/routes/HomePageRoutes.tsx         |   10 +-
 .../src/homepage/sampleCatalog/SampleCard.tsx      |   79 -
 .../src/homepage/sampleCatalog/SampleCatalog.tsx   |  100 -
 .../src/homepage/sampleCatalog/Types.ts            |   65 -
 .../src/navigation/Routes.ts                       |    3 +
 .../strategies/DashboardWorkspaceDeployment.ts     |    5 +-
 .../hooks/useUpdateVirtualServiceRegistry.tsx      |    4 +-
 .../useVirtualServiceRegistryDependencies.tsx      |    4 +-
 .../models/VirtualServiceRegistryFunction.ts       |    8 +-
 .../src/workspace/components/FileLabel.tsx         |   15 +-
 .../components/NewWorkspaceFromSample.tsx          |   80 +
 .../static/resources/style.css                     |    1 -
 .../static/samples/compensation/compensation.svg   |    1 -
 .../samples/compensation/compensation.sw.json      |   75 -
 .../samples/greetings-kafka/greetings-kafka.svg    |    1 -
 .../greetings-kafka/greetings-kafka.sw.json        |   99 -
 .../static/samples/greetings/greetings.svg         |    1 -
 .../static/samples/greetings/greetings.sw.json     |   68 -
 .../samples/kitchensink/kitchensink.dash.yml       |  822 ----
 .../static/samples/kitchensink/kitchensink.svg     | 1892 --------
 .../products-dashboard/products-dashboard.dash.yml |   42 -
 .../products-dashboard/products-dashboard.svg      |  671 ---
 .../static/samples/swf-report/sampleResponse.json  | 5122 --------------------
 .../static/samples/swf-report/swf-report.dash.yml  |  387 --
 .../static/samples/swf-report/swf-report.svg       | 1652 -------
 .../traffic-violation/traffic-violation.yard.yaml  |   28 -
 .../serverless-logic-web-tools/webpack.config.js   |    3 +-
 ...erverlessWorkflowDiagramEditorChannelApiImpl.ts |    4 +
 .../src/api/DiagramExposedInteropApi.ts            |    5 +
 .../src/api/DiagramService.ts                      |    4 +
 .../ServerlessWorkflowDiagramEditorChannelApi.ts   |    3 +-
 .../ServerlessWorkflowDiagramEditorEnvelopeApi.ts  |    2 +-
 ...rverlessWorkflowDiagramEditorEnvelopeApiImpl.ts |    2 +-
 .../bridge/client/diagramApi/DiagramApi.java       |    4 +
 .../diagramApi/DiagramApiInteropWrapper.java       |    5 +
 .../client/diagramApi/DiagramApiService.java       |    5 +
 .../client/diagramApi/NoOpDiagramApiService.java   |    3 +
 .../client/lienzo/shape/impl/LienzoShape.java      |   48 -
 .../impl/ShapeStateAttributeAnimationHandler.java  |  151 -
 .../shape/impl/ShapeStateDefaultHandler.java       |   96 +-
 .../lienzo/shape/view/MultipleAnimationHandle.java |   58 -
 .../shape/view/wires/WiresNoneLayoutContainer.java |   81 -
 .../shape/view/wires/WiresScalableContainer.java   |  148 -
 .../shape/view/wires/ext/DecoratedShapeView.java   |  215 -
 .../client/lienzo/util/LienzoPictureUtils.java     |   58 -
 .../stunner/client/lienzo/util/LienzoSvgPaths.java |   73 -
 .../lienzo/util/ShapeViewUserDataEncoder.java      |   29 +-
 .../ShapeStateAttributeAnimationHandlerTest.java   |  115 -
 .../shape/impl/ShapeStateDefaultHandlerTest.java   |   92 +-
 .../shape/view/MultipleAnimationHandleTest.java    |   84 -
 .../view/wires/WiresScalableContainerTest.java     |  212 -
 .../view/wires/ext/DecoratedShapeViewTest.java     |   60 -
 .../client/lienzo/util/LienzoPictureUtilsTest.java |   79 -
 .../stunner/shapes/client/BasicConnectorShape.java |    3 +-
 .../stunner/shapes/client/BasicContainerShape.java |   37 -
 .../common/stunner/shapes/client/RingShape.java    |   42 -
 .../shapes/client/view/PictureShapeView.java       |   75 -
 .../shapes/client/view/ShapeViewFactory.java       |   88 -
 .../client/widgets/editor/StunnerEditor.java       |    3 +
 .../session/impl/AbstractSessionPresenter.java     |    3 +
 .../client/widgets/editor/StunnerEditorTest.java   |   15 +
 .../client/shape/impl/AbstractElementShape.java    |    1 -
 .../shape/impl/ShapeStateAttributesFactory.java    |    9 +-
 .../core/client/shape/impl/NodeShapeImplTest.java  |    4 +-
 .../common/stunner/sw/autolayout/AutoLayout.java   | 1354 +++---
 .../stunner/sw/definition/ParallelState.java       |   17 +-
 .../custom/NumCompletedJsonTypeDeserializer.java   |   37 +
 .../custom/NumCompletedJsonTypeSerializer.java     |   34 +
 .../stunner/sw/marshall/TransitionMarshalling.java |    7 +-
 .../stunner/sw/resources/i18n/SWConstants.java     |   10 +
 .../sw/resources/i18n/SWConstants.properties       |    8 +-
 .../stunner/sw/marshall/StateMarshallingTest.java  |   24 +
 .../common/stunner/sw/client/shapes/HasAction.java |   79 -
 .../stunner/sw/client/shapes/HasActions.java       |    2 +-
 .../stunner/sw/client/shapes/HasBranches.java      |   43 +
 .../sw/client/shapes/ParallelStateShape.java       |   16 +-
 .../sw/client/shapes/ServerlessWorkflowShape.java  |   16 +-
 .../client/shapes/ServerlessWorkflowShapeView.java |   19 +-
 .../stunner/sw/client/shapes/StateShape.java       |    9 +-
 .../stunner/sw/client/shapes/TransitionShape.java  |    7 +-
 .../stunner/sw/client/shapes/icons/BottomText.java |   64 +
 .../stunner/sw/client/shapes/icons/IconPath.java   |    1 +
 .../stunner/sw/client/shapes/HasActionTest.java    |  166 -
 .../stunner/sw/client/shapes/HasActionsTest.java   |    4 +-
 .../stunner/sw/client/shapes/HasBranchesTest.java  |   81 +
 .../client/shapes/HasTranslationGeneralTest.java   |    7 +-
 .../stunner/sw/client/shapes/StateShapeTest.java   |   44 +-
 .../stunner/sw/client/editor/DiagramEditor.java    |   32 +-
 .../sw-editor-kogito-app/src/main/webapp/test.html |    2 +-
 .../sw/client/editor/DiagramEditorTest.java        |   45 +-
 .../stunner/sw/client/selenium/JsCanvasHelper.java |    5 +
 .../sw/client/selenium/SWEditorSeleniumIT.java     |   20 +
 .../channel/SwfLanguageServiceCodeCompletion.ts    |   10 +-
 .../src/channel/parsers/impl/openapi/openapi.ts    |   82 +-
 .../tests/channel/parsers/openapi/openapi.test.ts  |    4 +-
 .../marshaller/DmnLanguageServiceApi.java          |   33 +
 .../DmnLanguageServiceApiInteropWrapper.java}      |   24 +-
 .../marshaller/DmnLanguageServiceService.java      |   33 +
 .../DmnLanguageServiceServiceProducer.java         |   46 +
 .../UnavailableDmnLanguageServiceService.java      |   30 +
 .../dmneditor/marshaller/model/DmnDecision.java}   |   20 +-
 .../marshaller/model/DmnDocumentData.java}         |   30 +-
 .../marshaller/model/PMMLDocumentData.java         |    1 +
 .../pmmleditor/marshaller/model/PMMLModelData.java |    1 +
 .../marshaller/model => util}/JSIUtils.java        |    2 +-
 .../DmnLanguageServiceServiceProducerTest.java     |   58 +
 .../marshaller/DmnLanguageServiceServiceTest.java  |   55 +
 .../rebind/BindableProxyLoaderGenerator.java       |    7 +
 .../errai/databinding/rebind/DataBindingUtil.java  |   39 +-
 .../client/editors/types/jsinterop/JavaClass.java  |    2 +-
 .../pom.xml                                        |   47 +-
 .../widgets/container/displayer/FormDisplayer.java |   12 +-
 .../DomainObjectFieldChangeHandler.java}           |   16 +-
 .../DomainObjectFieldChangeHandlerRegistry.java}   |   20 +-
 ...DomainObjectFieldChangeHandlerRegistryImpl.java |   63 +
 .../container/displayer/FormDisplayerTest.java     |    6 +-
 .../task/BusinessRuleTaskExecutionSet.java         |   34 +-
 .../bpmn/definition/property/task/FileName.java    |   69 +
 .../bpmn/definition/HashCodeAndEqualityTest.java   |    3 +
 .../kie-wb-common-stunner-bpmn-client/pom.xml      |    5 +
 .../common/stunner/bpmn/StunnerBPMNEntryPoint.java |   12 +-
 .../dataproviders/DecisionNameFormProvider.java    |   54 +
 .../client/dataproviders/FileNameFormProvider.java |   43 +
 .../BusinessRuleTaskChangeHandler.java             |   80 +
 .../forms/filters/RuleLanguageFilterProvider.java  |    6 +-
 .../bpmn/client/forms/util/ListBoxValues.java      |    2 +-
 .../client/util/DmnResourceContentFetcher.java     |  107 +
 .../stunner/bpmn/StunnerBPMNEntryPointTest.java    |    6 +-
 .../BusinessRuleTaskChangeHandlerTest.java         |   81 +
 .../client/util/DmnResourceContentFetcherTest.java |   93 +
 .../pom.xml                                        |   43 +-
 .../kogito/client/selenium/basic-process.bpmn2     |    9 +-
 .../converters/customproperties/CustomInput.java   |    1 +
 .../properties/BusinessRuleTaskPropertyWriter.java |   10 +
 .../GenericServiceTaskPropertyWriter.java          |   29 +-
 .../fromstunner/tasks/TaskConverter.java           |    1 +
 .../properties/BusinessRuleTaskPropertyReader.java |    7 +-
 .../tostunner/tasks/BaseTaskConverter.java         |    4 +
 .../GenericServiceTaskPropertyWriterTest.java      |    4 +-
 .../GenericServiceTaskPropertyReaderTest.java      |    4 +-
 .../dashbuilder-editor-extension-smoke.test.ts     |    3 +-
 .../package.json                                   |    9 +-
 .../package.json                                   |    6 +-
 .../it-tests/resources/functions/function.sw.json  |   14 +
 .../resources/functions/function.sw.json.result    |   30 +
 .../it-tests/resources/functions/function.sw.yaml  |   10 +
 .../resources/functions/function.sw.yaml.result    |   18 +
 .../it-tests/resources/functions/routes/camel.json |   29 +
 .../it-tests/resources/functions/routes/camel.yaml |   12 +
 .../resources/functions/specs/asyncapi.json        |   17 +
 .../resources/functions/specs/asyncapi.yaml        |   10 +
 .../resources/functions/specs/openapi.json         |   41 +
 .../resources/functions/specs/openapi.yaml         |   25 +
 ...kflow-editor-extension-basic-operations.test.ts |    3 +-
 ...ess-workflow-editor-extension-functions.test.ts |  175 +
 .../package.json                                   |    8 +-
 ...erverlessWorkflowDiagramEditorChannelApiImpl.ts |   30 +-
 .../builtInVsCodeEditorSwfContributions.ts         |    4 -
 packages/vscode-extension-yard-editor/package.json |    8 +-
 .../src/constants/ExtensionHelper.ts               |   63 +
 .../WorkspaceFileRelativePathParser.ts             |   56 +-
 patches/selenium-webdriver@4.8.1.patch             |   13 +
 pnpm-lock.yaml                                     |  199 +-
 repo/graph.dot                                     |    2 +-
 repo/graph.json                                    |   10 +-
 244 files changed, 5170 insertions(+), 14907 deletions(-)

diff --git a/.github/workflows/release_build.yml b/.github/workflows/release_build.yml
index 2007fdd061..19eaf8ad88 100644
--- a/.github/workflows/release_build.yml
+++ b/.github/workflows/release_build.yml
@@ -1316,6 +1316,8 @@ jobs:
 
   serverless_logic_web_tools:
     env:
+      SERVERLESS_LOGIC_WEB_TOOLS__version: "${{ inputs.tag }}"
+      SERVERLESS_LOGIC_WEB_TOOLS__samplesRepositoryRef: "${{ inputs.tag }}"
       SERVERLESS_LOGIC_WEB_TOOLS__buildInfo: ""
       SERVERLESS_LOGIC_WEB_TOOLS__kieSandboxExtendedServicesDownloadUrlLinux: "https://github.com/kiegroup/kie-tools/releases/download/${{ inputs.tag }}/kie_sandbox_extended_services_linux_${{ inputs.tag }}.tar.gz"
       SERVERLESS_LOGIC_WEB_TOOLS__kieSandboxExtendedServicesDownloadUrlMacOs: "https://github.com/kiegroup/kie-tools/releases/download/${{ inputs.tag }}/kie_sandbox_extended_services_macos_${{ inputs.tag }}.dmg"
diff --git a/.github/workflows/staging_build.yml b/.github/workflows/staging_build.yml
index f365c7d665..baad6f0396 100644
--- a/.github/workflows/staging_build.yml
+++ b/.github/workflows/staging_build.yml
@@ -177,6 +177,8 @@ jobs:
           DMN_DEV_DEPLOYMENT__gtmId: ""
           DMN_DEV_DEPLOYMENT__onlineEditorUrl: "https://kiegroup.github.io/kogito-online-staging/${{ inputs.tag }}-prerelease"
           EXTENDED_SERVICES__kieSandboxUrl: "https://kiegroup.github.io/kogito-online-staging/${{ inputs.tag }}-prerelease"
+          SERVERLESS_LOGIC_WEB_TOOLS__version: "${{ inputs.tag }}-prerelease"
+          SERVERLESS_LOGIC_WEB_TOOLS__samplesRepositoryRef: "${{ inputs.tag }}"
           SERVERLESS_LOGIC_WEB_TOOLS__buildInfo: "${{ inputs.tag }} (staging) @ ${{ inputs.commit_sha }}"
           SERVERLESS_LOGIC_WEB_TOOLS__kieSandboxExtendedServicesDownloadUrlLinux: "${{ inputs.download_asset_url }}/STAGING__kie_sandbox_extended_services_linux_${{ inputs.tag }}.tar.gz"
           SERVERLESS_LOGIC_WEB_TOOLS__kieSandboxExtendedServicesDownloadUrlMacOs: "${{ inputs.download_asset_url }}/STAGING__kie_sandbox_extended_services_macos_${{ inputs.tag }}.dmg"
diff --git a/README.md b/README.md
index 7ae9f768e4..5cfe210394 100644
--- a/README.md
+++ b/README.md
@@ -138,12 +138,12 @@ After that, you're ready to start developing the Editors individually.
 - BPMN
 
   - Located at `packages/stunner-editors/kie-wb-common-stunner/kie-wb-common-stunner-sets/kie-wb-common-stunner-bpmn/kie-wb-common-stunner-bpmn-kogito-runtime`.
-  - Run `mvn clean gwt:run` to start.
+  - Run `mvn clean gwt:run` to start. To enable live-reloading capability, run `mvn clean gwt:run -Phot-reload`
 
 - DMN
 
   - Located at `packages/stunner-editors/kie-wb-common-dmn/kie-wb-common-dmn-webapp-kogito-runtime`.
-  - Run `mvn clean gwt:run` to start.
+  - Run `mvn clean gwt:run` to start. To enable live-reloading capability, run `mvn clean gwt:run -Phot-reload`
   - If you want to enable live-reloading capabilities of the React components that are part of the DMN Editor, follow [these steps](./packages/stunner-editors/docs/live-reload-dmn-loader.md).
 
 - Test Scenario (SceSim)
diff --git a/package.json b/package.json
index 7332149438..828023539b 100644
--- a/package.json
+++ b/package.json
@@ -42,6 +42,9 @@
           "monaco-yaml": "*"
         }
       }
+    },
+    "patchedDependencies": {
+      "selenium-webdriver@4.8.1": "patches/selenium-webdriver@4.8.1.patch"
     }
   },
   "kieTools": {
diff --git a/packages/boxed-expression-component/package.json b/packages/boxed-expression-component/package.json
index c01c708de4..bfb592847f 100644
--- a/packages/boxed-expression-component/package.json
+++ b/packages/boxed-expression-component/package.json
@@ -60,7 +60,7 @@
     "@types/uuid": "^8.3.0",
     "copy-webpack-plugin": "^11.0.0",
     "copyfiles": "^2.4.1",
-    "cypress": "^12.5.1",
+    "cypress": "^12.8.1",
     "cypress-file-upload": "^5.0.8",
     "cypress-iframe": "^1.0.1",
     "cypress-image-snapshot": "^4.0.1",
diff --git a/packages/chrome-extension-pack-kogito-kie-editors/package.json b/packages/chrome-extension-pack-kogito-kie-editors/package.json
index 3e9a5d5a18..0c3a4da08c 100644
--- a/packages/chrome-extension-pack-kogito-kie-editors/package.json
+++ b/packages/chrome-extension-pack-kogito-kie-editors/package.json
@@ -43,14 +43,14 @@
     "@types/chrome": "^0.0.193",
     "@types/jest": "^26.0.23",
     "@types/jest-when": "^2.7.4",
-    "@types/selenium-webdriver": "^4.1.9",
+    "@types/selenium-webdriver": "^4.1.12",
     "chai": "^4.3.4",
     "copy-webpack-plugin": "^11.0.0",
     "jest": "^26.6.3",
     "jest-junit": "^14.0.0",
     "jest-when": "^3.5.0",
     "rimraf": "^3.0.2",
-    "selenium-webdriver": "^4.7.1",
+    "selenium-webdriver": "^4.8.1",
     "start-server-and-test": "^1.12.1",
     "ts-jest": "^26.5.6",
     "typescript": "^4.4.2",
diff --git a/packages/dashbuilder-component-table/static/index.html b/packages/dashbuilder-component-table/static/index.html
index 4bf57902d6..31199789df 100644
--- a/packages/dashbuilder-component-table/static/index.html
+++ b/packages/dashbuilder-component-table/static/index.html
@@ -17,7 +17,6 @@
 <html lang="en">
   <head>
     <title>Filtered Table</title>
-    <link rel="stylesheet" href="resources/style.css" />
     <link rel="stylesheet" href="index.css" />
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
diff --git a/packages/dashbuilder-component-timeseries/src/TimeSeriesComponent.tsx b/packages/dashbuilder-component-timeseries/src/TimeSeriesComponent.tsx
index d2bca813a9..82d17700af 100644
--- a/packages/dashbuilder-component-timeseries/src/TimeSeriesComponent.tsx
+++ b/packages/dashbuilder-component-timeseries/src/TimeSeriesComponent.tsx
@@ -54,13 +54,8 @@ const INIT_OPTION = {
 };
 
 const validate = (columns: Column[]): string | undefined => {
-  if (
-    columns.length < 3 ||
-    columns[0].type !== "LABEL" || // series
-    columns[1].type !== "NUMBER" || // time
-    columns[2].type !== "NUMBER" // value
-  ) {
-    return "Data Set is Invalid! You must provide at least 3 columns container the series (LABEL), timestamp (NUMBER) and the value (NUMBER)";
+  if (columns.length < 3) {
+    return "Data Set is invalid! You must provide at least 3 columns containing the series, timestamp and the value";
   }
 };
 
diff --git a/packages/dashbuilder-editor/src/api/DashbuilderEditorChannelApi.ts b/packages/dashbuilder-editor/src/api/DashbuilderEditorChannelApi.ts
index b35563c3e9..8543ed0567 100644
--- a/packages/dashbuilder-editor/src/api/DashbuilderEditorChannelApi.ts
+++ b/packages/dashbuilder-editor/src/api/DashbuilderEditorChannelApi.ts
@@ -16,5 +16,13 @@
 
 import { KogitoEditorChannelApi } from "@kie-tools-core/editor/dist/api";
 import { DashbuilderLanguageServiceChannelApi } from "@kie-tools/dashbuilder-language-service/dist/api";
+import { Position } from "monaco-editor";
 
-export interface DashbuilderEditorChannelApi extends KogitoEditorChannelApi, DashbuilderLanguageServiceChannelApi {}
+export interface DashbuilderEditorChannelApi extends KogitoEditorChannelApi, DashbuilderLanguageServiceChannelApi {
+  /**
+   * Moves the cursor in the editor to a specified position
+   *
+   * @param position
+   */
+  kogitoDashbuilderTextEditor_moveCursorToPosition(position: Position): void;
+}
diff --git a/packages/dashbuilder-editor/src/editor/DashbuilderEditor.tsx b/packages/dashbuilder-editor/src/editor/DashbuilderEditor.tsx
index bba4b9f6cf..b3d9ff6a2b 100644
--- a/packages/dashbuilder-editor/src/editor/DashbuilderEditor.tsx
+++ b/packages/dashbuilder-editor/src/editor/DashbuilderEditor.tsx
@@ -26,9 +26,17 @@ import { WorkspaceEdit } from "@kie-tools-core/workspace/dist/api";
 import { Notification } from "@kie-tools-core/notifications/dist/api";
 import { MonacoEditorOperation, DashbuilderMonacoEditorApi } from "../monaco/DashbuilderMonacoEditorApi";
 import { DashbuilderMonacoEditor } from "../monaco/DashbuilderMonacoEditor";
-import { ChannelType, EditorTheme, StateControlCommand } from "@kie-tools-core/editor/dist/api";
+import {
+  ChannelType,
+  EditorTheme,
+  StateControlCommand,
+  useKogitoEditorEnvelopeContext,
+} from "@kie-tools-core/editor/dist/api";
 import { Dashbuilder } from "../dashbuilder/Dashbuilder";
 import { Toolbar } from "./Toolbar";
+import { Position } from "monaco-editor";
+import { useSubscription } from "@kie-tools-core/envelope-bus/dist/hooks";
+import { DashbuilderEditorChannelApi } from "../api";
 
 const INITIAL_CONTENT = `datasets:
 - uuid: products
@@ -123,6 +131,7 @@ const RefForwardingDashbuilderEditor: React.ForwardRefRenderFunction<Dashbuilder
   const [renderContent, setRenderContent] = useState("");
   const [showPreview, setShowPreview] = useState<boolean>(false);
   const dashbuilderMonacoEditorRef = useRef<DashbuilderMonacoEditorApi>(null);
+  const editorEnvelopeCtx = useKogitoEditorEnvelopeContext<DashbuilderEditorChannelApi>();
 
   useEffect(() => {
     const timer = setInterval(() => {
@@ -175,6 +184,13 @@ const RefForwardingDashbuilderEditor: React.ForwardRefRenderFunction<Dashbuilder
     []
   );
 
+  useSubscription(
+    editorEnvelopeCtx.channelApi.notifications.kogitoDashbuilderTextEditor_moveCursorToPosition,
+    useCallback((position: Position) => {
+      dashbuilderMonacoEditorRef.current?.moveCursorToPosition(position);
+    }, [])
+  );
+
   const onContentChanged = useCallback(
     (newContent: string, operation?: MonacoEditorOperation) => {
       if (operation === MonacoEditorOperation.EDIT) {
diff --git a/packages/dashbuilder-editor/src/impl/DashbuilderEditorChannelApiImpl.ts b/packages/dashbuilder-editor/src/impl/DashbuilderEditorChannelApiImpl.ts
index cb972126e8..513d087749 100644
--- a/packages/dashbuilder-editor/src/impl/DashbuilderEditorChannelApiImpl.ts
+++ b/packages/dashbuilder-editor/src/impl/DashbuilderEditorChannelApiImpl.ts
@@ -32,6 +32,7 @@ import { DashbuilderEditorChannelApi } from "../editor";
 import { SharedValueProvider } from "@kie-tools-core/envelope-bus/dist/api";
 import { Position, Range, CompletionItem, CodeLens } from "vscode-languageserver-types";
 import { DashbuilderLanguageServiceChannelApi } from "@kie-tools/dashbuilder-language-service/dist/api";
+import { Position as MonacoPosition } from "monaco-editor";
 
 export class DashbuilderEditorChannelApiImpl implements DashbuilderEditorChannelApi {
   constructor(
@@ -106,4 +107,8 @@ export class DashbuilderEditorChannelApiImpl implements DashbuilderEditorChannel
   kogitoDashbuilderLanguageService__getCodeLenses(args: { uri: string; content: string }): Promise<CodeLens[]> {
     return this.dashbuilderLanguageServiceChannelApiImpl.kogitoDashbuilderLanguageService__getCodeLenses(args) ?? [];
   }
+
+  public kogitoDashbuilderTextEditor_moveCursorToPosition(_position: MonacoPosition): void {
+    // no-op
+  }
 }
diff --git a/packages/dashbuilder-editor/src/monaco/DashbuilderMonacoEditorApi.ts b/packages/dashbuilder-editor/src/monaco/DashbuilderMonacoEditorApi.ts
index b13531fb68..127affb1e0 100644
--- a/packages/dashbuilder-editor/src/monaco/DashbuilderMonacoEditorApi.ts
+++ b/packages/dashbuilder-editor/src/monaco/DashbuilderMonacoEditorApi.ts
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-import { editor, KeyCode, KeyMod } from "monaco-editor";
+import { editor, KeyCode, KeyMod, Position } from "monaco-editor";
 import { initYamlSchemaDiagnostics } from "./augmentation/language/yaml";
 import { OperatingSystem } from "@kie-tools-core/operating-system";
 import { EditorTheme } from "@kie-tools-core/editor/dist/api";
@@ -31,6 +31,7 @@ export interface DashbuilderMonacoEditorApi {
   getContent: () => string;
   setTheme: (theme: EditorTheme) => void;
   forceRedraw: () => void;
+  moveCursorToPosition: (position: Position) => void;
 }
 
 export enum MonacoEditorOperation {
@@ -134,4 +135,14 @@ export class DefaultDashbuilderMonacoEditorController implements DashbuilderMona
         return "vs";
     }
   }
+
+  public moveCursorToPosition(position: Position): void {
+    if (!this.editor) {
+      return;
+    }
+
+    this.editor.revealLineInCenter(position.lineNumber);
+    this.editor.setPosition(position);
+    this.editor.focus();
+  }
 }
diff --git a/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-default/src/main/java/org/dashbuilder/renderer/client/external/ExternalComponentDisplayer.java b/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-default/src/main/java/org/dashbuilder/renderer/client/external/ExternalComponentDisplayer.java
index 8fc24716b0..8d1cc051ce 100644
--- a/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-default/src/main/java/org/dashbuilder/renderer/client/external/ExternalComponentDisplayer.java
+++ b/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-default/src/main/java/org/dashbuilder/renderer/client/external/ExternalComponentDisplayer.java
@@ -43,6 +43,8 @@ import org.dashbuilder.displayer.external.ExternalFilterRequest;
 @Dependent
 public class ExternalComponentDisplayer extends AbstractErraiDisplayer<ExternalComponentDisplayer.View> {
 
+    private static final String DEFAULT_WIDTH = "100%";
+
     public interface View extends AbstractErraiDisplayer.View<ExternalComponentDisplayer> {
 
         void setSize(int chartWidth, int chartHeight);
@@ -125,10 +127,8 @@ public class ExternalComponentDisplayer extends AbstractErraiDisplayer<ExternalC
                 displayerSettings.getChartMarginLeft());
 
         var width = displayerSettings.getComponentWidth();
-        if (width != null && !width.trim().isEmpty()) {
-            view.setWidth(width);
-        }
-
+        var finalWidth = width != null && !width.trim().isEmpty() ? width : DEFAULT_WIDTH;
+        view.setWidth(finalWidth);
         var height = displayerSettings.getComponentHeight();
         if (height != null && !height.trim().isEmpty()) {
             view.setHeight(height);
diff --git a/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-default/src/main/java/org/dashbuilder/renderer/client/metric/MetricDisplayer.java b/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-default/src/main/java/org/dashbuilder/renderer/client/metric/MetricDisplayer.java
index b16a0673be..c02786fe5a 100644
--- a/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-default/src/main/java/org/dashbuilder/renderer/client/metric/MetricDisplayer.java
+++ b/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-default/src/main/java/org/dashbuilder/renderer/client/metric/MetricDisplayer.java
@@ -102,9 +102,8 @@ public class MetricDisplayer extends AbstractGwtDisplayer<MetricDisplayer.View>
     public DisplayerConstraints createDisplayerConstraints() {
 
         DataSetLookupConstraints lookupConstraints = new DataSetLookupConstraints()
-                .setGroupAllowed(false)
+                .setGroupAllowed(true)
                 .setMinColumns(1)
-                .setFunctionRequired(true)
                 .setExtraColumnsAllowed(false)
                 .setColumnsTitle(view.getColumnsTitle());
 
diff --git a/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-echarts/src/main/java/org/dashbuilder/renderer/echarts/client/EChartsDisplayerView.java b/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-echarts/src/main/java/org/dashbuilder/renderer/echarts/client/EChartsDisplayerView.java
index 963bf9a928..0747f04f2d 100644
--- a/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-echarts/src/main/java/org/dashbuilder/renderer/echarts/client/EChartsDisplayerView.java
+++ b/packages/dashbuilder/dashbuilder-client/dashbuilder-renderers/dashbuilder-renderer-echarts/src/main/java/org/dashbuilder/renderer/echarts/client/EChartsDisplayerView.java
@@ -112,6 +112,7 @@ public class EChartsDisplayerView<P extends EChartsAbstractDisplayer<?>>
                         initParams);
         if (bootstrapParams.isResizable()) {
             Window.addResizeHandler(v -> chart.resize());
+            Scheduler.get().scheduleDeferred(chart::resize);
         }
 
     }
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/external/ExternalDataSetClientProvider.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/external/ExternalDataSetClientProvider.java
index 29f4dab87e..f5469efdfe 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/external/ExternalDataSetClientProvider.java
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/external/ExternalDataSetClientProvider.java
@@ -163,17 +163,14 @@ public class ExternalDataSetClientProvider {
                     return register(def, callback, responseText, mimeType);
                 } else {
                     var exception = buildExceptionForResponse(responseText, response);
-                   return notAbleToRetrieveDataSet(def, callback, exception);
+                    return notAbleToRetrieveDataSet(def, callback, exception);
                 }
 
             }, error -> notAbleToRetrieveDataSet(def, callback));
         }).catch_(e -> notAbleToRetrieveDataSet(def, callback,
-                new RuntimeException("Request not started, make sure that CORS is enabled. Message: " + e)
-        ));
+                new RuntimeException("Request not started, make sure that CORS is enabled.\nMessage: " + e)));
     }
 
-    
-
     private Throwable buildExceptionForResponse(String responseText, Response response) {
         var sb = new StringBuffer("The dataset URL is unreachable with status ");
         sb.append(response.status);
@@ -186,7 +183,7 @@ public class ExternalDataSetClientProvider {
             sb.append(responseText);
         }
         return new RuntimeException(sb.toString());
-   }
+    }
 
     private IThenable<Object> register(ExternalDataSetDef def,
                                        final DataSetReadyCallback callback,
@@ -219,12 +216,37 @@ public class ExternalDataSetClientProvider {
             }
         }
 
+        var existingDs = clientDataSetManager.getDataSet(def.getUUID());
+        if (def.isAccumulate() && existingDs != null) {
+            // no new data, so keep existing data set
+            if (dataSet.getRowCount() == 0) {
+                dataSet = existingDs;
+            } else {
+                accumulateDataSet(dataSet, existingDs);
+            }
+        }
+        dataSet.setDefinition(def);
         dataSet.setUUID(def.getUUID());
         clientDataSetManager.registerDataSet(dataSet);
         callback.callback(dataSet);
         return null;
     }
 
+    void accumulateDataSet(DataSet dataSet, DataSet existingDs) {
+        if (dataSet.getRowCount() > 0 && !existingDs.getColumns().equals(dataSet.getColumns())) {
+            throw new RuntimeException("New data is not compatible with existing data.");
+        }
+        for (int i = dataSet.getRowCount(), j = 0; i < existingDs.getDefinition().getCacheMaxRows() && j < existingDs
+                .getRowCount(); i++, j++) {
+            final int row = j;
+            var values = existingDs.getColumns()
+                    .stream()
+                    .map(cl -> existingDs.getValueAt(row, cl.getId()))
+                    .toArray(Object[]::new);
+            dataSet.addValues(values);
+        }
+    }
+
     private void doLookup(DataSetLookup lookup, DataSetReadyCallback listener) {
         try {
             var result = clientDataSetManager.lookupDataSet(lookup);
@@ -236,11 +258,14 @@ public class ExternalDataSetClientProvider {
 
     private void handleCache(String uuid) {
         var def = externalDataSets.get(uuid);
+        if (def == null || def.isAccumulate()) {
+            return;
+        }
         scheduledTimeouts.computeIfPresent(uuid, (k, v) -> {
             DomGlobal.clearTimeout(v);
             return null;
         });
-        if (def != null && def.isCacheEnabled()) {
+        if (def.isCacheEnabled()) {
             var refreshTimeAmount = def.getRefreshTimeAmount();
             if (refreshTimeAmount != null) {
                 var id = DomGlobal.setTimeout(params -> {
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/services/RuntimeDataSetClientServices.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/services/RuntimeDataSetClientServices.java
index d9ba619fba..a70e08c35b 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/services/RuntimeDataSetClientServices.java
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/main/java/org/dashbuilder/client/services/RuntimeDataSetClientServices.java
@@ -140,7 +140,7 @@ public class RuntimeDataSetClientServices implements DataSetClientServices {
     @Override
     public void lookupDataSet(DataSetDef def, DataSetLookup lookup, DataSetReadyCallback listener) throws Exception {
         var clientDataSet = clientDataSetManager.lookupDataSet(lookup);
-        if (clientDataSet != null) {
+        if (!isAccumulate(lookup.getDataSetUUID()) && clientDataSet != null) {
             listener.callback(clientDataSet);
             return;
         }
@@ -151,7 +151,7 @@ public class RuntimeDataSetClientServices implements DataSetClientServices {
 
                     @Override
                     public boolean onError(ClientRuntimeError error) {
-                        if (loader.isEditor() || loader.isClient() ) {
+                        if (loader.isEditor() || loader.isClient()) {
                             listener.onError(error);
                         } else {
                             DomGlobal.console.debug("Error retrieving dataset from client, trying from backend");
@@ -172,6 +172,10 @@ public class RuntimeDataSetClientServices implements DataSetClientServices {
                 });
     }
 
+    private boolean isAccumulate(String uuid) {
+        return externalDataSetClientProvider.get(uuid).map(def -> def.isAccumulate()).orElse(false);
+    }
+
     @Override
     public void lookupDataSet(DataSetLookup request, DataSetReadyCallback listener) throws Exception {
         this.lookupDataSet(null, request, listener);
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/test/java/org/dashbuilder/client/external/ExternalDataSetClientProviderTest.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/test/java/org/dashbuilder/client/external/ExternalDataSetClientProviderTest.java
new file mode 100644
index 0000000000..d4bf5f1c03
--- /dev/null
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-client/src/test/java/org/dashbuilder/client/external/ExternalDataSetClientProviderTest.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.dashbuilder.client.external;
+
+import org.dashbuilder.dataset.def.ExternalDataSetDef;
+import org.dashbuilder.dataset.json.ExternalDataSetJSONParser;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class ExternalDataSetClientProviderTest {
+
+    private ExternalDataSetJSONParser externalParser;
+
+    private ExternalDataSetClientProvider provider;
+
+    @Before
+    public void prepare() {
+        externalParser = new ExternalDataSetJSONParser(null);
+        provider = new ExternalDataSetClientProvider();
+    }
+
+    @Test
+    public void accumulateDataSetTest() {
+        var provider = new ExternalDataSetClientProvider();
+
+        var def = new ExternalDataSetDef();
+        def.setAccumulate(true);
+
+        var existingDs = externalParser.parseDataSet("[[2], [1]]");
+        var ds = externalParser.parseDataSet("[[3]]");
+
+        existingDs.setDefinition(def);
+        ds.setDefinition(def);
+        provider.accumulateDataSet(ds, existingDs);
+
+        assertEquals(3, ds.getRowCount());
+    }
+
+    @Test
+    public void accumulateDataSetOverflowTest() {
+        var def = new ExternalDataSetDef();
+        def.setAccumulate(true);
+        def.setCacheMaxRows(2);
+
+        var existingDs = externalParser.parseDataSet("[[2], [1]]");
+        var ds = externalParser.parseDataSet("[[3]]");
+
+        existingDs.setDefinition(def);
+        ds.setDefinition(def);
+        provider.accumulateDataSet(ds, existingDs);
+
+        assertEquals(2, ds.getRowCount());
+        assertEquals(3.0, ds.getValueAt(0, 0));
+        assertEquals(2.0, ds.getValueAt(1, 0));
+    }
+
+    @Test(expected = RuntimeException.class)
+    public void accumulateIncompatibleDataSetsTest() {
+        var def = new ExternalDataSetDef();
+        def.setAccumulate(true);
+        def.setCacheMaxRows(2);
+
+        var existingDs = externalParser.parseDataSet("[[1]]");
+        var ds = externalParser.parseDataSet("[[\"a\", 1]]");
+
+        existingDs.setDefinition(def);
+        ds.setDefinition(def);
+
+        provider.accumulateDataSet(ds, existingDs);
+    }
+
+}
diff --git a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/test/java/org/dashbuilder/shared/marshalling/RuntimeModelJSONMarshallerTest.java b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/test/java/org/dashbuilder/shared/marshalling/RuntimeModelJSONMarshallerTest.java
index 86ab8c4763..d34209dd99 100644
--- a/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/test/java/org/dashbuilder/shared/marshalling/RuntimeModelJSONMarshallerTest.java
+++ b/packages/dashbuilder/dashbuilder-runtime-parent/dashbuilder-runtime-shared/src/test/java/org/dashbuilder/shared/marshalling/RuntimeModelJSONMarshallerTest.java
@@ -62,7 +62,8 @@ public class RuntimeModelJSONMarshallerTest {
             "      \"pushMaxSize\": 1024,\n" + 
             "      \"refreshAlways\": false,\n" + 
             "      \"dynamic\": false,\n" + 
-            "      \"url\": \"http://acme.com\"\n" + 
+            "      \"url\": \"http://acme.com\",\n" +
+            "      \"accumulate\": false\n" +
             "    }\n" + 
             "  ],\n" + 
             "  \"properties\": {\n" + 
diff --git a/packages/dashbuilder/dashbuilder-shared/dashbuilder-displayer-api/src/main/java/org/dashbuilder/displayer/DisplayerSettings.java b/packages/dashbuilder/dashbuilder-shared/dashbuilder-displayer-api/src/main/java/org/dashbuilder/displayer/DisplayerSettings.java
index 674a150ca0..14b57909d6 100644
--- a/packages/dashbuilder/dashbuilder-shared/dashbuilder-displayer-api/src/main/java/org/dashbuilder/displayer/DisplayerSettings.java
+++ b/packages/dashbuilder/dashbuilder-shared/dashbuilder-displayer-api/src/main/java/org/dashbuilder/displayer/DisplayerSettings.java
@@ -379,7 +379,9 @@ public class DisplayerSettings {
     }
 
     public boolean isFilterEnabled() {
-        return parseBoolean(settings.get(getSettingPath(DisplayerAttributeDef.FILTER_ENABLED))) || isFilterListeningEnabled() || isFilterNotificationEnabled();
+        return parseBoolean(settings.get(getSettingPath(DisplayerAttributeDef.FILTER_ENABLED))) ||
+               isFilterListeningEnabled() ||
+               isFilterNotificationEnabled();
     }
 
     public void setFilterEnabled(boolean filterEnabled) {
diff --git a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/def/ExternalDataSetDef.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/def/ExternalDataSetDef.java
index 9312f97559..e567e2eda6 100644
--- a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/def/ExternalDataSetDef.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/def/ExternalDataSetDef.java
@@ -38,6 +38,8 @@ public class ExternalDataSetDef extends DataSetDef {
 
     private Map<String, String> headers;
 
+    private boolean accumulate;
+
     public ExternalDataSetDef() {
         super.setProvider(DataSetProviderType.EXTERNAL);
     }
@@ -89,6 +91,14 @@ public class ExternalDataSetDef extends DataSetDef {
         this.headers = headers;
     }
 
+    public boolean isAccumulate() {
+        return accumulate;
+    }
+
+    public void setAccumulate(boolean accumulate) {
+        this.accumulate = accumulate;
+    }
+
     @Override
     public DataSetDef clone() {
         var def = new ExternalDataSetDef();
@@ -96,6 +106,7 @@ public class ExternalDataSetDef extends DataSetDef {
         def.setUrl(getUrl());
         def.setDynamic(isDynamic());
         def.setHeaders(getHeaders());
+        def.setAccumulate(isAccumulate());
         return def;
     }
 
@@ -112,7 +123,8 @@ public class ExternalDataSetDef extends DataSetDef {
                dynamic == other.dynamic &&
                Objects.equals(expression, other.expression) &&
                Objects.equals(headers, other.headers) &&
-               Objects.equals(url, other.url);
+               Objects.equals(url, other.url) &&
+               Objects.equals(accumulate, other.accumulate);
     }
 
     public String toString() {
@@ -126,7 +138,8 @@ public class ExternalDataSetDef extends DataSetDef {
         out.append("Dynamic=").append(dynamic).append("\n");
         out.append("Expression=").append(expression).append("\n");
         out.append("Content=").append(content).append("\n");
-        out.append("Headers=").append(headers);
+        out.append("Headers=").append(headers).append("\n");
+        out.append("Accumulate=").append(accumulate);
         return out.toString();
     }
 
diff --git a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/group/AggregateFunctionType.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/group/AggregateFunctionType.java
index 2b12efcce1..abadc7fed1 100644
--- a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/group/AggregateFunctionType.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/group/AggregateFunctionType.java
@@ -24,13 +24,17 @@ import org.dashbuilder.dataset.ColumnType;
  * List of available aggregate functions used in data set group operations.
  */
 public enum AggregateFunctionType {
+
     COUNT,
     DISTINCT,
     AVERAGE,
     SUM,
     MIN,
     MAX,
-    MEDIAN;
+    MEDIAN,
+    JOIN,
+    JOIN_COMMA,
+    JOIN_HYPHEN;
 
     private static AggregateFunctionType[] _typeArray = values();
     private static List<AggregateFunctionType> _numericOnly = Arrays.asList(AVERAGE, MEDIAN, SUM, MAX, MIN);
@@ -38,7 +42,8 @@ public enum AggregateFunctionType {
     public int getIndex() {
         for (int i = 0; i < _typeArray.length; i++) {
             AggregateFunctionType type = _typeArray[i];
-            if (this.equals(type)) return i;
+            if (this.equals(type))
+                return i;
         }
         return -1;
     }
@@ -51,9 +56,14 @@ public enum AggregateFunctionType {
     }
 
     public ColumnType getResultType(ColumnType columnType) {
-        if (columnType != null &&  (MIN.equals(this) || MAX.equals(this))) {
+        if (columnType != null && (MIN.equals(this) || MAX.equals(this))) {
             return columnType;
         }
+        if (JOIN.equals(this) ||
+            JOIN_COMMA.equals(this) ||
+            JOIN_HYPHEN.equals(this)) {
+            return ColumnType.TEXT;
+        }
         return ColumnType.NUMBER;
     }
 
diff --git a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/json/ExternalDataSetJSONParser.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/json/ExternalDataSetJSONParser.java
index c2468679ca..22975dfc2c 100644
--- a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/json/ExternalDataSetJSONParser.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/json/ExternalDataSetJSONParser.java
@@ -144,7 +144,6 @@ public class ExternalDataSetJSONParser {
                 dataSet.addColumn(id, type);
             }
         }
-
     }
 
     private void addValues(DataSet dataSet, JsonArray valuesArray) {
diff --git a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/json/ExternalDefJSONMarshaller.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/json/ExternalDefJSONMarshaller.java
index c8048518ec..fa4ce701c4 100644
--- a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/json/ExternalDefJSONMarshaller.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-api/src/main/java/org/dashbuilder/dataset/json/ExternalDefJSONMarshaller.java
@@ -33,6 +33,7 @@ public class ExternalDefJSONMarshaller implements DataSetDefJSONMarshallerExt<Ex
     public static final String EXPRESSION = "expression";
     public static final String CONTENT = "content";
     public static final String HEADERS = "headers";
+    public static final String ACCUMULATE = "accumulate";
 
     @Override
     public void fromJson(ExternalDataSetDef def, JsonObject json) {
@@ -41,6 +42,7 @@ public class ExternalDefJSONMarshaller implements DataSetDefJSONMarshallerExt<Ex
         var content = json.getString(CONTENT);
         var expression = json.getString(EXPRESSION);
         var headers = json.getObject(HEADERS);
+        var accumulate = json.getBoolean(ACCUMULATE);
         
         if (isBlank(url) && isBlank(content)) {
             throw new IllegalArgumentException("External Data Sets must have \"url\" or \"content\" field");
@@ -64,6 +66,7 @@ public class ExternalDefJSONMarshaller implements DataSetDefJSONMarshallerExt<Ex
         }
 
         def.setDynamic(dynamic);
+        def.setAccumulate(accumulate);
     }
 
     @Override
@@ -72,6 +75,7 @@ public class ExternalDefJSONMarshaller implements DataSetDefJSONMarshallerExt<Ex
         json.put(URL, def.getUrl());
         json.put(EXPRESSION, def.getExpression());
         json.put(CONTENT, def.getContent());
+        json.put(ACCUMULATE, def.isAccumulate());
 
         if (def.getHeaders() != null) {
             var headers = Json.createObject();
diff --git a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/SharedDataSetOpEngine.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/SharedDataSetOpEngine.java
index a366a4d172..e757f0b823 100644
--- a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/SharedDataSetOpEngine.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/SharedDataSetOpEngine.java
@@ -491,7 +491,8 @@ public class SharedDataSetOpEngine implements DataSetOpEngine {
                     // Columns based on aggregation functions
                     AggregateFunctionType aggF = gf.getFunction();
                     if (aggF != null) {
-                        DataColumnImpl column = new DataColumnImpl(columnId, ColumnType.NUMBER);
+                        var columnType = aggF.getResultType(null);
+                        DataColumnImpl column = new DataColumnImpl(columnId, columnType);
                         column.setGroupFunction(gf);
                         result.addColumn(column);
                     }
diff --git a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/AggregateFunctionManagerImpl.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/AggregateFunctionManagerImpl.java
index 99304f972f..a843051b9e 100755
--- a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/AggregateFunctionManagerImpl.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/AggregateFunctionManagerImpl.java
@@ -39,6 +39,9 @@ public class AggregateFunctionManagerImpl implements AggregateFunctionManager {
         registerFunction(new MedianFunction());
         registerFunction(new MaxFunction());
         registerFunction(new MinFunction());
+        registerFunction(new JoinFunction());
+        registerFunction(new JoinCommaFunction());
+        registerFunction(new JoinHyphenFunction());
     }
 
     public Collection<AggregateFunction> getAllFunctions() {
diff --git a/packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApiService.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/JoinCommaFunction.java
similarity index 52%
copy from packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApiService.java
copy to packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/JoinCommaFunction.java
index f4ae0bc6a4..60147152c6 100644
--- a/packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApiService.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/JoinCommaFunction.java
@@ -1,11 +1,11 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ *       http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -13,18 +13,21 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package org.dashbuilder.dataset.engine.function;
 
-package org.appformer.kogito.bridge.client.diagramApi;
+import org.dashbuilder.dataset.group.AggregateFunctionType;
 
-/**
- * A {@link DiagramApi} implementation used when envelope API is available
- */
-public class DiagramApiService implements DiagramApi {
+public class JoinCommaFunction extends JoinFunction {
+
+    private static final CharSequence COMMA = ", ";
 
+    public JoinCommaFunction() {
+        super(COMMA);
+    }
+    
     @Override
-    public void onNodeSelected(final String nodeName) {
-        if (nodeName != null) {
-            DiagramApiInteropWrapper.get().onNodeSelected(nodeName);
-        }
+    public AggregateFunctionType getType() {
+        return AggregateFunctionType.JOIN_COMMA;
     }
-}
+
+}
\ No newline at end of file
diff --git a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/MedianFunction.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/JoinFunction.java
similarity index 63%
copy from packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/MedianFunction.java
copy to packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/JoinFunction.java
index db22583660..fbf84b3ef0 100644
--- a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/MedianFunction.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/JoinFunction.java
@@ -18,44 +18,34 @@ package org.dashbuilder.dataset.engine.function;
 import java.util.List;
 import java.util.stream.Collectors;
 
+import org.dashbuilder.dataset.group.AggregateFunction;
 import org.dashbuilder.dataset.group.AggregateFunctionType;
 
-/**
- * It calculates the average value of a set of numbers.
- */
-public class MedianFunction extends AbstractFunction {
+public class JoinFunction implements AggregateFunction {
+
+    private static final CharSequence DEFAULT_DELIMITER = " ";
+    private CharSequence delimiter;
+
+    public JoinFunction() {
+        this(DEFAULT_DELIMITER);
+    }
 
-    public MedianFunction() {
+    public JoinFunction(CharSequence delimiter) {
         super();
+        this.delimiter = delimiter;
     }
 
+    @Override
     public AggregateFunctionType getType() {
-        return AggregateFunctionType.MEDIAN;
+        return AggregateFunctionType.JOIN;
     }
 
+    @Override
     public Object aggregate(List values) {
-        if (values == null || values.isEmpty()) {
-            return 0d;
-        }
-
-        var n = values.size();
-
-        if (n == 1) {
-            return ((Number) values.get(0)).doubleValue();
-        }
-
-        var sortedValues = values.stream().mapToDouble(v -> ((Number) v).doubleValue()).sorted().toArray();
-
-        if (n % 2 == 1) {
-            return sortedValues[n / 2];
-        }
-        var middle = n / 2;
-        var ii = n == 2 ? 0 : middle - 1;
-        var is = n == 2 ? 1 : middle + 1;
-        var v = (sortedValues[ii] + sortedValues[is]) / 2d;
-        return round(v, precission);
+        return values.stream().collect(Collectors.joining(delimiter));
     }
 
+    @Override
     public Object aggregate(List values, List<Integer> rows) {
         if (rows == null) {
             return aggregate(values);
diff --git a/packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApiService.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/JoinHyphenFunction.java
similarity index 50%
copy from packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApiService.java
copy to packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/JoinHyphenFunction.java
index f4ae0bc6a4..7be2e9b4cd 100644
--- a/packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApiService.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/JoinHyphenFunction.java
@@ -1,11 +1,11 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ *       http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -13,18 +13,22 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package org.dashbuilder.dataset.engine.function;
 
-package org.appformer.kogito.bridge.client.diagramApi;
+import org.dashbuilder.dataset.group.AggregateFunctionType;
 
-/**
- * A {@link DiagramApi} implementation used when envelope API is available
- */
-public class DiagramApiService implements DiagramApi {
+public class JoinHyphenFunction extends JoinFunction {
+
+    // line break compatible with Javascript
+    private static final CharSequence HYPHEN = " - ";
 
+    public JoinHyphenFunction() {
+        super(HYPHEN);
+    }
+    
     @Override
-    public void onNodeSelected(final String nodeName) {
-        if (nodeName != null) {
-            DiagramApiInteropWrapper.get().onNodeSelected(nodeName);
-        }
+    public AggregateFunctionType getType() {
+        return AggregateFunctionType.JOIN_HYPHEN;
     }
-}
+
+}
\ No newline at end of file
diff --git a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/MedianFunction.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/MedianFunction.java
index db22583660..5821a6b935 100644
--- a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/MedianFunction.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/main/java/org/dashbuilder/dataset/engine/function/MedianFunction.java
@@ -51,7 +51,7 @@ public class MedianFunction extends AbstractFunction {
         }
         var middle = n / 2;
         var ii = n == 2 ? 0 : middle - 1;
-        var is = n == 2 ? 1 : middle + 1;
+        var is = n == 2 ? 1 : middle;
         var v = (sortedValues[ii] + sortedValues[is]) / 2d;
         return round(v, precission);
     }
diff --git a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/test/java/org/dashbuilder/dataset/engine/function/AggregateFunctionsTest.java b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/test/java/org/dashbuilder/dataset/engine/function/AggregateFunctionsTest.java
index 6dc1faf2f2..f8c2ebe05b 100644
--- a/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/test/java/org/dashbuilder/dataset/engine/function/AggregateFunctionsTest.java
+++ b/packages/dashbuilder/kie-soup-dataset/kie-soup-dataset-shared/src/test/java/org/dashbuilder/dataset/engine/function/AggregateFunctionsTest.java
@@ -351,5 +351,43 @@ public class AggregateFunctionsTest {
         values = List.of(1);
         result = function.aggregate(values);
         assertEquals(result, 1.0d);
+
+        values = List.of(1, 2, 3, 3, 4, 5);
+        result = function.aggregate(values);
+        assertEquals(3d, result);
+
+        values = List.of(1, 3, 3, 4);
+        result = function.aggregate(values);
+        assertEquals(3d, result);
+    }
+
+    @Test
+    public void testJoinFunction() {
+        var function = new JoinFunction();
+        var values = List.of("a", "b", "c");
+        var result = function.aggregate(values);
+        assertEquals("a b c", result);
+
+        values = List.of();
+        result = function.aggregate(values);
+        assertEquals("", result);
     }
+
+    @Test
+    public void testJoinCommaFunction() {
+        var function = new JoinCommaFunction();
+        var values = List.of("a", "b", "c");
+        var result = function.aggregate(values);
+        assertEquals("a, b, c", result);
+    }
+
+    @Test
+    public void testJoinHyphenFunction() {
+        var function = new JoinHyphenFunction();
+        var values = List.of("a", "b", "c");
+        var result = function.aggregate(values);
+        assertEquals("a - b - c", result);
+
+    }
+
 }
diff --git a/packages/dmn-dev-deployment-form-webapp/src/DmnFormToolbar.tsx b/packages/dmn-dev-deployment-form-webapp/src/DmnFormToolbar.tsx
index 32d7284d12..b64c5e03af 100644
--- a/packages/dmn-dev-deployment-form-webapp/src/DmnFormToolbar.tsx
+++ b/packages/dmn-dev-deployment-form-webapp/src/DmnFormToolbar.tsx
@@ -148,8 +148,10 @@ export function DmnFormToolbar(props: Props) {
             <Brand
               src={routes.static.images.kieHorizontalLogoReverse.path({})}
               alt={"Logo"}
-              style={{ display: "inline", height: "38px" }}
-            />
+              heights={{ default: "38px" }}
+            >
+              <source srcSet={routes.static.images.kieHorizontalLogoReverse.path({})} />
+            </Brand>
           </FlexItem>
           <FlexItem style={{ display: "flex", alignItems: "center" }}>
             <TextContent>
diff --git a/packages/serverless-workflow-diagram-editor-envelope/src/api/ServerlessWorkflowDiagramEditorChannelApi.ts b/packages/dmn-language-service/src/DmnDecision.ts
similarity index 58%
copy from packages/serverless-workflow-diagram-editor-envelope/src/api/ServerlessWorkflowDiagramEditorChannelApi.ts
copy to packages/dmn-language-service/src/DmnDecision.ts
index d75abcad08..0df4449489 100644
--- a/packages/serverless-workflow-diagram-editor-envelope/src/api/ServerlessWorkflowDiagramEditorChannelApi.ts
+++ b/packages/dmn-language-service/src/DmnDecision.ts
@@ -1,11 +1,11 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *        http://www.apache.org/licenses/LICENSE-2.0
+ *       http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,8 +14,10 @@
  * limitations under the License.
  */
 
-import { KogitoEditorChannelApi } from "@kie-tools-core/editor/dist/api";
+export class DmnDecision {
+  public readonly name: string;
 
-export interface ServerlessWorkflowDiagramEditorChannelApi extends KogitoEditorChannelApi {
-  kogitoSwfDiagramEditor__onNodeSelected(args: { nodeName: string; documentUri?: string }): void;
+  constructor(name: string) {
+    this.name = name;
+  }
 }
diff --git a/packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApi.java b/packages/dmn-language-service/src/DmnDocumentData.ts
similarity index 53%
copy from packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApi.java
copy to packages/dmn-language-service/src/DmnDocumentData.ts
index adf0b33bbf..68b80707f6 100644
--- a/packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApi.java
+++ b/packages/dmn-language-service/src/DmnDocumentData.ts
@@ -1,11 +1,11 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ *       http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,17 +14,16 @@
  * limitations under the License.
  */
 
-package org.appformer.kogito.bridge.client.diagramApi;
+import { DmnDecision } from "./DmnDecision";
 
-/**
- * Api for diagram window interactions.
- */
-public interface DiagramApi {
-
-    /**
-     * Move the cursor in the text editor to a specified node
-     * @param nodeName the name of the target node
-     */
-    void onNodeSelected(String nodeName);
+export class DmnDocumentData {
+  public readonly namespace: string;
+  public readonly name: string;
+  public readonly decisions: DmnDecision[];
 
+  constructor(namespace: string, name: string, models: DmnDecision[]) {
+    this.namespace = namespace;
+    this.name = name;
+    this.decisions = models;
+  }
 }
diff --git a/packages/dmn-language-service/src/index.ts b/packages/dmn-language-service/src/index.ts
index c3d2812e6c..3dd2b36878 100644
--- a/packages/dmn-language-service/src/index.ts
+++ b/packages/dmn-language-service/src/index.ts
@@ -14,10 +14,20 @@
  * limitations under the License.
  */
 
+import { DmnDocumentData } from "./DmnDocumentData";
+import { DmnDecision } from "./DmnDecision";
+
+export * from "./DmnDocumentData";
+
 const IMPORT = "import";
 const INPUT_DATA = "inputData";
 const XML_MIME = "text/xml";
 const LOCATION_URI_ATTRIBUTE = "locationURI";
+const DECISION_NAME_ATTRIBUTE = "name";
+const NAMESPACE = "namespace";
+const DMN_NAME = "name";
+const DECISION = "decision";
+const DEFINITIONS = "definitions";
 
 export interface DmnLanguageServiceImportedModel {
   content: string;
@@ -28,6 +38,8 @@ export class DmnLanguageService {
   private readonly parser = new DOMParser();
   private readonly importTagRegExp = new RegExp(`([a-z]*:)?(${IMPORT})`);
   private readonly inputDataRegEx = new RegExp(`([a-z]*:)?(${INPUT_DATA})`);
+  private readonly decisionsTagRegExp = new RegExp(`([a-z]*:)?(${DECISION})`);
+  private readonly definitionsTagRegExp = new RegExp(`([a-z]*:)?(${DEFINITIONS})`);
 
   constructor(
     private readonly args: {
@@ -67,6 +79,23 @@ export class DmnLanguageService {
     return "";
   }
 
+  public getDmnDocumentData(dmnContent: string): DmnDocumentData {
+    const xmlContent = this.parser.parseFromString(dmnContent, XML_MIME);
+    const definitionsTag = this.definitionsTagRegExp.exec(dmnContent);
+    const definitions = xmlContent.getElementsByTagName(definitionsTag ? definitionsTag[0] : DEFINITIONS);
+    const definition = definitions[0];
+    const namespace = definition.getAttribute(NAMESPACE);
+    const dmnModelName = definition.getAttribute(DMN_NAME);
+
+    const dmnDecisions = this.decisionsTagRegExp.exec(dmnContent);
+    const dmnDecisionsContent = xmlContent.getElementsByTagName(dmnDecisions ? dmnDecisions[0] : DECISION);
+
+    const decisions = Array.from(dmnDecisionsContent)
+      .map((decision) => decision.getAttribute(DECISION_NAME_ATTRIBUTE))
+      .flatMap((decisionName) => (decisionName ? [new DmnDecision(decisionName)] : []));
+    return new DmnDocumentData(namespace ?? "", dmnModelName ?? "", decisions);
+  }
+
   // recursively get imported models
   public async getAllImportedModelsResources(modelsContent: string[]): Promise<DmnLanguageServiceImportedModel[]> {
     // get imported models resources
diff --git a/packages/dmn-language-service/tests/fixtures/decisions.dmn b/packages/dmn-language-service/tests/fixtures/decisions.dmn
new file mode 100644
index 0000000000..d31e9c2e2c
--- /dev/null
+++ b/packages/dmn-language-service/tests/fixtures/decisions.dmn
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<dmn:definitions xmlns:dmn="http://www.omg.org/spec/DMN/20180521/MODEL/" xmlns="https://kiegroup.org/dmn/_57B8BED3-0077-4154-8435-30E57EA6F02E" xmlns:feel="http://www.omg.org/spec/DMN/20180521/FEEL/" xmlns:kie="http://www.drools.org/kie/dmn/1.2" xmlns:dmndi="http://www.omg.org/spec/DMN/20180521/DMNDI/" xmlns:di="http://www.omg.org/spec/DMN/20180521/DI/" xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/" id="_69FF465F-72D8-4541-9916-99174CC60EDC" name="My Model Name" typeLanguage="http:/ [...]
+  <dmn:extensionElements/>
+  <dmn:decision id="_DBFC1810-89DF-4FD8-9D42-2C87C29354AC" name="Decision-1">
+    <dmn:extensionElements/>
+    <dmn:variable id="_17C7D2CE-047B-46A8-A2DC-3C3256EDA5E7" name="Decision-1"/>
+  </dmn:decision>
+  <dmn:decision id="_49CDEC14-8D60-408A-9EAB-523E59E2FFAF" name="Decision-2">
+    <dmn:extensionElements/>
+    <dmn:variable id="_A5ECF5B2-278B-487D-A9F4-0C3DF2C25042" name="Decision-2"/>
+    <dmn:informationRequirement id="_E69C6AD0-0BBA-4126-8C0C-7C7381646EEA">
+      <dmn:requiredDecision href="#_DBFC1810-89DF-4FD8-9D42-2C87C29354AC"/>
+    </dmn:informationRequirement>
+  </dmn:decision>
+  <dmn:decision id="_52F81D8D-5FA7-4300-A855-C8CE88D4B825" name="Decision-3">
+    <dmn:extensionElements/>
+    <dmn:variable id="_BD33A344-7F8F-4B18-9535-7ED4041664CB" name="Decision-3"/>
+    <dmn:informationRequirement id="_97E802F2-AFE9-4461-A575-6D8A3B05FD55">
+      <dmn:requiredDecision href="#_49CDEC14-8D60-408A-9EAB-523E59E2FFAF"/>
+    </dmn:informationRequirement>
+  </dmn:decision>
+  <dmndi:DMNDI>
+    <dmndi:DMNDiagram id="_B708E43A-EB44-4DAB-8098-0883E470865F" name="DRG">
+      <di:extension>
+        <kie:ComponentsWidthsExtension/>
+      </di:extension>
+      <dmndi:DMNShape id="dmnshape-drg-_DBFC1810-89DF-4FD8-9D42-2C87C29354AC" dmnElementRef="_DBFC1810-89DF-4FD8-9D42-2C87C29354AC" isCollapsed="false">
+        <dmndi:DMNStyle>
+          <dmndi:FillColor red="255" green="255" blue="255"/>
+          <dmndi:StrokeColor red="0" green="0" blue="0"/>
+          <dmndi:FontColor red="0" green="0" blue="0"/>
+        </dmndi:DMNStyle>
+        <dc:Bounds x="130" y="126" width="100" height="50"/>
+        <dmndi:DMNLabel/>
+      </dmndi:DMNShape>
+      <dmndi:DMNShape id="dmnshape-drg-_49CDEC14-8D60-408A-9EAB-523E59E2FFAF" dmnElementRef="_49CDEC14-8D60-408A-9EAB-523E59E2FFAF" isCollapsed="false">
+        <dmndi:DMNStyle>
+          <dmndi:FillColor red="255" green="255" blue="255"/>
+          <dmndi:StrokeColor red="0" green="0" blue="0"/>
+          <dmndi:FontColor red="0" green="0" blue="0"/>
+        </dmndi:DMNStyle>
+        <dc:Bounds x="130" y="-4" width="100" height="50"/>
+        <dmndi:DMNLabel/>
+      </dmndi:DMNShape>
+      <dmndi:DMNShape id="dmnshape-drg-_52F81D8D-5FA7-4300-A855-C8CE88D4B825" dmnElementRef="_52F81D8D-5FA7-4300-A855-C8CE88D4B825" isCollapsed="false">
+        <dmndi:DMNStyle>
+          <dmndi:FillColor red="255" green="255" blue="255"/>
+          <dmndi:StrokeColor red="0" green="0" blue="0"/>
+          <dmndi:FontColor red="0" green="0" blue="0"/>
+        </dmndi:DMNStyle>
+        <dc:Bounds x="130" y="-134" width="100" height="50"/>
+        <dmndi:DMNLabel/>
+      </dmndi:DMNShape>
+      <dmndi:DMNEdge id="dmnedge-drg-_E69C6AD0-0BBA-4126-8C0C-7C7381646EEA-AUTO-SOURCE-AUTO-TARGET" dmnElementRef="_E69C6AD0-0BBA-4126-8C0C-7C7381646EEA">
+        <di:waypoint x="180" y="126"/>
+        <di:waypoint x="180" y="46"/>
+      </dmndi:DMNEdge>
+      <dmndi:DMNEdge id="dmnedge-drg-_97E802F2-AFE9-4461-A575-6D8A3B05FD55-AUTO-SOURCE-AUTO-TARGET" dmnElementRef="_97E802F2-AFE9-4461-A575-6D8A3B05FD55">
+        <di:waypoint x="180" y="-4"/>
+        <di:waypoint x="180" y="-84"/>
+      </dmndi:DMNEdge>
+    </dmndi:DMNDiagram>
+  </dmndi:DMNDI>
+</dmn:definitions>
\ No newline at end of file
diff --git a/packages/dmn-language-service/tests/index.test.ts b/packages/dmn-language-service/tests/index.test.ts
index 4ca4da7309..92e0dc3f4e 100644
--- a/packages/dmn-language-service/tests/index.test.ts
+++ b/packages/dmn-language-service/tests/index.test.ts
@@ -14,10 +14,11 @@
  * limitations under the License.
  */
 
-import { DmnLanguageService } from "../src";
+import { DmnDocumentData, DmnLanguageService } from "../src";
 import { readFile } from "fs/promises";
 import { readFileSync } from "fs";
 import { resolve } from "path";
+import { DmnDecision } from "../src/DmnDecision";
 
 const tests = [
   { modelPath: "./fixtures/model.dmn", expected: ["recursive.dmn", "nested.dmn"] },
@@ -90,4 +91,26 @@ describe("DmnLanguageService", () => {
 
     expect(await service.getAllImportedModelsResources([fileRecursive])).toEqual([expected]);
   });
+
+  it("getDmnDocumentData - get decisions", async () => {
+    const pathRecursive = resolve(__dirname, "./fixtures/decisions.dmn");
+    const fileRecursive = readFileSync(pathRecursive, "utf8");
+
+    const pathNested = resolve(__dirname, "./fixtures/nested.dmn");
+    const fileNested = readFileSync(pathNested, "utf8");
+
+    const expected = {
+      relativePath: pathNested,
+      content: fileNested,
+    };
+
+    const dmnDocumentData: DmnDocumentData = new DmnDocumentData(
+      "https://kiegroup.org/dmn/_57B8BED3-0077-4154-8435-30E57EA6F02E",
+      "My Model Name",
+      [new DmnDecision("Decision-1"), new DmnDecision("Decision-2"), new DmnDecision("Decision-3")]
+    );
+    const service = new DmnLanguageService({ getDmnImportedModel: () => new Promise((res) => res(expected)) });
+
+    expect(service.getDmnDocumentData(fileRecursive)).toEqual(dmnDocumentData);
+  });
 });
diff --git a/packages/editor/src/api/Editor.ts b/packages/editor/src/api/Editor.ts
index 640c116f45..30aeb69c38 100644
--- a/packages/editor/src/api/Editor.ts
+++ b/packages/editor/src/api/Editor.ts
@@ -43,5 +43,4 @@ export interface EditorApi {
   redo(): Promise<void>;
   validate(): Promise<Notification[]>;
   setTheme(theme: EditorTheme): Promise<void>;
-  selectStateByName?(name: string): Promise<void>;
 }
diff --git a/packages/kie-bc-editors/package.json b/packages/kie-bc-editors/package.json
index c6f40e0131..b921b5ab60 100644
--- a/packages/kie-bc-editors/package.json
+++ b/packages/kie-bc-editors/package.json
@@ -34,6 +34,7 @@
     "@kie-tools-core/operating-system": "workspace:*",
     "@kie-tools-core/vscode-java-code-completion": "workspace:*",
     "@kie-tools-core/workspace": "workspace:*",
+    "@kie-tools/dmn-language-service": "workspace:*",
     "@kie-tools/pmml-editor-marshaller": "workspace:*",
     "@patternfly/react-core": "^4.276.6",
     "react": "^17.0.2",
diff --git a/packages/kie-bc-editors/src/bpmn/envelope/BpmnEditorFactory.ts b/packages/kie-bc-editors/src/bpmn/envelope/BpmnEditorFactory.ts
index d87888b10a..cb3374249e 100644
--- a/packages/kie-bc-editors/src/bpmn/envelope/BpmnEditorFactory.ts
+++ b/packages/kie-bc-editors/src/bpmn/envelope/BpmnEditorFactory.ts
@@ -18,6 +18,16 @@ import { GwtEditorWrapperFactory, XmlFormatter } from "../../common";
 import { BpmnEditorChannelApi, getBpmnLanguageData } from "../api";
 import { EditorFactory, EditorInitArgs, KogitoEditorEnvelopeContextType } from "@kie-tools-core/editor/dist/api";
 import { BpmnEditor, BpmnEditorImpl } from "./BpmnEditor";
+import { DmnLanguageServiceExposedInteropApi } from "./exposedInteropApi/DmnLanguageServiceExposedInteropApi";
+import { DmnLanguageService } from "@kie-tools/dmn-language-service";
+
+export interface CustomWindow extends Window {
+  envelope: {
+    dmnLanguageService: DmnLanguageServiceExposedInteropApi;
+  };
+}
+
+declare let window: CustomWindow;
 
 export class BpmnEditorFactory implements EditorFactory<BpmnEditor, BpmnEditorChannelApi> {
   constructor(private readonly gwtEditorEnvelopeConfig: { shouldLoadResourcesDynamically: boolean }) {}
@@ -26,6 +36,24 @@ export class BpmnEditorFactory implements EditorFactory<BpmnEditor, BpmnEditorCh
     ctx: KogitoEditorEnvelopeContextType<BpmnEditorChannelApi>,
     initArgs: EditorInitArgs
   ): Promise<BpmnEditor> {
+    const dmnLs = new DmnLanguageService({
+      // currently does not need to implement it since we don't need a way to read other Dmn files.
+      getDmnImportedModel: () => Promise.resolve({ relativePath: "", content: "" }),
+    });
+
+    const exposedInteropApi: CustomWindow["envelope"] = {
+      dmnLanguageService: {
+        getDmnDocumentData: (dmnContent) => {
+          return dmnLs.getDmnDocumentData(dmnContent);
+        },
+      },
+    };
+
+    window.envelope = {
+      ...(window.envelope ?? {}),
+      ...exposedInteropApi,
+    };
+
     const languageData = getBpmnLanguageData(initArgs.resourcesPathPrefix);
     const factory = new GwtEditorWrapperFactory<BpmnEditor>(
       languageData,
diff --git a/packages/serverless-workflow-diagram-editor-envelope/src/api/ServerlessWorkflowDiagramEditorChannelApi.ts b/packages/kie-bc-editors/src/bpmn/envelope/exposedInteropApi/DmnDecision.ts
similarity index 58%
copy from packages/serverless-workflow-diagram-editor-envelope/src/api/ServerlessWorkflowDiagramEditorChannelApi.ts
copy to packages/kie-bc-editors/src/bpmn/envelope/exposedInteropApi/DmnDecision.ts
index d75abcad08..0df4449489 100644
--- a/packages/serverless-workflow-diagram-editor-envelope/src/api/ServerlessWorkflowDiagramEditorChannelApi.ts
+++ b/packages/kie-bc-editors/src/bpmn/envelope/exposedInteropApi/DmnDecision.ts
@@ -1,11 +1,11 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *        http://www.apache.org/licenses/LICENSE-2.0
+ *       http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,8 +14,10 @@
  * limitations under the License.
  */
 
-import { KogitoEditorChannelApi } from "@kie-tools-core/editor/dist/api";
+export class DmnDecision {
+  public readonly name: string;
 
-export interface ServerlessWorkflowDiagramEditorChannelApi extends KogitoEditorChannelApi {
-  kogitoSwfDiagramEditor__onNodeSelected(args: { nodeName: string; documentUri?: string }): void;
+  constructor(name: string) {
+    this.name = name;
+  }
 }
diff --git a/packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApi.java b/packages/kie-bc-editors/src/bpmn/envelope/exposedInteropApi/DmnDocumentData.ts
similarity index 53%
copy from packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApi.java
copy to packages/kie-bc-editors/src/bpmn/envelope/exposedInteropApi/DmnDocumentData.ts
index adf0b33bbf..68b80707f6 100644
--- a/packages/serverless-workflow-diagram-editor/appformer-kogito-bridge/src/main/java/org/appformer/kogito/bridge/client/diagramApi/DiagramApi.java
+++ b/packages/kie-bc-editors/src/bpmn/envelope/exposedInteropApi/DmnDocumentData.ts
@@ -1,11 +1,11 @@
 /*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ *       http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,17 +14,16 @@
  * limitations under the License.
  */
 
-package org.appformer.kogito.bridge.client.diagramApi;
+import { DmnDecision } from "./DmnDecision";
 
-/**
- * Api for diagram window interactions.
- */
-public interface DiagramApi {
-
-    /**
-     * Move the cursor in the text editor to a specified node
-     * @param nodeName the name of the target node
-     */
-    void onNodeSelected(String nodeName);
+export class DmnDocumentData {
+  public readonly namespace: string;
+  public readonly name: string;
+  public readonly decisions: DmnDecision[];
 
+  constructor(namespace: string, name: string, models: DmnDecision[]) {
+    this.namespace = namespace;
+    this.name = name;
+    this.decisions = models;
+  }
 }
diff --git a/packages/serverless-workflow-diagram-editor-envelope/src/api/DiagramExposedInteropApi.ts b/packages/kie-bc-editors/src/bpmn/envelope/exposedInteropApi/DmnLanguageServiceExposedInteropApi.ts
similarity index 65%
copy from packages/serverless-workflow-diagram-editor-envelope/src/api/DiagramExposedInteropApi.ts
copy to packages/kie-bc-editors/src/bpmn/envelope/exposedInteropApi/DmnLanguageServiceExposedInteropApi.ts
index c887a0d1d3..99f0643ff0 100644
--- a/packages/serverless-workflow-diagram-editor-envelope/src/api/DiagramExposedInteropApi.ts
+++ b/packages/kie-bc-editors/src/bpmn/envelope/exposedInteropApi/DmnLanguageServiceExposedInteropApi.ts
@@ -1,5 +1,5 @@
-/**
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,15 +14,17 @@
  * limitations under the License.
  */
 
+import { DmnDocumentData } from "./DmnDocumentData";
+
 /**
  * EXPOSED INTEROP API
  *
- * This API is exposed from the Envelope to be consumed on Java code for diagram window interactions.
+ * This API is exposed from the Envelope to be consumed on Java code.
  */
-export interface DiagramExposedInteropApi {
+export interface DmnLanguageServiceExposedInteropApi {
   /**
-   * Event fired when a node is selected
-   * @param nodeName the name of the node
+   * It performs the marshall of a xmlContent retrieved from a DMN file returning a DmnDocumentData
+   * * @param xmlContent
    */
-  onNodeSelected: (nodeName: string) => void;
+  getDmnDocumentData(dmnContent: string): DmnDocumentData;
 }
diff --git a/packages/kie-bc-editors/src/common/GwtEditorWrapper.tsx b/packages/kie-bc-editors/src/common/GwtEditorWrapper.tsx
index 59fcf6b4ff..e3a580c86d 100644
--- a/packages/kie-bc-editors/src/common/GwtEditorWrapper.tsx
+++ b/packages/kie-bc-editors/src/common/GwtEditorWrapper.tsx
@@ -91,7 +91,7 @@ export class GwtEditorWrapper implements Editor {
     return this.gwtEditor.setContent(path, content.trim());
   }
 
-  public selectStateByName(name: string) {
+  public selectStateByName(name: string | null) {
     return this.gwtEditor.selectStateByName(name);
   }
 
diff --git a/packages/kie-bc-editors/src/common/consumedInteropApi/GwtAppFormerConsumedInteropApi.ts b/packages/kie-bc-editors/src/common/consumedInteropApi/GwtAppFormerConsumedInteropApi.ts
index 33e28856de..a095b1ea58 100644
--- a/packages/kie-bc-editors/src/common/consumedInteropApi/GwtAppFormerConsumedInteropApi.ts
+++ b/packages/kie-bc-editors/src/common/consumedInteropApi/GwtAppFormerConsumedInteropApi.ts
@@ -44,7 +44,7 @@ export interface GwtEditor {
   setContent(path: string, content: string): Promise<void>;
   getPreview(): Promise<string | undefined>;
   validate(): Promise<Notification[]>;
-  selectStateByName(name: string): Promise<void>;
+  selectStateByName(name: string | null): Promise<void>;
 }
 
 export class GwtAppFormerConsumedInteropApi {
diff --git a/packages/kie-bc-editors/tests/DummyEditor.tsx b/packages/kie-bc-editors/tests/DummyEditor.tsx
index 1185b292c1..cc5fd9ee56 100644
--- a/packages/kie-bc-editors/tests/DummyEditor.tsx
+++ b/packages/kie-bc-editors/tests/DummyEditor.tsx
@@ -18,8 +18,9 @@ import * as React from "react";
 import { Editor, EditorTheme } from "@kie-tools-core/editor/dist/api";
 import { DEFAULT_RECT } from "@kie-tools-core/guided-tour/dist/api";
 import { Notification } from "@kie-tools-core/notifications/dist/api";
+import { GwtEditor } from "@kie-tools/kie-bc-editors/dist/common/consumedInteropApi/GwtAppFormerConsumedInteropApi";
 
-export class DummyEditor implements Editor {
+export class DummyEditor implements Editor, GwtEditor {
   private ref: DummyEditorComponent;
   public readonly af_componentTitle = "Dummy Editor";
   public readonly af_componentId = "dummy-editor";
@@ -61,7 +62,7 @@ export class DummyEditor implements Editor {
     return Promise.resolve();
   }
 
-  public selectStateByName(_name: string): Promise<void> {
+  public selectStateByName(_name: string | null): Promise<void> {
     return Promise.resolve();
   }
 }
diff --git a/packages/kie-bc-editors/tests/GwtEditorWrapper.test.ts b/packages/kie-bc-editors/tests/GwtEditorWrapper.test.ts
index b8c7226aaa..207873ad1a 100644
--- a/packages/kie-bc-editors/tests/GwtEditorWrapper.test.ts
+++ b/packages/kie-bc-editors/tests/GwtEditorWrapper.test.ts
@@ -58,6 +58,11 @@ describe("GwtEditorWrapper", () => {
     expect(mockEditor.setContent).toHaveBeenCalledWith("path", "a content");
   });
 
+  test("selectStateByName", async () => {
+    await wrapper.selectStateByName("stateName");
+    expect(mockEditor.selectStateByName).toHaveBeenCalledWith("stateName");
+  });
+
   test("af_onOpen removes header", () => {
     const parent = document.createElement("div");
     const workbenchHeaderPanel = document.createElement("div");
diff --git a/packages/kie-editors-standalone/package.json b/packages/kie-editors-standalone/package.json
index 06047771c2..7b5b5916e0 100644
--- a/packages/kie-editors-standalone/package.json
+++ b/packages/kie-editors-standalone/package.json
@@ -62,7 +62,7 @@
     "@types/react-router-dom": "^5.1.7",
     "@types/underscore": "^1.11.2",
     "copy-webpack-plugin": "^11.0.0",
-    "cypress": "^12.5.1",
+    "cypress": "^12.8.1",
     "cypress-file-upload": "^5.0.8",
     "cypress-iframe": "^1.0.1",
     "cypress-log-to-output": "^1.1.2",
diff --git a/packages/online-editor/package.json b/packages/online-editor/package.json
index 0424ec2682..2d9d6d72a6 100644
--- a/packages/online-editor/package.json
+++ b/packages/online-editor/package.json
@@ -99,7 +99,7 @@
     "@types/testing-library__react": "^9.1.2",
     "@types/uuid": "^8.3.0",
     "copy-webpack-plugin": "^11.0.0",
-    "cypress": "^12.5.1",
+    "cypress": "^12.8.1",
     "cypress-file-upload": "^5.0.8",
     "cypress-iframe": "^1.0.1",
     "cypress-log-to-output": "^1.1.2",
diff --git a/packages/online-editor/src/aboutModal/AboutButton.tsx b/packages/online-editor/src/aboutModal/AboutButton.tsx
index e475349e30..eaafcb62ca 100644
--- a/packages/online-editor/src/aboutModal/AboutButton.tsx
+++ b/packages/online-editor/src/aboutModal/AboutButton.tsx
@@ -63,8 +63,10 @@ export const AboutButton: React.FunctionComponent = () => {
                 <Brand
                   src={routes.static.images.kieHorizontalLogoDefault.path({})}
                   alt={"Logo"}
-                  style={{ display: "inline", height: "80px" }}
-                />
+                  heights={{ default: "80px" }}
+                >
+                  <source srcSet={routes.static.images.kieHorizontalLogoDefault.path({})} />
+                </Brand>
               </FlexItem>
               <FlexItem style={{ display: "flex", alignItems: "center" }}>
                 <TextContent>
diff --git a/packages/online-editor/src/accelerators/AcceleratorsHooks.tsx b/packages/online-editor/src/accelerators/AcceleratorsHooks.tsx
index def9232810..a80902aa2a 100644
--- a/packages/online-editor/src/accelerators/AcceleratorsHooks.tsx
+++ b/packages/online-editor/src/accelerators/AcceleratorsHooks.tsx
@@ -42,7 +42,7 @@ import {
   GIT_DEFAULT_BRANCH,
   GIT_ORIGIN_REMOTE_NAME,
 } from "@kie-tools-core/workspaces-git-fs/dist/constants/GitConstants";
-import { isDecision, isScorecard, isWorkflow } from "../envelopeLocator/EditorEnvelopeLocatorFactory";
+import { isOfKind } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
 
 const TEMP_ACCELERATOR_REMOTE_NAME = "__kie-sandbox__accelerator-remote";
 const BACKUP_BRANCH_NAME = "__kie-sandbox__accelerator-backup-branch";
@@ -185,9 +185,9 @@ export function useAcceleratorsDispatch(workspace: ActiveWorkspace) {
           workspaceFiles.map(async (file) => {
             let fileNewDestination: string;
 
-            if (isDecision(file.relativePath) || isScorecard(file.relativePath)) {
+            if (isOfKind("dmn", file.relativePath) || isOfKind("pmml", file.relativePath)) {
               fileNewDestination = accelerator.dmnDestinationFolder;
-            } else if (isWorkflow(file.relativePath)) {
+            } else if (isOfKind("bpmn", file.relativePath)) {
               fileNewDestination = accelerator.bpmnDestinationFolder;
             } else {
               fileNewDestination = accelerator.otherFilesDestinationFolder;
diff --git a/packages/online-editor/src/envelopeLocator/EditorEnvelopeLocatorFactory.ts b/packages/online-editor/src/envelopeLocator/EditorEnvelopeLocatorFactory.ts
index d278130ad8..f8f13e0254 100644
--- a/packages/online-editor/src/envelopeLocator/EditorEnvelopeLocatorFactory.ts
+++ b/packages/online-editor/src/envelopeLocator/EditorEnvelopeLocatorFactory.ts
@@ -20,13 +20,7 @@ import {
   EnvelopeMapping,
 } from "@kie-tools-core/editor/dist/api/EditorEnvelopeLocator";
 
-const REGEX = {
-  supported: /(\.bpmn|\.bpmn2|\.dmn|\.pmml|\.scesim)$/i,
-  dmn: /^.*\.dmn$/i,
-  bpmn: /^.*\.(bpmn|bpmn2)$/i,
-  scesim: /^.*\.scesim$/i,
-  pmml: /^.*\.pmml$/i,
-};
+import { FileTypes, isOfKind } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
 
 export const GLOB_PATTERN = {
   all: "**/*",
@@ -36,14 +30,6 @@ export const GLOB_PATTERN = {
   pmml: "**/*.pmml",
 };
 
-export enum FileTypes {
-  DMN = "dmn",
-  BPMN = "bpmn",
-  BPMN2 = "bpmn2",
-  SCESIM = "scesim",
-  PMML = "pmml",
-}
-
 export const supportedFileExtensionArray = [
   FileTypes.DMN,
   FileTypes.BPMN,
@@ -54,28 +40,12 @@ export const supportedFileExtensionArray = [
 
 export type SupportedFileExtensions = typeof supportedFileExtensionArray[number];
 
-export function isDecision(path: string): boolean {
-  return REGEX.dmn.test(path);
-}
-
-export function isWorkflow(path: string): boolean {
-  return REGEX.bpmn.test(path);
-}
-
-export function isTestScenario(path: string): boolean {
-  return REGEX.scesim.test(path);
-}
-
-export function isScorecard(path: string): boolean {
-  return REGEX.pmml.test(path);
-}
-
 export function isModel(path: string): boolean {
-  return isDecision(path) || isWorkflow(path) || isScorecard(path);
+  return isOfKind("dmn", path) || isOfKind("bpmn", path) || isOfKind("pmml", path);
 }
 
 export function isEditable(path: string): boolean {
-  return isModel(path) || isTestScenario(path);
+  return isModel(path) || isOfKind("scesim", path);
 }
 
 export class EditorEnvelopeLocatorFactory {
diff --git a/packages/online-editor/src/workspace/startupBlockers/StartupBlockerTemplate.tsx b/packages/online-editor/src/workspace/startupBlockers/StartupBlockerTemplate.tsx
index cd4d1a0014..8488dffc14 100644
--- a/packages/online-editor/src/workspace/startupBlockers/StartupBlockerTemplate.tsx
+++ b/packages/online-editor/src/workspace/startupBlockers/StartupBlockerTemplate.tsx
@@ -29,15 +29,17 @@ export function StartupBlockerTemplate(props: { children?: React.ReactNode }) {
       header={
         <Masthead aria-label={"Page header"} display={{ default: "stack" }}>
           <MastheadMain style={{ justifyContent: "space-between" }}>
-            <PageHeaderToolsItem className={"pf-l-flex"}>
+            <PageHeaderToolsItem className={"kie-sandbox--logo"}>
               <MastheadBrand style={{ textDecoration: "none" }}>
                 <Flex alignItems={{ default: "alignItemsCenter" }}>
                   <FlexItem style={{ display: "flex", alignItems: "center" }}>
                     <Brand
                       src={routes.static.images.kieHorizontalLogoReverse.path({})}
                       alt={"Logo"}
-                      style={{ display: "inline", height: "38px" }}
-                    />
+                      heights={{ default: "38px" }}
+                    >
+                      <source srcSet={routes.static.images.kieHorizontalLogoReverse.path({})} />
+                    </Brand>
                   </FlexItem>
                   <FlexItem style={{ display: "flex", alignItems: "center" }}>
                     <TextContent>
diff --git a/packages/pmml-editor/package.json b/packages/pmml-editor/package.json
index 611bdead0c..c6b6871286 100644
--- a/packages/pmml-editor/package.json
+++ b/packages/pmml-editor/package.json
@@ -90,7 +90,7 @@
     "copy-webpack-plugin": "^11.0.0",
     "copyfiles": "^2.4.1",
     "cpr": "^3.0.1",
-    "cypress": "^12.5.1",
+    "cypress": "^12.8.1",
     "cypress-file-upload": "^5.0.8",
     "cypress-iframe": "^1.0.1",
     "cypress-log-to-output": "^1.1.2",
diff --git a/packages/serverless-logic-web-tools/env/index.js b/packages/serverless-logic-web-tools/env/index.js
index 2926081f8f..32c5b70019 100644
--- a/packages/serverless-logic-web-tools/env/index.js
+++ b/packages/serverless-logic-web-tools/env/index.js
@@ -31,6 +31,14 @@ module.exports = composeEnv(
         default: `dev (${process.env.USER}) @ ${new Date().toISOString()}`,
         description: "",
       },
+      SERVERLESS_LOGIC_WEB_TOOLS__version: {
+        default: version,
+        description: "",
+      },
+      SERVERLESS_LOGIC_WEB_TOOLS__samplesRepositoryRef: {
+        default: "main",
+        description: "",
+      },
       SERVERLESS_LOGIC_WEB_TOOLS__gtmId: {
         default: undefined,
         description: "",
@@ -75,6 +83,7 @@ module.exports = composeEnv(
     get env() {
       return {
         serverlessLogicWebTools: {
+          version: getOrDefault(this.vars.SERVERLESS_LOGIC_WEB_TOOLS__version),
           buildInfo: getOrDefault(this.vars.SERVERLESS_LOGIC_WEB_TOOLS__buildInfo),
           gtmId: getOrDefault(this.vars.SERVERLESS_LOGIC_WEB_TOOLS__gtmId),
           dev: {
@@ -101,6 +110,7 @@ module.exports = composeEnv(
             },
           },
           gitCorsProxyUrl: getOrDefault(this.vars.SERVERLESS_LOGIC_WEB_TOOLS__gitCorsProxyUrl),
+          samplesRepositoryRef: getOrDefault(this.vars.SERVERLESS_LOGIC_WEB_TOOLS__samplesRepositoryRef),
         },
       };
     },
diff --git a/packages/serverless-logic-web-tools/it-tests/e2e/CreateNewFile.cy.ts b/packages/serverless-logic-web-tools/it-tests/e2e/CreateNewFile.cy.ts
index a206baff6c..3ecb4b0ba4 100644
--- a/packages/serverless-logic-web-tools/it-tests/e2e/CreateNewFile.cy.ts
+++ b/packages/serverless-logic-web-tools/it-tests/e2e/CreateNewFile.cy.ts
@@ -136,5 +136,8 @@ describe("Serverless Logic Web Tools - Create and edit test", () => {
         cy.ouia({ ouiaId: "hello-text" }).should("have.text", "Hello");
       });
     });
+
+    // check there are no problems in dashbuilder file
+    cy.get("#total-notifications").should("have.text", 0);
   });
 });
diff --git a/packages/serverless-logic-web-tools/it-tests/e2e/TrySample.cy.ts b/packages/serverless-logic-web-tools/it-tests/e2e/TrySample.cy.ts
deleted file mode 100644
index 7425ee4043..0000000000
--- a/packages/serverless-logic-web-tools/it-tests/e2e/TrySample.cy.ts
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-const ctrlOrCmd = Cypress.platform === "darwin" ? "Cmd" : "Ctrl";
-
-describe("Serverless Logic Web Tools - Try samples test", () => {
-  beforeEach(() => {
-    cy.visit("/");
-  });
-
-  it("should check all samples are present", () => {
-    cy.ouia({ ouiaType: "sample-title" }).should(($titles) => {
-      expect($titles).length(6);
-      expect($titles.eq(0)).text("Greetings");
-      expect($titles.eq(1)).text("Greetings with Kafka events");
-      expect($titles.eq(2)).text("Compensation");
-      expect($titles.eq(3)).text("Dashbuilder Kitchensink");
-      expect($titles.eq(4)).text("Products Dashboard");
-      expect($titles.eq(5)).text("Serverless Workflow Report");
-    });
-  });
-
-  it("should check greetings sample", () => {
-    // open greeting example
-    cy.ouia({ ouiaId: "greetings-try-swf-sample-button" }).click();
-    cy.loadEditor();
-
-    // check header type and name
-    cy.ouia({ ouiaId: "file-type-label" }).should("have.text", "Serverless Workflow");
-    cy.ouia({ ouiaId: "file-name-input" }).should("have.value", "greetings");
-
-    cy.getEditor().within(() => {
-      cy.iframe("#kogito-iframe[src='./serverless-workflow-text-editor-envelope.html']").within(() => {
-        // check text editor contains text
-        cy.get(".monaco-editor textarea")
-          .should("contain.value", '"id": "jsongreet"')
-          .should("contain.value", '"name": "Greeting workflow",');
-
-        // check shortcuts modal dialog
-        cy.ouia({ ouiaId: "keyboard-shortcuts-icon" }).click();
-        cy.get(".kie-tools--keyboard-shortcuts.pf-c-modal-box")
-          .should("contain.text", "Keyboard shortcuts")
-          .should("contain.text", `${ctrlOrCmd} + Z`)
-          .should("contain.text", "Undo last edit");
-        cy.get(".kie-tools--keyboard-shortcuts.pf-c-modal-box .pf-c-button").click();
-      });
-
-      cy.iframe("#kogito-iframe[src='./serverless-workflow-diagram-editor-envelope.html']")
-        .trigger("mouseover")
-        .within(() => {
-          // check canvas is present
-          cy.get("#canvasPanel").should("have.descendants", "canvas").should("be.visible");
-
-          // check zoom controls are present
-          cy.ouia({ ouiaId: "zoom-controls-panel" })
-            .should("be.visible")
-            .should("have.descendants", "button[data-ouia-component-id='reset-zoom-button']")
-            .should("have.descendants", "button[data-ouia-component-id='minus-zoom-button']")
-            .should("have.descendants", "button[data-ouia-component-id='plus-zoom-button']")
-            .should("have.descendants", "div[data-ouia-component-id='select-zoom-button']");
-
-          // check shortcuts modal dialog
-          cy.ouia({ ouiaId: "keyboard-shortcuts-icon" }).click();
-          cy.get(".kie-tools--keyboard-shortcuts.pf-c-modal-box")
-            .should("contain.text", "Keyboard shortcuts")
-            .should("contain.text", `${ctrlOrCmd} + Alt`)
-            .should("contain.text", "Hold to Preview");
-          cy.get(".kie-tools--keyboard-shortcuts.pf-c-modal-box .pf-c-button").click();
-        });
-    });
-  });
-
-  it("should check swf-report example of dashboard", () => {
-    // open swf-report example
-    cy.ouia({ ouiaId: "swf-report-try-swf-sample-button" }).click();
-    cy.loadEditor();
-
-    // check header type and name
-    cy.ouia({ ouiaId: "file-type-label" }).should("have.text", "Dashboard");
-    cy.ouia({ ouiaId: "file-name-input" }).should("have.value", "swf-report");
-
-    cy.getEditor().within(() => {
-      // check text editor contains text
-      cy.get(".monaco-editor textarea")
-        .should("contain.value", "properties:")
-        .should("contain.value", "dataIndexUrl: https://your.data.index.url.com")
-        .should("contain.value", "cardTemplate: >-");
-
-      // check preview buttow hides text editor
-      cy.ouia({ ouiaId: "preview-button" }).click();
-      cy.get(".monaco-editor textarea").should("not.be.visible");
-      cy.ouia({ ouiaId: "preview-button" }).click();
-      cy.get(".monaco-editor textarea").should("be.visible");
-
-      // check shortcuts modal dialog
-      cy.ouia({ ouiaId: "keyboard-shortcuts-icon" }).click();
-      cy.get(".kie-tools--keyboard-shortcuts.pf-c-modal-box")
-        .should("contain.text", "Keyboard shortcuts")
-        .should("contain.text", `Shift + ${ctrlOrCmd} + Z`)
-        .should("contain.text", "Redo last edit");
-      cy.get(".kie-tools--keyboard-shortcuts.pf-c-modal-box .pf-c-button").click();
-
-      cy.iframe("[src='dashbuilder-client/index.html']").within(() => {
-        // check default values
-        cy.get("#mainContainer").should("contain.text", "Serverless Workflow Summary ");
-        cy.get(".card-pf-aggregate-status:contains('Total Workflows') > h2").should("have.text", 464);
-        cy.get(".card-pf-aggregate-status:contains('Completed') > h2").should("have.text", 458);
-        cy.get(".card-pf-aggregate-status:contains('Error') > h2").should("have.text", 6);
-        cy.iframe("#externalComponentIFrame").within(() => {
-          cy.get(".pf-c-options-menu__toggle-text b").last().should("have.text", 464);
-        });
-
-        // switch filter and check values
-        cy.get("select.form-control").select("yamlgreet");
-        cy.get(".card-pf-aggregate-status:contains('Total Workflows') > h2").should("have.text", 177);
-        cy.get(".card-pf-aggregate-status:contains('Completed') > h2").should("have.text", 173);
-        cy.get(".card-pf-aggregate-status:contains('Error') > h2").should("have.text", 4);
-        cy.iframe("#externalComponentIFrame").within(() => {
-          cy.get(".pf-c-options-menu__toggle-text b").last().should("have.text", 177);
-        });
-
-        // check average duration graph
-        cy.get(".uf-perspective-rendered-col:contains('Average Duration') .c3-event-rect").click();
-        cy.get(".c3-tooltip-name--Total .value").should("have.text", 2.06);
-      });
-    });
-  });
-});
diff --git a/packages/serverless-logic-web-tools/it-tests/e2e/UploadFiles.cy.ts b/packages/serverless-logic-web-tools/it-tests/e2e/UploadFiles.cy.ts
index 4b082aebf2..bba718f70e 100644
--- a/packages/serverless-logic-web-tools/it-tests/e2e/UploadFiles.cy.ts
+++ b/packages/serverless-logic-web-tools/it-tests/e2e/UploadFiles.cy.ts
@@ -39,6 +39,9 @@ describe("Serverless Logic Web Tools - Upload files test", () => {
         cy.ouia({ ouiaId: "hello-text" }).should("have.text", "Hello");
       });
     });
+
+    // check there are no problems in dashbuilder file
+    cy.get("#total-notifications").should("have.text", 0);
   });
 
   it("should upload 2 files (JSON and YAML) and check editors and diagrams content", () => {
diff --git a/packages/serverless-logic-web-tools/package.json b/packages/serverless-logic-web-tools/package.json
index b4dc7778a3..e374cea474 100644
--- a/packages/serverless-logic-web-tools/package.json
+++ b/packages/serverless-logic-web-tools/package.json
@@ -61,6 +61,7 @@
     "axios": "^0.27.2",
     "bowser": "^2.10.0",
     "buffer": "^6.0.3",
+    "fuse.js": "^6.6.2",
     "history": "^4.9.0",
     "jszip": "^3.7.1",
     "moment": "^2.29.4",
@@ -69,6 +70,7 @@
     "react": "^17.0.2",
     "react-dom": "^17.0.2",
     "react-dropzone": "^11.4.2",
+    "react-if": "^4.1.4",
     "react-router": "^5.2.1",
     "react-router-dom": "^5.2.1",
     "showdown": "^2.1.0",
@@ -98,7 +100,7 @@
     "@types/react-router": "^5.1.14",
     "@types/react-router-dom": "^5.1.7",
     "copy-webpack-plugin": "^11.0.0",
-    "cypress": "^12.5.1",
+    "cypress": "^12.8.1",
     "cypress-file-upload": "^5.0.8",
     "cypress-iframe": "^1.0.1",
     "cypress-log-to-output": "^1.1.2",
diff --git a/packages/serverless-logic-web-tools/src/App.tsx b/packages/serverless-logic-web-tools/src/App.tsx
index f44b318453..e08b09d3c2 100644
--- a/packages/serverless-logic-web-tools/src/App.tsx
+++ b/packages/serverless-logic-web-tools/src/App.tsx
@@ -26,6 +26,7 @@ import { OpenShiftContextProvider } from "./openshift/OpenShiftContextProvider";
 import { SettingsContextProvider } from "./settings/SettingsContext";
 import { VirtualServiceRegistryContextProvider } from "./virtualServiceRegistry/VirtualServiceRegistryContextProvider";
 import { WorkspacesContextProvider } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContextProvider";
+import { SampleContextProvider } from "./home/sample/hooks/SampleContext";
 
 export const App = () => (
   <HashRouter>
@@ -41,6 +42,7 @@ export const App = () => (
       ],
       [OpenShiftContextProvider, {}],
       [VirtualServiceRegistryContextProvider, {}],
+      [SampleContextProvider, {}],
       [NavigationContextProvider, {}],
       [RoutesSwitch, {}]
     )}
diff --git a/packages/serverless-logic-web-tools/src/editor/Deploy/ConfirmDeployModal.tsx b/packages/serverless-logic-web-tools/src/editor/Deploy/ConfirmDeployModal.tsx
index 4c8fbc0da5..df4640d976 100644
--- a/packages/serverless-logic-web-tools/src/editor/Deploy/ConfirmDeployModal.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/Deploy/ConfirmDeployModal.tsx
@@ -23,7 +23,7 @@ import { Button } from "@patternfly/react-core/dist/js/components/Button";
 import { Modal, ModalVariant } from "@patternfly/react-core/dist/js/components/Modal";
 import { useCallback, useMemo, useState } from "react";
 import { AlertsController, useAlert } from "../../alerts/Alerts";
-import { isDashbuilder, isServerlessWorkflow } from "../../extension";
+import { isOfKind } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
 import { useAppI18n } from "../../i18n";
 import { CompletedDeployOperation } from "../../openshift/deploy/types";
 import { useOpenShift } from "../../openshift/OpenShiftContext";
@@ -51,9 +51,9 @@ export function ConfirmDeployModal(props: ConfirmDeployModalProps) {
   const optionsComponent = useMemo(() => {
     let DeployOptionsComponent = null;
 
-    if (isServerlessWorkflow(props.workspaceFile.name)) {
+    if (isOfKind("sw", props.workspaceFile.name)) {
       DeployOptionsComponent = SwfDeployOptions;
-    } else if (isDashbuilder(props.workspaceFile.name)) {
+    } else if (isOfKind("dash", props.workspaceFile.name)) {
       DeployOptionsComponent = DashDeployOptions;
     }
 
diff --git a/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx b/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx
index e638b2a0ee..b0e9dc58f2 100644
--- a/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/EditorPage.tsx
@@ -16,13 +16,8 @@
 
 import * as React from "react";
 import { ChannelType } from "@kie-tools-core/editor/dist/api";
-import { EmbeddedEditorFile, StateControl } from "@kie-tools-core/editor/dist/channel";
-import {
-  EmbeddedEditor,
-  EmbeddedEditorRef,
-  EmbeddedEditorChannelApiImpl,
-  useStateControlSubscription,
-} from "@kie-tools-core/editor/dist/embedded";
+import { EmbeddedEditorFile } from "@kie-tools-core/editor/dist/channel";
+import { useStateControlSubscription } from "@kie-tools-core/editor/dist/embedded";
 import { Notification } from "@kie-tools-core/notifications/dist/api";
 import { Divider } from "@patternfly/react-core/dist/js/components/Divider";
 import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
@@ -31,43 +26,23 @@ import { useHistory } from "react-router";
 import { AlertsController } from "../alerts/Alerts";
 import { LoadingSpinner } from "./LoadingSpinner";
 import { useEditorEnvelopeLocator } from "../envelopeLocator/EditorEnvelopeLocatorContext";
-import { isDashbuilder, isEditable, isServerlessWorkflow } from "../extension";
+import { isEditable } from "../extension";
 import { useAppI18n } from "../i18n";
 import { useRoutes } from "../navigation/Hooks";
 import { useQueryParams } from "../queryParams/QueryParamsContext";
 import { useCancelableEffect } from "@kie-tools-core/react-hooks/dist/useCancelableEffect";
 import { useController } from "@kie-tools-core/react-hooks/dist/useController";
 import { usePrevious } from "@kie-tools-core/react-hooks/dist/usePrevious";
-import { useSettingsDispatch } from "../settings/SettingsContext";
 import { PromiseStateWrapper } from "@kie-tools-core/react-hooks/dist/PromiseState";
 import { useWorkspaceFilePromise } from "@kie-tools-core/workspaces-git-fs/dist/hooks/WorkspaceFileHooks";
 import { useWorkspaces } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
-import { SwfLanguageServiceChannelApiImpl } from "./api/SwfLanguageServiceChannelApiImpl";
-import { SwfServiceCatalogChannelApiImpl } from "./api/SwfServiceCatalogChannelApiImpl";
 import { EditorPageDockDrawer, EditorPageDockDrawerRef } from "./EditorPageDockDrawer";
 import { EditorPageErrorPage } from "./EditorPageErrorPage";
 import { EditorToolbar } from "./EditorToolbar";
-import {
-  useUpdateVirtualServiceRegistryOnVsrFileEvent as useUpdateVirtualServiceRegistryOnVsrFileEvents,
-  useUpdateVirtualServiceRegistryOnVsrWorkspaceEvent as useUpdateVirtualServiceRegistryOnVsrWorkspaceEvents,
-  useUpdateVirtualServiceRegistryOnWorkspaceFileEvents,
-} from "../virtualServiceRegistry/hooks/useUpdateVirtualServiceRegistry";
-import { useVirtualServiceRegistry } from "../virtualServiceRegistry/VirtualServiceRegistryContext";
-import { DiagnosticSeverity } from "vscode-languageserver-types";
-import { useSwfFeatureToggle } from "./hooks/useSwfFeatureToggle";
-import {
-  SwfCombinedEditorChannelApiImpl,
-  SwfFeatureToggleChannelApiImpl,
-} from "@kie-tools/serverless-workflow-combined-editor/dist/impl";
-import { WebToolsSwfLanguageService } from "./api/WebToolsSwfLanguageService";
 import { APP_NAME } from "../AppConstants";
-import { MessageBusClientApi } from "@kie-tools-core/envelope-bus/dist/api";
-import { ServerlessWorkflowCombinedEditorChannelApi } from "@kie-tools/serverless-workflow-combined-editor/dist/api";
-import { Position } from "monaco-editor";
-import { DashbuilderLanguageServiceChannelApiImpl } from "./api/DashbuilderLanguageServiceChannelApiImpl";
-import { DashbuilderLanguageService } from "@kie-tools/dashbuilder-language-service/dist/channel";
-import { DashbuilderEditorChannelApiImpl } from "@kie-tools/dashbuilder-editor/dist/impl";
-import { DashbuilderLanguageServiceChannelApi } from "@kie-tools/dashbuilder-language-service/dist/api";
+import { WebToolsEmbeddedEditor, WebToolsEmbeddedEditorRef } from "./WebToolsEmbeddedEditor";
+import { useEditorNotifications } from "./hooks/useEditorNotifications";
+
 export interface Props {
   workspaceId: string;
   fileRelativePath: string;
@@ -77,41 +52,24 @@ let saveVersion = 1;
 let refreshVersion = 0;
 
 export function EditorPage(props: Props) {
-  const settingsDispatch = useSettingsDispatch();
   const routes = useRoutes();
   const editorEnvelopeLocator = useEditorEnvelopeLocator();
   const history = useHistory();
   const workspaces = useWorkspaces();
   const { i18n, locale } = useAppI18n();
-  const [editor, editorRef] = useController<EmbeddedEditorRef>();
+  const [webToolsEditor, webToolsEditorRef] = useController<WebToolsEmbeddedEditorRef>();
   const [alerts, alertsRef] = useController<AlertsController>();
   const [editorPageDock, editorPageDockRef] = useController<EditorPageDockDrawerRef>();
   const lastContent = useRef<string>();
   const workspaceFilePromise = useWorkspaceFilePromise(props.workspaceId, props.fileRelativePath);
   const [embeddedEditorFile, setEmbeddedEditorFile] = useState<EmbeddedEditorFile>();
-  const isEditorReady = useMemo(() => editor?.isReady, [editor]);
-  const [isReady, setReady] = useState(false);
-  const [isServiceRegistryReady, setServiceRegistryReady] = useState(false);
-  const swfFeatureToggle = useSwfFeatureToggle(editor);
-
+  const isEditorReady = useMemo(() => webToolsEditor?.editor?.isReady, [webToolsEditor]);
   const queryParams = useQueryParams();
-  const virtualServiceRegistry = useVirtualServiceRegistry();
-
-  const isSwf = useMemo(
-    () => workspaceFilePromise.data && isServerlessWorkflow(workspaceFilePromise.data.workspaceFile.name),
-    [workspaceFilePromise.data]
-  );
-
-  const isDash = useMemo(
-    () => workspaceFilePromise.data && isDashbuilder(workspaceFilePromise.data.workspaceFile.name),
-    [workspaceFilePromise.data]
-  );
 
-  useUpdateVirtualServiceRegistryOnWorkspaceFileEvents({ workspaceFile: workspaceFilePromise.data?.workspaceFile });
-  useUpdateVirtualServiceRegistryOnVsrWorkspaceEvents({ catalogStore: settingsDispatch.serviceRegistry.catalogStore });
-  useUpdateVirtualServiceRegistryOnVsrFileEvents({
-    workspaceId: props.workspaceId,
-    catalogStore: settingsDispatch.serviceRegistry.catalogStore,
+  const notifications = useEditorNotifications({
+    webToolsEditor,
+    content: lastContent.current,
+    fileRelativePath: props.fileRelativePath,
   });
 
   useEffect(() => {
@@ -193,26 +151,20 @@ export function EditorPage(props: Props) {
   }
 
   const saveContent = useCallback(async () => {
-    if (!workspaceFilePromise.data || !editor) {
+    if (!workspaceFilePromise.data || !webToolsEditor?.editor) {
       return;
     }
 
     const version = saveVersion++;
     console.debug(`Saving @ new version (${saveVersion}).`);
 
-    const content = await editor.getContent();
-    // FIXME: Uncomment when working on KOGITO-7805
-    // const svgString = await editor.getPreview();
+    const content = await webToolsEditor.editor.getContent();
 
     if (version + 1 < saveVersion) {
       console.debug(`Saving @ stale version (${version}); ignoring before writing.`);
       return;
     }
 
-    // FIXME: Uncomment when working on KOGITO-7805
-    // if (svgString) {
-    //   await svgService.createOrOverwriteSvg(workspaceFilePromise.data, svgString);
-    // }
     console.debug(`Saving @ current version (${version}); updating content.`);
     lastContent.current = content;
 
@@ -228,11 +180,11 @@ export function EditorPage(props: Props) {
     }
 
     console.debug(`Saving @ current version (${version}); marking as saved.`);
-    editor?.getStateControl().setSavedCommand();
-  }, [workspaces, editor, workspaceFilePromise]);
+    webToolsEditor.editor.getStateControl().setSavedCommand();
+  }, [workspaces, webToolsEditor, workspaceFilePromise]);
 
   useStateControlSubscription(
-    editor,
+    webToolsEditor?.editor,
     useCallback(
       (isDirty) => {
         if (!isDirty) {
@@ -243,7 +195,7 @@ export function EditorPage(props: Props) {
       },
       [saveContent]
     ),
-    { throttle: isSwf && swfFeatureToggle.stunnerEnabled ? 400 : 200 }
+    { throttle: 400 }
   );
   // end (AUTO-SAVE)
 
@@ -251,177 +203,19 @@ export function EditorPage(props: Props) {
     alerts?.closeAll();
   }, [alerts]);
 
-  const stateControl = useMemo(() => new StateControl(), [embeddedEditorFile?.getFileContents]);
-
-  const channelApiImpl = useMemo(
-    () =>
-      embeddedEditorFile &&
-      new EmbeddedEditorChannelApiImpl(stateControl, embeddedEditorFile, locale, {
-        kogitoEditor_ready: () => {
-          setReady(true);
-        },
-      }),
-    [embeddedEditorFile, locale, stateControl]
-  );
-
-  useEffect(() => {
-    if (
-      workspaceFilePromise.data &&
-      (!settingsDispatch.serviceRegistry.catalogStore.virtualServiceRegistry ||
-        settingsDispatch.serviceRegistry.catalogStore.currentFile !== workspaceFilePromise.data.workspaceFile)
-    ) {
-      settingsDispatch.serviceRegistry.catalogStore.setVirtualServiceRegistry(
-        virtualServiceRegistry,
-        workspaceFilePromise.data.workspaceFile
-      );
-    }
-  }, [settingsDispatch.serviceRegistry.catalogStore, virtualServiceRegistry, workspaceFilePromise.data]);
-
-  // SWF-specific code should be isolated when having more capabilities for other editors.
-
-  useEffect(() => {
-    setServiceRegistryReady(false);
-    if (isSwf && isReady) {
-      settingsDispatch.serviceRegistry.catalogStore.refresh().then(() => setServiceRegistryReady(true));
-    }
-  }, [isSwf, isReady, settingsDispatch.serviceRegistry.catalogStore]);
-
-  const swfLanguageService = useMemo(() => {
-    if (!isSwf || !workspaceFilePromise.data) {
-      return;
-    }
-
-    const webToolsSwfLanguageService = new WebToolsSwfLanguageService(settingsDispatch.serviceRegistry.catalogStore);
-
-    return webToolsSwfLanguageService.getLs(workspaceFilePromise.data.workspaceFile.relativePath);
-  }, [isSwf, workspaceFilePromise.data, settingsDispatch.serviceRegistry.catalogStore]);
-
-  const swfLanguageServiceChannelApiImpl = useMemo(
-    () => swfLanguageService && new SwfLanguageServiceChannelApiImpl(swfLanguageService),
-    [swfLanguageService]
-  );
-
-  const dashbuilderLanguageService = useMemo(() => {
-    if (!isDash || !workspaceFilePromise.data) {
-      return;
-    }
-    return new DashbuilderLanguageService();
-  }, [isDash, workspaceFilePromise.data]);
-
-  const dashbuilderLanguageServiceChannelApiImpl = useMemo(
-    () => dashbuilderLanguageService && new DashbuilderLanguageServiceChannelApiImpl(dashbuilderLanguageService),
-    [dashbuilderLanguageService]
-  );
-
-  const swfServiceCatalogChannelApiImpl = useMemo(
-    () =>
-      settingsDispatch.serviceRegistry.catalogStore &&
-      new SwfServiceCatalogChannelApiImpl(settingsDispatch.serviceRegistry.catalogStore),
-    [settingsDispatch.serviceRegistry.catalogStore]
-  );
-
-  const swfFeatureToggleChannelApiImpl = useMemo(
-    () => new SwfFeatureToggleChannelApiImpl(swfFeatureToggle),
-    [swfFeatureToggle]
-  );
-
-  useEffect(() => {
-    if (embeddedEditorFile && !isServerlessWorkflow(embeddedEditorFile.path || "") && !isReady) {
-      setReady(true);
-    }
-  }, [embeddedEditorFile, isReady, settingsDispatch.serviceRegistry.catalogStore, virtualServiceRegistry]);
-
-  const apiImpl = useMemo(() => {
-    if (!channelApiImpl || (!swfLanguageService && !dashbuilderLanguageService) || !swfServiceCatalogChannelApiImpl) {
-      return;
-    }
-    if (isDash) {
-      return new DashbuilderEditorChannelApiImpl(
-        channelApiImpl,
-        dashbuilderLanguageServiceChannelApiImpl as DashbuilderLanguageServiceChannelApi
-      );
-    }
-    return new SwfCombinedEditorChannelApiImpl(
-      channelApiImpl,
-      swfFeatureToggleChannelApiImpl,
-      swfServiceCatalogChannelApiImpl,
-      swfLanguageServiceChannelApiImpl
-    );
-  }, [
-    channelApiImpl,
-    swfLanguageService,
-    dashbuilderLanguageService,
-    swfServiceCatalogChannelApiImpl,
-    swfFeatureToggleChannelApiImpl,
-    swfLanguageServiceChannelApiImpl,
-    dashbuilderLanguageServiceChannelApiImpl,
-  ]);
-
   useEffect(() => {
-    if (!editor?.isReady || lastContent.current === undefined || !workspaceFilePromise.data || !swfLanguageService) {
-      return;
-    }
-
-    swfLanguageService
-      .getDiagnostics({
-        content: lastContent.current,
-        uriPath: workspaceFilePromise.data.workspaceFile.relativePath,
-      })
-      .then((lsDiagnostics) => {
-        const diagnostics = lsDiagnostics.map(
-          (lsDiagnostic) =>
-            ({
-              path: "", // empty to not group them by path, as we're only validating one file.
-              severity: lsDiagnostic.severity === DiagnosticSeverity.Error ? "ERROR" : "WARNING",
-              message: `${lsDiagnostic.message} [Line ${lsDiagnostic.range.start.line + 1}]`,
-              type: "PROBLEM",
-              position: {
-                startLineNumber: lsDiagnostic.range.start.line + 1,
-                startColumn: lsDiagnostic.range.start.character + 1,
-                endLineNumber: lsDiagnostic.range.end.line + 1,
-                endColumn: lsDiagnostic.range.end.character + 1,
-              },
-            } as Notification)
-        );
-
-        editorPageDock?.setNotifications(i18n.terms.validation, "", diagnostics);
-      })
-      .catch((e) => console.error(e));
-  }, [
-    workspaceFilePromise.data,
-    editor,
-    swfLanguageService,
-    editorPageDock,
-    i18n.terms.validation,
-    isServiceRegistryReady,
-  ]);
-
-  const swfEditorChannelApi = useMemo(
-    () =>
-      embeddedEditorFile && isServerlessWorkflow(embeddedEditorFile?.fileName)
-        ? (editor?.getEnvelopeServer()
-            .envelopeApi as unknown as MessageBusClientApi<ServerlessWorkflowCombinedEditorChannelApi>)
-        : undefined,
-    [editor]
-  );
+    editorPageDock?.setNotifications(i18n.terms.validation, "", notifications);
+  }, [editorPageDock, notifications, i18n]);
 
   const onNotificationClick = useCallback(
     (notification: Notification) => {
-      if (
-        !notification.position ||
-        !swfEditorChannelApi ||
-        !embeddedEditorFile ||
-        !isServerlessWorkflow(embeddedEditorFile?.fileName)
-      ) {
-        return;
+      if (webToolsEditor?.notificationHandler.isSupported) {
+        webToolsEditor.notificationHandler.onClick(notification);
       }
-
-      swfEditorChannelApi.notifications.kogitoSwfCombinedEditor_moveCursorToPosition.send(
-        new Position(notification.position.startLineNumber, notification.position.startColumn)
-      );
     },
-    [swfEditorChannelApi]
+    [webToolsEditor]
   );
+
   return (
     <PromiseStateWrapper
       promise={workspaceFilePromise}
@@ -432,7 +226,7 @@ export function EditorPage(props: Props) {
           <Page>
             <EditorToolbar
               workspaceFile={file.workspaceFile}
-              editor={editor}
+              editor={webToolsEditor?.editor}
               alerts={alerts}
               alertsRef={alertsRef}
               editorPageDock={editorPageDock}
@@ -440,28 +234,24 @@ export function EditorPage(props: Props) {
             <Divider />
             <EditorPageDockDrawer
               ref={editorPageDockRef}
-              isEditorReady={editor?.isReady}
+              isEditorReady={isEditorReady}
               workspaceFile={file.workspaceFile}
               onNotificationClick={onNotificationClick}
+              isDisabled={!webToolsEditor?.notificationHandler.isSupported}
             >
               <PageSection hasOverflowScroll={true} padding={{ default: "noPadding" }} aria-label="Editor Section">
                 <div style={{ height: "100%" }}>
                   {!isEditorReady && <LoadingSpinner />}
                   <div style={{ display: isEditorReady ? "inline" : "none" }}>
                     {embeddedEditorFile && (
-                      <EmbeddedEditor
-                        /* FIXME: By providing a different `key` everytime, we avoid calling `setContent` twice on the same Editor.
-                         * This is by design, and after setContent supports multiple calls on the same instance, we can remove that.
-                         */
-                        key={uniqueFileId}
-                        ref={editorRef}
+                      <WebToolsEmbeddedEditor
+                        uniqueFileId={uniqueFileId}
+                        ref={webToolsEditorRef}
                         file={embeddedEditorFile}
+                        workspaceFile={file.workspaceFile}
                         editorEnvelopeLocator={editorEnvelopeLocator}
                         channelType={ChannelType.ONLINE_MULTI_FILE}
                         locale={locale}
-                        customChannelApiImpl={apiImpl}
-                        stateControl={stateControl}
-                        isReady={isReady}
                       />
                     )}
                   </div>
diff --git a/packages/serverless-logic-web-tools/src/editor/EditorPageDockDrawer.tsx b/packages/serverless-logic-web-tools/src/editor/EditorPageDockDrawer.tsx
index eba53ae2b6..1ea4d179ad 100644
--- a/packages/serverless-logic-web-tools/src/editor/EditorPageDockDrawer.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/EditorPageDockDrawer.tsx
@@ -19,7 +19,6 @@ import { Drawer, DrawerContent, DrawerPanelContent } from "@patternfly/react-cor
 import { ToggleGroup } from "@patternfly/react-core/dist/js/components/ToggleGroup";
 import * as React from "react";
 import { PropsWithChildren, useCallback, useEffect, useImperativeHandle, useMemo, useState } from "react";
-import { isServerlessWorkflow } from "../extension";
 import { useAppI18n } from "../i18n";
 import { useController } from "@kie-tools-core/react-hooks/dist/useController";
 import { WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
@@ -38,6 +37,7 @@ interface EditorPageDockDrawerProps {
   isEditorReady?: boolean;
   onNotificationClick?: (notification: Notification) => void;
   workspaceFile: WorkspaceFile;
+  isDisabled: boolean;
 }
 
 export interface EditorPageDockDrawerRef {
@@ -100,17 +100,12 @@ export const EditorPageDockDrawer = React.forwardRef<
     [notificationsPanel, onToggle, setNotifications]
   );
 
-  const notificationsPanelIsDisabled = useMemo(
-    () => !isServerlessWorkflow(props.workspaceFile.name),
-    [props.workspaceFile.name]
-  );
-
   const notificationsPanelDisabledReason = useMemo(() => {
-    if (notificationsPanelIsDisabled) {
+    if (props.isDisabled) {
       return "This tab is not supported for this editor";
     }
     return "";
-  }, [notificationsPanelIsDisabled]);
+  }, [props.isDisabled]);
 
   useEffect(() => {
     setPanel(PanelId.NONE);
@@ -151,7 +146,7 @@ export const EditorPageDockDrawer = React.forwardRef<
       >
         <ToggleGroup>
           <NotificationsPanelDockToggle
-            isDisabled={notificationsPanelIsDisabled}
+            isDisabled={props.isDisabled}
             disabledReason={notificationsPanelDisabledReason}
             ref={notificationsToggleRef}
             isSelected={panel === PanelId.NOTIFICATIONS_PANEL}
diff --git a/packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx b/packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx
index 23eca2485c..27d5cdebb4 100644
--- a/packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/EditorToolbar.tsx
@@ -60,7 +60,7 @@ import * as React from "react";
 import { useCallback, useEffect, useMemo, useRef, useState } from "react";
 import { useHistory } from "react-router";
 import { Alerts, AlertsController, useAlert } from "../alerts/Alerts";
-import { isDashbuilder, isServerlessWorkflow } from "../extension";
+import { isOfKind } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
 import { useAppI18n } from "../i18n";
 import {
   useNavigationBlockersBypass,
@@ -181,7 +181,7 @@ export function EditorToolbar(props: Props) {
   }, [isSaved]);
 
   const canBeDeployed = useMemo(
-    () => isServerlessWorkflow(props.workspaceFile.relativePath) || isDashbuilder(props.workspaceFile.relativePath),
+    () => isOfKind("sw", props.workspaceFile.relativePath) || isOfKind("dash", props.workspaceFile.relativePath),
     [props.workspaceFile.relativePath]
   );
 
@@ -308,7 +308,7 @@ export function EditorToolbar(props: Props) {
   );
 
   const shouldIncludeDownloadSvgDropdownItem = useMemo(() => {
-    return isServerlessWorkflow(props.workspaceFile.relativePath);
+    return isOfKind("sw", props.workspaceFile.relativePath);
   }, [props.workspaceFile]);
 
   const onDownload = useCallback(() => {
diff --git a/packages/serverless-logic-web-tools/src/editor/NewFileDropdownMenu.tsx b/packages/serverless-logic-web-tools/src/editor/NewFileDropdownMenu.tsx
index 95c7323dca..8f12de447f 100644
--- a/packages/serverless-logic-web-tools/src/editor/NewFileDropdownMenu.tsx
+++ b/packages/serverless-logic-web-tools/src/editor/NewFileDropdownMenu.tsx
@@ -34,7 +34,8 @@ import { Alert, AlertActionCloseButton } from "@patternfly/react-core/dist/js/co
 import { basename } from "path";
 import { ImportFromUrlForm } from "../workspace/components/ImportFromUrlForm";
 import { useRoutes } from "../navigation/Hooks";
-import { FileTypes, isEditable, SupportedFileExtensions } from "../extension";
+import { isEditable, SupportedFileExtensions } from "../extension";
+import { FileTypes } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
 import { decoder } from "@kie-tools-core/workspaces-git-fs/dist/encoderdecoder/EncoderDecoder";
 import { extractExtension } from "@kie-tools-core/workspaces-git-fs/dist/relativePath/WorkspaceFileRelativePathParser";
 import { UrlType } from "../workspace/hooks/ImportableUrlHooks";
@@ -249,53 +250,6 @@ export function NewFileDropdownMenu(props: {
             </b>
           </MenuItem>
           <Divider />
-          <MenuItem
-            description={"Try sample models"}
-            itemId="samplesItemId"
-            direction={"down"}
-            drilldownMenu={
-              <DrilldownMenu id={"samplesMenu"}>
-                <MenuItem direction="up">Back</MenuItem>
-                <Divider />
-                <MenuItem
-                  onClick={() => addSample("greetings", FileTypes.SW_JSON)}
-                  description="Serverless Workflow files are used to define orchestration logic for services."
-                >
-                  <Flex>
-                    <FlexItem>Greetings</FlexItem>
-                    <FlexItem>
-                      <FileLabel extension={FileTypes.SW_JSON} />
-                    </FlexItem>
-                  </Flex>
-                </MenuItem>
-                <MenuItem
-                  onClick={() => addSample("traffic-violation", FileTypes.YARD_YAML)}
-                  description="Serverless Decision files are used to define decision logic for services."
-                >
-                  <Flex>
-                    <FlexItem>Traffic Violation</FlexItem>
-                    <FlexItem>
-                      <FileLabel extension={FileTypes.YARD_YAML} />
-                    </FlexItem>
-                  </Flex>
-                </MenuItem>
-                <MenuItem
-                  onClick={() => addSample("swf-report", FileTypes.DASH_YML)}
-                  description="Dashboard files are used to define data visualization from data extracted from applications."
-                >
-                  <Flex>
-                    <FlexItem>Serverless Workflow Report</FlexItem>
-                    <FlexItem>
-                      <FileLabel extension={FileTypes.DASH_YML} />
-                    </FlexItem>
-                  </Flex>
-                </MenuItem>
-              </DrilldownMenu>
-            }
-          >
-            Samples
-          </MenuItem>
-          <Divider />
           <MenuItem
             itemId={"importFromUrlItemId"}
             direction={"down"}
diff --git a/packages/serverless-logic-web-tools/src/editor/WebToolsEmbeddedEditor.tsx b/packages/serverless-logic-web-tools/src/editor/WebToolsEmbeddedEditor.tsx
new file mode 100644
index 0000000000..4e87c0b12e
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/editor/WebToolsEmbeddedEditor.tsx
@@ -0,0 +1,168 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { Notification } from "@kie-tools-core/notifications/dist/api";
+import { StateControl } from "@kie-tools-core/editor/dist/channel";
+import { useMemo, useState, ForwardRefRenderFunction, useImperativeHandle, forwardRef, useEffect } from "react";
+import { WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+import { SwfChannelComponent } from "./channel/SwfChannelComponent";
+import { DashChannelComponent } from "./channel/DashChannelComponent";
+import { useController } from "@kie-tools-core/react-hooks/dist/useController";
+import { When } from "react-if";
+import { isOfKind } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
+import { ChannelType, KogitoEditorChannelApi } from "@kie-tools-core/editor/dist/api";
+import {
+  SwfJsonLanguageService,
+  SwfYamlLanguageService,
+} from "@kie-tools/serverless-workflow-language-service/dist/channel";
+import { DashbuilderLanguageService } from "@kie-tools/dashbuilder-language-service/dist/channel";
+import { EmbeddedEditor, EmbeddedEditorChannelApiImpl, EmbeddedEditorRef } from "@kie-tools-core/editor/dist/embedded";
+import { Props } from "@kie-tools-core/editor/dist/embedded/embedded/EmbeddedEditor";
+
+type SupportedLanguageService = SwfYamlLanguageService | SwfJsonLanguageService | DashbuilderLanguageService;
+
+type NotificationHandler =
+  | { isSupported: false }
+  | {
+      isSupported: true;
+      onClick: (notification: Notification) => void;
+    };
+
+export interface EditorChannelComponentRef {
+  isReady: boolean;
+  notificationHandler: NotificationHandler;
+  kogitoEditorChannelApi?: KogitoEditorChannelApi;
+  languageService?: SupportedLanguageService;
+}
+export type EditorChannelComponentProps = {
+  channelApiImpl: EmbeddedEditorChannelApiImpl;
+  editor: EmbeddedEditorRef;
+  workspaceFile: WorkspaceFile;
+};
+
+export type WebToolsEmbeddedEditorRef = Pick<
+  EditorChannelComponentRef,
+  "isReady" | "notificationHandler" | "languageService"
+> & {
+  editor?: EmbeddedEditorRef;
+};
+
+export type WebToolsEmbeddedEditorProps = Props & {
+  uniqueFileId?: string;
+  workspaceFile: WorkspaceFile;
+};
+
+const RefForwardingWebToolsEmbeddedEditor: ForwardRefRenderFunction<
+  WebToolsEmbeddedEditorRef,
+  WebToolsEmbeddedEditorProps
+> = (props, fowardedRef) => {
+  const { file, locale, uniqueFileId, editorEnvelopeLocator, workspaceFile } = { ...props };
+
+  const [isReady, setReady] = useState(false);
+  const [editor, editorRef] = useController<EmbeddedEditorRef>();
+
+  const [swfChannelComponent, swfChannelComponentRef] = useController<EditorChannelComponentRef>();
+  const [dashChannelComponent, dashChannelComponentRef] = useController<EditorChannelComponentRef>();
+  const availableComponents = useMemo(
+    () => [swfChannelComponent, dashChannelComponent],
+    [dashChannelComponent, swfChannelComponent]
+  );
+
+  // Keep getFileContents in the dependency list to update the stateControl instance
+  const stateControl = useMemo(() => new StateControl(), [file?.getFileContents]);
+
+  const channelApiImpl = useMemo(
+    () =>
+      new EmbeddedEditorChannelApiImpl(stateControl, file, locale, {
+        kogitoEditor_ready: () => {
+          setReady(true);
+        },
+      }),
+    [file, locale, stateControl]
+  );
+
+  const channelComponent = useMemo<EditorChannelComponentRef>(() => {
+    const loadedComponent = availableComponents.find((c) => !!c);
+
+    if (!loadedComponent) {
+      return {
+        isReady: true,
+        notificationHandler: {
+          isSupported: false,
+        },
+      };
+    }
+
+    return { ...loadedComponent };
+  }, [availableComponents]);
+
+  useImperativeHandle(
+    fowardedRef,
+    () => {
+      return {
+        editor,
+        ...channelComponent,
+        isReady: isReady && !!channelComponent.isReady,
+      };
+    },
+    [channelComponent, editor, isReady]
+  );
+
+  useEffect(() => {
+    if (!channelComponent.kogitoEditorChannelApi && file && !isReady) {
+      setReady(true);
+    }
+  }, [channelComponent, isReady, file]);
+
+  return (
+    <>
+      <EmbeddedEditor
+        key={uniqueFileId} /* KOGITO-8892 */
+        ref={editorRef}
+        file={file}
+        editorEnvelopeLocator={editorEnvelopeLocator}
+        channelType={ChannelType.ONLINE_MULTI_FILE}
+        locale={locale}
+        customChannelApiImpl={channelComponent.kogitoEditorChannelApi}
+        stateControl={stateControl}
+        isReady={isReady}
+      />
+      {editor && (
+        <>
+          <When condition={isOfKind("sw", workspaceFile.name)}>
+            <SwfChannelComponent
+              ref={swfChannelComponentRef}
+              channelApiImpl={channelApiImpl}
+              editor={editor}
+              workspaceFile={workspaceFile}
+            />
+          </When>
+          <When condition={isOfKind("dash", workspaceFile.name)}>
+            <DashChannelComponent
+              ref={dashChannelComponentRef}
+              channelApiImpl={channelApiImpl}
+              editor={editor}
+              workspaceFile={workspaceFile}
+            />
+          </When>
+        </>
+      )}
+    </>
+  );
+};
+
+export const WebToolsEmbeddedEditor = forwardRef(RefForwardingWebToolsEmbeddedEditor);
diff --git a/packages/serverless-logic-web-tools/src/editor/api/SwfServiceCatalogStore.ts b/packages/serverless-logic-web-tools/src/editor/api/SwfServiceCatalogStore.ts
index 84aa86c2d0..0e787319e9 100644
--- a/packages/serverless-logic-web-tools/src/editor/api/SwfServiceCatalogStore.ts
+++ b/packages/serverless-logic-web-tools/src/editor/api/SwfServiceCatalogStore.ts
@@ -23,7 +23,7 @@ import { parseApiContent } from "@kie-tools/serverless-workflow-service-catalog/
 import { ArtifactType, SearchedArtifact } from "@rhoas/registry-instance-sdk";
 import { OpenAPIV3 } from "openapi-types";
 import * as yaml from "yaml";
-import { isSpec } from "../../extension";
+import { isOfKind } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
 import {
   isServiceAccountConfigValid,
   ServiceAccountSettingsConfig,
@@ -164,11 +164,11 @@ export class SwfServiceCatalogStore {
     };
 
     const isForeignArtifact = (metadata: SearchedArtifact) => {
-      return !isSpec(metadata.id) && metadata.groupId !== this.currentFile?.workspaceId;
+      return !isOfKind("spec", metadata.id) && metadata.groupId !== this.currentFile?.workspaceId;
     };
 
     const isLocalSpec = (metadata: SearchedArtifact) => {
-      return isSpec(metadata.id) && metadata.groupId === this.currentFile?.workspaceId;
+      return isOfKind("spec", metadata.id) && metadata.groupId === this.currentFile?.workspaceId;
     };
 
     // The list should:
diff --git a/packages/serverless-logic-web-tools/src/editor/channel/DashChannelComponent.tsx b/packages/serverless-logic-web-tools/src/editor/channel/DashChannelComponent.tsx
new file mode 100644
index 0000000000..2a8358d251
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/editor/channel/DashChannelComponent.tsx
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { ForwardRefRenderFunction, useImperativeHandle, forwardRef, useMemo, useCallback } from "react";
+import { EditorChannelComponentProps, EditorChannelComponentRef } from "../WebToolsEmbeddedEditor";
+import { DashbuilderEditorChannelApiImpl } from "@kie-tools/dashbuilder-editor/dist/impl";
+import { DashbuilderLanguageService } from "@kie-tools/dashbuilder-language-service/dist/channel";
+import { DashbuilderLanguageServiceChannelApiImpl } from "../api/DashbuilderLanguageServiceChannelApiImpl";
+import { MessageBusClientApi } from "@kie-tools-core/envelope-bus/dist/api";
+import { DashbuilderEditorChannelApi } from "@kie-tools/dashbuilder-editor";
+import { Notification } from "@kie-tools-core/notifications/dist/api";
+import { Position } from "monaco-editor";
+
+const RefForwardingDashChannelComponent: ForwardRefRenderFunction<
+  EditorChannelComponentRef,
+  EditorChannelComponentProps
+> = (props, fowardedRef) => {
+  const { editor, channelApiImpl } = { ...props };
+  const languageService = useMemo(() => new DashbuilderLanguageService(), []);
+
+  const apiImpl = useMemo(() => {
+    const lsChannelApiImpl = new DashbuilderLanguageServiceChannelApiImpl(languageService);
+    return new DashbuilderEditorChannelApiImpl(channelApiImpl, lsChannelApiImpl);
+  }, [channelApiImpl, languageService]);
+
+  const onNotificationClick = useCallback(
+    (notification: Notification) => {
+      if (!editor || !notification.position) {
+        return;
+      }
+
+      const messageBusClient = editor.getEnvelopeServer()
+        .envelopeApi as unknown as MessageBusClientApi<DashbuilderEditorChannelApi>;
+
+      messageBusClient.notifications.kogitoDashbuilderTextEditor_moveCursorToPosition.send(
+        new Position(notification.position.startLineNumber, notification.position.startColumn)
+      );
+    },
+    [editor]
+  );
+
+  useImperativeHandle(
+    fowardedRef,
+    () => {
+      return {
+        kogitoEditorChannelApi: apiImpl,
+        languageService: languageService,
+        isReady: true,
+        notificationHandler: {
+          isSupported: true,
+          onClick: onNotificationClick,
+        },
+      };
+    },
+    [apiImpl, languageService, onNotificationClick]
+  );
+
+  return <></>;
+};
+
+export const DashChannelComponent = forwardRef(RefForwardingDashChannelComponent);
diff --git a/packages/serverless-logic-web-tools/src/editor/channel/SwfChannelComponent.tsx b/packages/serverless-logic-web-tools/src/editor/channel/SwfChannelComponent.tsx
new file mode 100644
index 0000000000..ac05fc171b
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/editor/channel/SwfChannelComponent.tsx
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import {
+  ForwardRefRenderFunction,
+  useImperativeHandle,
+  useEffect,
+  forwardRef,
+  useState,
+  useMemo,
+  useCallback,
+} from "react";
+import { useSettingsDispatch } from "../../settings/SettingsContext";
+import {
+  useUpdateVirtualServiceRegistryOnVsrFileEvents,
+  useUpdateVirtualServiceRegistryOnVsrWorkspaceEvents,
+  useUpdateVirtualServiceRegistryOnWorkspaceFileEvents,
+} from "../../virtualServiceRegistry/hooks/useUpdateVirtualServiceRegistry";
+import { useVirtualServiceRegistry } from "../../virtualServiceRegistry/VirtualServiceRegistryContext";
+import { SwfLanguageServiceChannelApiImpl } from "../api/SwfLanguageServiceChannelApiImpl";
+import { SwfServiceCatalogChannelApiImpl } from "../api/SwfServiceCatalogChannelApiImpl";
+import { WebToolsSwfLanguageService } from "../api/WebToolsSwfLanguageService";
+import { useSwfFeatureToggle } from "../hooks/useSwfFeatureToggle";
+import { EditorChannelComponentProps, EditorChannelComponentRef } from "../WebToolsEmbeddedEditor";
+import {
+  SwfCombinedEditorChannelApiImpl,
+  SwfFeatureToggleChannelApiImpl,
+} from "@kie-tools/serverless-workflow-combined-editor/dist/impl";
+import { MessageBusClientApi } from "@kie-tools-core/envelope-bus/dist/api";
+import { ServerlessWorkflowCombinedEditorChannelApi } from "@kie-tools/serverless-workflow-combined-editor/dist/api";
+import { Notification } from "@kie-tools-core/notifications/dist/api";
+import { Position } from "monaco-editor";
+import { useCancelableEffect } from "@kie-tools-core/react-hooks/dist/useCancelableEffect";
+
+const RefForwardingSwfChannelComponent: ForwardRefRenderFunction<
+  EditorChannelComponentRef,
+  EditorChannelComponentProps
+> = (props, fowardedRef) => {
+  const { editor, workspaceFile, channelApiImpl } = { ...props };
+  const [isReady, setReady] = useState(false);
+  const virtualServiceRegistry = useVirtualServiceRegistry();
+  const swfFeatureToggle = useSwfFeatureToggle(editor);
+  const {
+    serviceRegistry: { catalogStore },
+  } = useSettingsDispatch();
+
+  useUpdateVirtualServiceRegistryOnWorkspaceFileEvents({ workspaceFile: workspaceFile });
+  useUpdateVirtualServiceRegistryOnVsrWorkspaceEvents({ catalogStore: catalogStore });
+  useUpdateVirtualServiceRegistryOnVsrFileEvents({
+    workspaceId: workspaceFile.workspaceId,
+    catalogStore: catalogStore,
+  });
+
+  useEffect(() => {
+    if (catalogStore.virtualServiceRegistry || catalogStore.currentFile === workspaceFile) {
+      return;
+    }
+
+    catalogStore.setVirtualServiceRegistry(virtualServiceRegistry, workspaceFile);
+  }, [catalogStore, virtualServiceRegistry, workspaceFile]);
+
+  useCancelableEffect(
+    useCallback(
+      ({ canceled }) => {
+        setReady(false);
+        catalogStore.refresh().then(() => {
+          if (canceled.get()) {
+            return;
+          }
+          setReady(true);
+        });
+      },
+      [catalogStore]
+    )
+  );
+
+  const languageService = useMemo(() => {
+    const webToolsSwfLanguageService = new WebToolsSwfLanguageService(catalogStore);
+    return webToolsSwfLanguageService.getLs(workspaceFile.relativePath);
+  }, [workspaceFile, catalogStore]);
+
+  const apiImpl = useMemo(() => {
+    const lsChannelApiImpl = new SwfLanguageServiceChannelApiImpl(languageService);
+    const serviceCatalogChannelApiImpl = new SwfServiceCatalogChannelApiImpl(catalogStore);
+    const featureToggleChannelApiImpl = new SwfFeatureToggleChannelApiImpl(swfFeatureToggle);
+    return new SwfCombinedEditorChannelApiImpl(
+      channelApiImpl,
+      featureToggleChannelApiImpl,
+      serviceCatalogChannelApiImpl,
+      lsChannelApiImpl
+    );
+  }, [languageService, catalogStore, swfFeatureToggle, channelApiImpl]);
+
+  const onNotificationClick = useCallback(
+    (notification: Notification) => {
+      if (!editor || !notification.position) {
+        return;
+      }
+
+      const messageBusClient = editor.getEnvelopeServer()
+        .envelopeApi as unknown as MessageBusClientApi<ServerlessWorkflowCombinedEditorChannelApi>;
+
+      messageBusClient.notifications.kogitoSwfCombinedEditor_moveCursorToPosition.send(
+        new Position(notification.position.startLineNumber, notification.position.startColumn)
+      );
+    },
+    [editor]
+  );
+
+  useImperativeHandle(
+    fowardedRef,
+    () => {
+      return {
+        kogitoEditorChannelApi: apiImpl,
+        languageService: languageService,
+        isReady,
+        notificationHandler: {
+          isSupported: true,
+          onClick: onNotificationClick,
+        },
+      };
+    },
+    [apiImpl, languageService, isReady, onNotificationClick]
+  );
+
+  return <></>;
+};
+
+export const SwfChannelComponent = forwardRef(RefForwardingSwfChannelComponent);
diff --git a/packages/serverless-logic-web-tools/src/editor/hooks/useEditorNotifications.tsx b/packages/serverless-logic-web-tools/src/editor/hooks/useEditorNotifications.tsx
new file mode 100644
index 0000000000..4b49276e14
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/editor/hooks/useEditorNotifications.tsx
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { useCallback, useState } from "react";
+import { WebToolsEmbeddedEditorRef } from "../WebToolsEmbeddedEditor";
+import { Notification } from "@kie-tools-core/notifications/dist/api";
+import { DiagnosticSeverity } from "vscode-languageserver-types";
+import { useCancelableEffect } from "@kie-tools-core/react-hooks/dist/useCancelableEffect";
+
+interface HookArgs {
+  webToolsEditor: WebToolsEmbeddedEditorRef | undefined;
+  content: string | undefined;
+  fileRelativePath: string;
+}
+
+export function useEditorNotifications(args: HookArgs) {
+  const { webToolsEditor, content, fileRelativePath } = { ...args };
+  const [notifications, setNotifications] = useState<Notification[]>([]);
+
+  useCancelableEffect(
+    useCallback(
+      ({ canceled }) => {
+        if (!webToolsEditor?.isReady || !webToolsEditor?.languageService || content === undefined) {
+          return;
+        }
+
+        webToolsEditor.languageService
+          .getDiagnostics({
+            content: content,
+            uriPath: fileRelativePath,
+          })
+          .then((lsDiagnostics) => {
+            if (canceled.get()) {
+              return;
+            }
+            const mappedDiagnostics = lsDiagnostics.map(
+              (lsDiagnostic) =>
+                ({
+                  path: "", // empty to not group them by path, as we're only validating one file.
+                  severity: lsDiagnostic.severity === DiagnosticSeverity.Error ? "ERROR" : "WARNING",
+                  message: `${lsDiagnostic.message} [Line ${lsDiagnostic.range.start.line + 1}]`,
+                  type: "PROBLEM",
+                  position: {
+                    startLineNumber: lsDiagnostic.range.start.line + 1,
+                    startColumn: lsDiagnostic.range.start.character + 1,
+                    endLineNumber: lsDiagnostic.range.end.line + 1,
+                    endColumn: lsDiagnostic.range.end.character + 1,
+                  },
+                } as Notification)
+            );
+            setNotifications(mappedDiagnostics);
+          })
+          .catch((e) => console.error(e));
+      },
+      [content, fileRelativePath, webToolsEditor]
+    )
+  );
+
+  return notifications;
+}
diff --git a/packages/serverless-logic-web-tools/src/extension/index.ts b/packages/serverless-logic-web-tools/src/extension/index.ts
index e130abdcf9..463ab3ee4f 100644
--- a/packages/serverless-logic-web-tools/src/extension/index.ts
+++ b/packages/serverless-logic-web-tools/src/extension/index.ts
@@ -17,21 +17,10 @@
 import { WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
 import { basename } from "path";
 import { PROJECT_FILES } from "../project";
+import { FileTypes, isOfKind } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
 
 const EDIT_NON_MODEL_ALLOW_LIST = [PROJECT_FILES.applicationProperties];
 
-const REGEX = {
-  supported: /(\.sw\.json|\.sw\.yaml|\.sw\.yml|\.yard\.json|\.yard\.yaml|\.yard\.yml|\.dash\.yml|\.dash\.yaml)$/i,
-  sw: /^.*\.sw\.(json|yml|yaml)$/i,
-  swJson: /^.*\.sw\.json$/i,
-  swYaml: /^.*\.sw\.(yml|yaml)$/i,
-  yard: /^.*\.yard\.(json|yml|yaml)$/i,
-  dash: /^.*\.dash\.(yml|yaml)$/i,
-  json: /^.*\.json$/i,
-  yaml: /^.*\.(yml|yaml)$/i,
-  spec: /^.*(\.spec|\.specs|spec|specs)\.(json|yml|yaml)$/i,
-};
-
 export const GLOB_PATTERN = {
   all: "**/*",
   allExceptDockerfiles: "**/!(Dockerfile|.dockerignore)",
@@ -42,17 +31,6 @@ export const GLOB_PATTERN = {
   sw_spec: "**/+(*.sw|*.spec?(s)|spec?(s)).+(yml|yaml|json)",
 };
 
-export enum FileTypes {
-  SW_JSON = "sw.json",
-  SW_YML = "sw.yml",
-  SW_YAML = "sw.yaml",
-  YARD_JSON = "yard.json",
-  YARD_YML = "yard.yml",
-  YARD_YAML = "yard.yaml",
-  DASH_YAML = "dash.yaml",
-  DASH_YML = "dash.yml",
-}
-
 export const supportedFileExtensionArray = [
   FileTypes.SW_JSON,
   FileTypes.SW_YML,
@@ -64,28 +42,8 @@ export const supportedFileExtensionArray = [
   FileTypes.DASH_YML,
 ];
 
-export function isServerlessWorkflow(path: string): boolean {
-  return REGEX.sw.test(path);
-}
-
-export function isServerlessWorkflowJson(path: string): boolean {
-  return REGEX.swJson.test(path);
-}
-
-export function isServerlessWorkflowYaml(path: string): boolean {
-  return REGEX.swYaml.test(path);
-}
-
-export function isServerlessDecision(path: string): boolean {
-  return REGEX.yard.test(path);
-}
-
-export function isDashbuilder(path: string): boolean {
-  return REGEX.dash.test(path);
-}
-
 export function isModel(path: string): boolean {
-  return isServerlessWorkflow(path) || isServerlessDecision(path) || isDashbuilder(path);
+  return isOfKind("sw", path) || isOfKind("yard", path) || isOfKind("dash", path);
 }
 
 export function isEditable(path: string): boolean {
@@ -93,19 +51,7 @@ export function isEditable(path: string): boolean {
 }
 
 export function isSupportedByVirtualServiceRegistry(path: string): boolean {
-  return isServerlessWorkflow(path) || isSpec(path);
-}
-
-export function isSpec(path: string): boolean {
-  return REGEX.spec.test(path);
-}
-
-export function isJson(path: string): boolean {
-  return REGEX.json.test(path);
-}
-
-export function isYaml(path: string): boolean {
-  return REGEX.yaml.test(path);
+  return isOfKind("sw", path) || isOfKind("spec", path);
 }
 
 export type SupportedFileExtensions = typeof supportedFileExtensionArray[number];
diff --git a/packages/serverless-logic-web-tools/src/home/sample/SampleCard.tsx b/packages/serverless-logic-web-tools/src/home/sample/SampleCard.tsx
new file mode 100644
index 0000000000..31475546ff
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/home/sample/SampleCard.tsx
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { useMemo, useRef, useEffect } from "react";
+import { Card, CardTitle, CardFooter, CardBody } from "@patternfly/react-core/dist/js/components/Card";
+import { Grid, GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
+import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
+import { useRoutes } from "../../navigation/Hooks";
+import { Link } from "react-router-dom";
+import { Text } from "@patternfly/react-core/dist/js/components/Text";
+import { Label, LabelProps } from "@patternfly/react-core/dist/js/components/Label";
+import { FolderIcon, FileIcon, MonitoringIcon } from "@patternfly/react-icons/dist/js/icons";
+import { Sample, SampleCategory } from "./sampleApi";
+import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
+import { Bullseye } from "@patternfly/react-core/dist/js/layouts/Bullseye";
+
+const tagMap: Record<SampleCategory, { label: string; icon: React.ComponentClass; color: LabelProps["color"] }> = {
+  ["serverless-workflow"]: {
+    label: "Serverless Workflow",
+    icon: FileIcon,
+    color: "orange",
+  },
+  ["serverless-decision"]: {
+    label: "Serverless Decision",
+    icon: FolderIcon,
+    color: "blue",
+  },
+  ["dashbuilder"]: {
+    label: "Dashboard",
+    icon: MonitoringIcon,
+    color: "purple",
+  },
+};
+
+export function SampleCard(props: { sample: Sample }) {
+  const routes = useRoutes();
+  const imgRef = useRef<HTMLImageElement>(null);
+  const tag = useMemo(() => tagMap[props.sample.definition.category], [props.sample.definition.category]);
+
+  useEffect(() => {
+    const blob = new Blob([props.sample.svgContent], { type: "image/svg+xml" });
+    const url = URL.createObjectURL(blob);
+    imgRef.current!.addEventListener("load", () => URL.revokeObjectURL(url), { once: true });
+    imgRef.current!.src = url;
+  }, [props.sample.svgContent]);
+
+  return (
+    <Card isCompact={true} isFullHeight={true}>
+      <Grid style={{ height: "100%" }}>
+        <GridItem
+          lg={6}
+          style={{ overflow: "hidden", textAlign: "center", verticalAlign: "middle", position: "relative" }}
+        >
+          <div style={{ position: "absolute", bottom: "16px", right: 0, left: 0, margin: "auto" }}>
+            <Label color={tag.color}>
+              <tag.icon />
+              &nbsp;&nbsp;<b>{tag.label}</b>
+            </Label>
+          </div>
+          <Bullseye style={{ padding: "0px 8px 30px 8px" }}>
+            <img
+              style={{ height: "370px", maxWidth: "100%" }}
+              ref={imgRef}
+              alt={`SVG for sample ${props.sample.sampleId}`}
+            />
+          </Bullseye>
+        </GridItem>
+        <GridItem lg={6} style={{ display: "flex", flexDirection: "column" }}>
+          <CardTitle data-ouia-component-type="sample-title">{props.sample.definition.title}</CardTitle>
+          <CardBody isFilled={true}>
+            <Tooltip content={<div>{props.sample.definition.description}</div>}>
+              <Text
+                component="p"
+                style={{
+                  display: "-webkit-box",
+                  WebkitBoxOrient: "vertical",
+                  WebkitLineClamp: 5,
+                  overflow: "hidden",
+                  textOverflow: "ellipsis",
+                  whiteSpace: "pre-wrap",
+                }}
+              >
+                {props.sample.definition.description}
+              </Text>
+            </Tooltip>
+          </CardBody>
+          <CardFooter style={{ alignItems: "baseline" }}>
+            <Link
+              to={{
+                pathname: routes.sampleShowcase.path({}),
+                search: routes.sampleShowcase.queryString({ sampleId: props.sample.sampleId }),
+              }}
+            >
+              <Button variant={ButtonVariant.tertiary} ouiaId={props.sample.sampleId + `-try-swf-sample-button`}>
+                Try it out!
+              </Button>
+            </Link>
+          </CardFooter>
+        </GridItem>
+      </Grid>
+    </Card>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/home/sample/SampleCardSkeleton.css b/packages/serverless-logic-web-tools/src/home/sample/SampleCardSkeleton.css
new file mode 100644
index 0000000000..cc7433efff
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/home/sample/SampleCardSkeleton.css
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.sample-card-skeleton--gallery {
+  overflow-x: auto;
+  grid-auto-flow: column;
+  grid-auto-columns: minmax(calc(100% / 3.1 - 16px), 1fr);
+  padding-bottom: 8px;
+  padding-right: var(--pf-c-page__main-section--xl--PaddingRight);
+  height: 430px;
+}
+
+.sample-card-skeleton--grid {
+  height: 100%;
+}
+
+.sample-card-skeleton--grid-item {
+  overflow: hidden;
+  text-align: center;
+  vertical-align: middle;
+  position: relative;
+}
+
+.sample-card-skeleton--label {
+  position: absolute;
+  bottom: 16px;
+  right: 0;
+  left: 0;
+  margin-left: 20px;
+}
+
+.sample-card-skeleton--svg {
+  margin: 20px;
+}
+
+.sample-card-skeleton--grid-content-item {
+  display: flex;
+  flex-direction: column;
+}
+
+.sample-card-skeleton--card-footer-style {
+  align-items: baseline;
+}
diff --git a/packages/serverless-logic-web-tools/src/home/sample/SampleCardSkeleton.tsx b/packages/serverless-logic-web-tools/src/home/sample/SampleCardSkeleton.tsx
new file mode 100644
index 0000000000..97efa00e93
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/home/sample/SampleCardSkeleton.tsx
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from "react";
+import { Skeleton } from "@patternfly/react-core/dist/js/components/Skeleton";
+import { Card, CardTitle, CardFooter, CardBody } from "@patternfly/react-core/dist/js/components/Card";
+import { Grid, GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
+import { Gallery } from "@patternfly/react-core/dist/js/layouts/Gallery";
+import "./SampleCardSkeleton.css";
+
+export function SampleCardSkeleton(props: { numberOfCards: number }) {
+  return (
+    <Gallery
+      hasGutter={true}
+      minWidths={{ sm: "calc(100%/3.1 - 16px)", default: "100%" }}
+      className="sample-card-skeleton--gallery"
+    >
+      {Array(props.numberOfCards)
+        .fill(undefined)
+        .map((_item, index) => (
+          <Card isCompact={true} key={index} isFullHeight={true}>
+            <Grid className="sample-card-skeleton--grid">
+              <GridItem md={6} className="sample-card-skeleton--grid-item">
+                <div className="sample-card-skeleton--label">
+                  <Skeleton width="90%" />
+                </div>
+                <Skeleton
+                  shape="square"
+                  width="90%"
+                  height="80%"
+                  screenreaderText="Loading svg"
+                  className="sample-card-skeleton--svg"
+                />
+              </GridItem>
+              <GridItem md={6} className="sample-card-skeleton--grid-content-item">
+                <CardTitle data-ouia-component-type="sample-title">
+                  <Skeleton width="90%" />
+                </CardTitle>
+                <CardBody isFilled={true}>
+                  <Skeleton shape="square" width="90%" height="80%" screenreaderText="Loading description" />
+                </CardBody>
+                <CardFooter className="sample-card-skeleton--card-footer-style">
+                  <Skeleton width="90%" />
+                </CardFooter>
+              </GridItem>
+            </Grid>
+          </Card>
+        ))}
+    </Gallery>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/home/sample/SamplesLoadError.tsx b/packages/serverless-logic-web-tools/src/home/sample/SamplesLoadError.tsx
new file mode 100644
index 0000000000..cace4ef168
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/home/sample/SamplesLoadError.tsx
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { PageSection } from "@patternfly/react-core/dist/js/components/Page";
+import { EmptyState, EmptyStateBody } from "@patternfly/react-core/dist/js/components/EmptyState";
+import { EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
+import { ExclamationTriangleIcon } from "@patternfly/react-icons/dist/js/icons/exclamation-triangle-icon";
+import { Text, TextContent } from "@patternfly/react-core/dist/js/components/Text";
+import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
+import * as React from "react";
+import { useMemo, useState } from "react";
+import { ClipboardCopy, ClipboardCopyVariant } from "@patternfly/react-core/dist/js/components/ClipboardCopy";
+
+export interface Props {
+  errors: string[];
+}
+
+export function SamplesLoadError(props: Props) {
+  const [showDetails, setShowDetails] = useState(false);
+
+  const detailsString = useMemo(() => {
+    return props.errors.join("\n");
+  }, [props.errors]);
+
+  return (
+    <PageSection variant={"light"} isFilled={true} style={{ marginRight: "25px" }}>
+      <EmptyState>
+        <EmptyStateIcon icon={ExclamationTriangleIcon} />
+        <TextContent>
+          <Text component={"h2"}>{"Can't load samples"}</Text>
+        </TextContent>
+        <EmptyStateBody>
+          <PageSection>
+            <TextContent style={{ textOverflow: "ellipsis", overflow: "hidden" }}>
+              {`There was an error loading samples.`}
+            </TextContent>
+            <br />
+            {props.errors && (
+              <>
+                <Button variant={ButtonVariant.link} onClick={() => setShowDetails((prev) => !prev)}>
+                  {showDetails ? "Hide details" : "Show details"}
+                </Button>
+
+                {showDetails && (
+                  <PageSection variant={"light"} isFilled={true} style={{ height: "100%", minWidth: "1000px" }}>
+                    <ClipboardCopy
+                      variant={ClipboardCopyVariant.expansion}
+                      isReadOnly={true}
+                      hoverTip="Copy"
+                      clickTip="Copied"
+                    >{`${detailsString}`}</ClipboardCopy>
+                  </PageSection>
+                )}
+              </>
+            )}
+          </PageSection>
+        </EmptyStateBody>
+      </EmptyState>
+    </PageSection>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/home/sample/Showcase.tsx b/packages/serverless-logic-web-tools/src/home/sample/Showcase.tsx
new file mode 100644
index 0000000000..e1839b9c36
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/home/sample/Showcase.tsx
@@ -0,0 +1,211 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { useEffect, useState, useCallback, useMemo } from "react";
+import { TextContent, Text } from "@patternfly/react-core/dist/js/components/Text";
+import { SampleCard } from "./SampleCard";
+import { Gallery } from "@patternfly/react-core/dist/js/layouts/Gallery";
+import { Sample, SampleCategory } from "./sampleApi";
+import { SampleCardSkeleton } from "./SampleCardSkeleton";
+import { SamplesLoadError } from "./SamplesLoadError";
+import { useSampleDispatch } from "./hooks/SampleContext";
+import { SearchInput } from "@patternfly/react-core/dist/js/components/SearchInput";
+import { PageSection } from "@patternfly/react-core/dist/js/components/Page";
+import { EmptyState, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
+import { Title } from "@patternfly/react-core/dist/js/components/Title";
+import { CubesIcon } from "@patternfly/react-icons/dist/js/icons/cubes-icon";
+import {
+  Dropdown,
+  DropdownItem,
+  DropdownSeparator,
+  DropdownToggle,
+} from "@patternfly/react-core/dist/js/components/Dropdown";
+import { FileLabel } from "../../workspace/components/FileLabel";
+import { Flex, FlexItem } from "@patternfly/react-core/dist/js/layouts/Flex";
+
+const SAMPLE_PRIORITY: Record<SampleCategory, number> = {
+  ["serverless-workflow"]: 1,
+  ["dashbuilder"]: 2,
+  ["serverless-decision"]: 3,
+};
+
+const LABEL_MAP: Record<SampleCategory, JSX.Element> = {
+  ["serverless-workflow"]: <FileLabel extension="sw.yaml" labelProps={{ isCompact: true }} />,
+  ["dashbuilder"]: <FileLabel extension="dash.yaml" labelProps={{ isCompact: true }} />,
+  ["serverless-decision"]: <FileLabel extension="yard.yaml" labelProps={{ isCompact: true }} />,
+};
+
+const ALL_CATEGORIES_LABEL = "All categories";
+
+const CATEGORY_ARRAY = Object.keys(SAMPLE_PRIORITY) as SampleCategory[];
+
+export function Showcase() {
+  const sampleDispatch = useSampleDispatch();
+  const [loading, setLoading] = useState<boolean>(true);
+  const [samples, setSamples] = useState<Sample[]>([]);
+  const [sampleLoadingError, setSampleLoadingError] = useState("");
+  const [searchFilter, setSearchFilter] = useState("");
+  const [categoryFilter, setCategoryFilter] = useState<SampleCategory | undefined>();
+  const [isCategoryFilterDropdownOpen, setCategoryFilterDropdownOpen] = useState(false);
+
+  const onSearch = useCallback(
+    async (args: { searchValue: string; category?: SampleCategory }) => {
+      if (args.searchValue === searchFilter && args.category === categoryFilter) {
+        return;
+      }
+      setSearchFilter(args.searchValue);
+      setCategoryFilter(args.category);
+      setSamples(await sampleDispatch.getSamples({ searchFilter: args.searchValue, categoryFilter: args.category }));
+    },
+    [categoryFilter, sampleDispatch, searchFilter]
+  );
+
+  useEffect(() => {
+    sampleDispatch
+      .getSamples({})
+      .then((data) => {
+        const sortedSamples = data.sort(
+          (a: Sample, b: Sample) => SAMPLE_PRIORITY[a.definition.category] - SAMPLE_PRIORITY[b.definition.category]
+        );
+        setSamples([...sortedSamples]);
+      })
+      .catch((e) => {
+        setSampleLoadingError(e.toString());
+      })
+      .finally(() => {
+        setLoading(false);
+      });
+  }, [sampleDispatch]);
+
+  const filterResultMessage = useMemo(() => {
+    if (samples.length === 0) {
+      return;
+    }
+    const isPlural = samples.length > 1;
+    return `Showing ${samples.length} sample${isPlural ? "s" : ""}`;
+  }, [samples.length]);
+
+  const selectedCategory = useMemo(() => {
+    if (categoryFilter) {
+      return LABEL_MAP[categoryFilter];
+    }
+    return ALL_CATEGORIES_LABEL;
+  }, [categoryFilter]);
+
+  const categoryFilterDropdownItems = useMemo(
+    () => [
+      <DropdownItem
+        key="category-filter-all-categories"
+        onClick={() => onSearch({ searchValue: searchFilter, category: undefined })}
+      >
+        {ALL_CATEGORIES_LABEL}
+      </DropdownItem>,
+      <DropdownSeparator key="category-filter-separator" />,
+      ...CATEGORY_ARRAY.map((category: SampleCategory) => (
+        <DropdownItem
+          key={`category-filter-${category}`}
+          onClick={() => onSearch({ searchValue: searchFilter, category })}
+        >
+          {LABEL_MAP[category]}
+        </DropdownItem>
+      )),
+    ],
+    [onSearch, searchFilter]
+  );
+
+  return (
+    <>
+      {sampleLoadingError && <SamplesLoadError errors={[sampleLoadingError]} />}
+      {!sampleLoadingError && (
+        <>
+          <TextContent>
+            <Text component="h1">Samples Showcase</Text>
+          </TextContent>
+          <br />
+          <Flex flexWrap={{ default: "wrap" }}>
+            <FlexItem style={{ marginRight: 0 }}>
+              <SearchInput
+                value={""}
+                type={"search"}
+                onChange={(_ev, value) => onSearch({ searchValue: value, category: categoryFilter })}
+                onClear={() => onSearch({ searchValue: "", category: categoryFilter })}
+                onFocus={() => setCategoryFilterDropdownOpen(false)}
+                placeholder={"Find samples"}
+                style={{ width: "400px" }}
+                onClick={(e) => {
+                  e.stopPropagation();
+                }}
+              />
+            </FlexItem>
+            <FlexItem>
+              <Dropdown
+                style={{ backgroundColor: "white" }}
+                onSelect={() => setCategoryFilterDropdownOpen(false)}
+                dropdownItems={categoryFilterDropdownItems}
+                toggle={
+                  <DropdownToggle
+                    id="category-filter-dropdown"
+                    onToggle={(isOpen: boolean) => setCategoryFilterDropdownOpen(isOpen)}
+                  >
+                    {selectedCategory}
+                  </DropdownToggle>
+                }
+                isOpen={isCategoryFilterDropdownOpen}
+              />
+            </FlexItem>
+            <FlexItem>
+              {filterResultMessage && (
+                <TextContent>
+                  <Text>{filterResultMessage}</Text>
+                </TextContent>
+              )}
+            </FlexItem>
+          </Flex>
+          <br />
+          {loading && <SampleCardSkeleton numberOfCards={4} />}
+          {!loading && samples.length === 0 && (
+            <PageSection variant={"light"} isFilled={true} style={{ marginRight: "25px" }}>
+              <EmptyState style={{ height: "350px" }}>
+                <EmptyStateIcon icon={CubesIcon} />
+                <Title headingLevel="h4" size="lg">
+                  {"None of the available samples matched this search"}
+                </Title>
+              </EmptyState>
+            </PageSection>
+          )}
+          {!loading && samples.length > 0 && (
+            <Gallery
+              hasGutter={true}
+              minWidths={{ sm: "calc(100%/3.1 - 16px)", default: "100%" }}
+              style={{
+                overflowX: "auto",
+                gridAutoFlow: "column",
+                gridAutoColumns: "minmax(calc(100%/3.1 - 16px),1fr)",
+                paddingBottom: "8px",
+                paddingRight: "var(--pf-c-page__main-section--xl--PaddingRight)",
+              }}
+            >
+              {samples.map((sample) => (
+                <SampleCard sample={sample} key={`sample-${sample.sampleId}`} />
+              ))}
+            </Gallery>
+          )}
+        </>
+      )}
+    </>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/home/sample/hooks/SampleContext.tsx b/packages/serverless-logic-web-tools/src/home/sample/hooks/SampleContext.tsx
new file mode 100644
index 0000000000..f8fdbd7e4c
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/home/sample/hooks/SampleContext.tsx
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { LfsStorageFile, LfsStorageService } from "@kie-tools-core/workspaces-git-fs/dist/lfs/LfsStorageService";
+import { LfsFsCache } from "@kie-tools-core/workspaces-git-fs/dist/lfs/LfsFsCache";
+import { LocalFile } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/LocalFile";
+import * as React from "react";
+import { useContext, useMemo, useCallback, useState } from "react";
+import { useSettingsDispatch } from "../../../settings/SettingsContext";
+import { fetchSampleDefinitions, fetchSampleFiles, Sample, SampleCategory } from "../sampleApi";
+import { decoder, encoder } from "@kie-tools-core/workspaces-git-fs/dist/encoderdecoder/EncoderDecoder";
+import Fuse from "fuse.js";
+
+const SAMPLE_DEFINITIONS_CACHE_FILE_PATH = "/definitions.json";
+const SAMPLES_FS_MOUNT_POINT = `lfs_v1__samples__${process.env.WEBPACK_REPLACE__version!}`;
+const SEARCH_KEYS = ["definition.category", "definition.title", "definition.description"];
+
+export interface SampleDispatchContextType {
+  getSamples(args: { categoryFilter?: SampleCategory; searchFilter?: string }): Promise<Sample[]>;
+  getSampleFiles(sampleId: string): Promise<LocalFile[]>;
+}
+
+export const SampleDispatchContext = React.createContext<SampleDispatchContextType>({} as any);
+
+export function SampleContextProvider(props: React.PropsWithChildren<{}>) {
+  const settingsDispatch = useSettingsDispatch();
+
+  const fsCache = useMemo(() => new LfsFsCache(), []);
+  const fs = useMemo(() => fsCache.getOrCreateFs(SAMPLES_FS_MOUNT_POINT), [fsCache]);
+  const sampleStorageService = useMemo(() => new LfsStorageService(), []);
+
+  const [allSampleDefinitions, setAllSampleDefinitions] = useState<Sample[]>();
+
+  const loadCache = useCallback(
+    async (args: { path: string; loadFn: () => Promise<any> }) => {
+      const storageFile = await sampleStorageService.getFile(fs, args.path);
+      if (storageFile) {
+        const cacheContent = decoder.decode(await storageFile.getFileContents());
+        return JSON.parse(cacheContent);
+      }
+      const content = await args.loadFn();
+      const cacheFile = new LfsStorageFile({
+        path: args.path,
+        getFileContents: async () => encoder.encode(JSON.stringify(content)),
+      });
+      await sampleStorageService.createFiles(fs, [cacheFile]);
+      return content;
+    },
+    [fs, sampleStorageService]
+  );
+
+  const getSamples = useCallback(
+    async (args: { categoryFilter?: SampleCategory; searchFilter?: string }) => {
+      let filteredSamples: Sample[];
+      if (!allSampleDefinitions) {
+        filteredSamples = (await loadCache({
+          path: SAMPLE_DEFINITIONS_CACHE_FILE_PATH,
+          loadFn: async () => fetchSampleDefinitions(settingsDispatch.github.octokit),
+        })) as Sample[];
+
+        setAllSampleDefinitions(filteredSamples);
+      } else {
+        filteredSamples = allSampleDefinitions;
+      }
+
+      if (args.categoryFilter) {
+        filteredSamples = filteredSamples.filter((s) => s.definition.category === args.categoryFilter);
+      }
+
+      if (args.searchFilter && args.searchFilter.trim().length > 0) {
+        const fuse = new Fuse(filteredSamples, {
+          keys: SEARCH_KEYS,
+          shouldSort: false,
+          threshold: 0.3,
+        });
+
+        filteredSamples = fuse.search(args.searchFilter).map((r) => r.item);
+      }
+
+      return filteredSamples;
+    },
+    [allSampleDefinitions, loadCache, settingsDispatch.github.octokit]
+  );
+
+  const getSampleFiles = useCallback(
+    async (sampleId: string) => fetchSampleFiles({ octokit: settingsDispatch.github.octokit, sampleId }),
+    [settingsDispatch.github.octokit]
+  );
+
+  const dispatch = useMemo(() => ({ getSamples, getSampleFiles }), [getSamples, getSampleFiles]);
+  return <SampleDispatchContext.Provider value={dispatch}>{props.children}</SampleDispatchContext.Provider>;
+}
+
+export function useSampleDispatch() {
+  return useContext(SampleDispatchContext);
+}
diff --git a/packages/serverless-logic-web-tools/src/home/sample/sampleApi.ts b/packages/serverless-logic-web-tools/src/home/sample/sampleApi.ts
new file mode 100644
index 0000000000..e4054706dc
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/home/sample/sampleApi.ts
@@ -0,0 +1,232 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { LocalFile } from "@kie-tools-core/workspaces-git-fs/dist/worker/api/LocalFile";
+import { Octokit } from "@octokit/rest";
+import { extname, join } from "path";
+import { decoder, encoder } from "@kie-tools-core/workspaces-git-fs/dist/encoderdecoder/EncoderDecoder";
+
+interface FileData {
+  content: string;
+  encoding: BufferEncoding;
+}
+
+interface SampleDefinitionFile {
+  sampleId: string;
+  definitionPath: string;
+}
+
+interface GitHubRepoInfo {
+  owner: string;
+  repo: string;
+  ref: string;
+}
+
+type GitHubFileInfo = GitHubRepoInfo & { path: string };
+
+export type SampleCategory = "serverless-workflow" | "serverless-decision" | "dashbuilder";
+
+const SAMPLE_DEFINITION_FILE = "definition.json";
+
+const SAMPLE_TEMPLATE_FOLDER = "template";
+
+const SVG_EXTENSION = ".svg";
+
+const SAMPLE_FOLDER = "samples";
+
+type SampleStatus = "ok" | "out of date" | "deprecated";
+
+interface SampleDefinition {
+  category: SampleCategory;
+  status: SampleStatus;
+  title: string;
+  description: string;
+  cover: string;
+  tags: string[];
+}
+
+interface ContentData {
+  type: string;
+  download_url: string;
+  git_url: string;
+  html_url: string;
+  name: string;
+  path: string;
+  sha: string;
+  size: number;
+  url: string;
+}
+
+export type Sample = {
+  sampleId: string;
+  definition: SampleDefinition;
+  svgContent: string;
+};
+
+export const KIE_SAMPLES_REPO: GitHubFileInfo = {
+  owner: "kiegroup",
+  repo: "kie-samples",
+  ref: process.env["WEBPACK_REPLACE__samplesRepositoryRef"]!,
+  path: "samples",
+};
+
+async function fetchFileContent(args: { octokit: Octokit; fileInfo: GitHubFileInfo }): Promise<string | undefined> {
+  try {
+    const content = await args.octokit.repos.getContent({ ...args.fileInfo });
+    if (content) {
+      const fileData = content.data as FileData;
+      return decoder.decode(new Uint8Array(Buffer.from(fileData.content, fileData.encoding)));
+    }
+  } catch (e) {
+    console.debug(`Error fetching ${args.fileInfo.path} with Octokit. Fallback is 'raw.githubusercontent.com'.`);
+    const rawFileResponse = await fetch(
+      `https://raw.githubusercontent.com/${args.fileInfo.owner}/${args.fileInfo.repo}/${args.fileInfo.ref}/${args.fileInfo.path}`
+    );
+    if (rawFileResponse.ok) {
+      return await rawFileResponse.text();
+    }
+  }
+}
+
+async function fetchFolderFiles(args: {
+  octokit: Octokit;
+  fileInfo: GitHubFileInfo;
+}): Promise<ContentData[] | undefined> {
+  try {
+    const folderContent = await args.octokit.repos.getContent({
+      ...args.fileInfo,
+    });
+
+    if (!folderContent || !folderContent.data) {
+      return;
+    }
+
+    return folderContent.data as ContentData[];
+  } catch (e) {
+    console.debug(`Error fetching ${args.fileInfo.path} with Octokit.`);
+  }
+}
+
+async function listSampleDefinitionFiles(args: {
+  octokit: Octokit;
+  repoInfo: GitHubRepoInfo;
+}): Promise<SampleDefinitionFile[]> {
+  const samplesFolders = await fetchFolderFiles({
+    octokit: args.octokit,
+    fileInfo: {
+      ...args.repoInfo,
+      path: SAMPLE_FOLDER,
+    },
+  });
+
+  if (!samplesFolders) {
+    throw new Error(
+      `Cannot fetch samples folder at https://github.com/${KIE_SAMPLES_REPO.owner}/${KIE_SAMPLES_REPO.repo}`
+    );
+  }
+
+  return samplesFolders
+    .filter((folder) => folder.name !== SAMPLE_TEMPLATE_FOLDER)
+    .map((folder) => ({ sampleId: folder.name, definitionPath: join(folder.path, SAMPLE_DEFINITION_FILE) }));
+}
+
+export async function fetchSampleDefinitions(octokit: Octokit): Promise<Sample[]> {
+  const sampleDefinitionFiles = await listSampleDefinitionFiles({
+    octokit,
+    repoInfo: { ...KIE_SAMPLES_REPO },
+  });
+
+  const samples = (
+    await Promise.all(
+      sampleDefinitionFiles.map(async (definitionFile) => {
+        const fileContent = await fetchFileContent({
+          octokit,
+          fileInfo: {
+            ...KIE_SAMPLES_REPO,
+            path: definitionFile.definitionPath,
+          },
+        });
+
+        if (!fileContent) {
+          console.error(`Could not read sample definition for ${definitionFile.sampleId}`);
+          return null;
+        }
+
+        const definition = JSON.parse(fileContent) as SampleDefinition;
+        const svgContent = await fetchFileContent({
+          octokit,
+          fileInfo: {
+            ...KIE_SAMPLES_REPO,
+            path: join("samples", definitionFile.sampleId, definition.cover),
+          },
+        });
+
+        if (!svgContent) {
+          console.error(`Could not read sample svg for ${definitionFile.sampleId}`);
+          return null;
+        }
+
+        return {
+          sampleId: definitionFile.sampleId,
+          definition,
+          svgContent,
+        };
+      })
+    )
+  ).filter((sample) => sample !== null) as Sample[];
+
+  if (samples.length === 0) {
+    throw new Error("No samples could be loaded.");
+  }
+
+  return samples;
+}
+
+export async function fetchSampleFiles(args: { octokit: Octokit; sampleId: string }): Promise<LocalFile[]> {
+  const sampleFolderFiles = await fetchFolderFiles({
+    octokit: args.octokit,
+    fileInfo: {
+      ...KIE_SAMPLES_REPO,
+      path: decodeURIComponent(`${KIE_SAMPLES_REPO.path}/${args.sampleId}`),
+    },
+  });
+
+  if (!sampleFolderFiles) {
+    throw new Error(`Sample ${args.sampleId} not found`);
+  }
+
+  const sampleFiles = sampleFolderFiles
+    .filter((file) => file.name !== SAMPLE_DEFINITION_FILE && extname(file.name) !== SVG_EXTENSION)
+    .map(async (file) => {
+      const fileContent = await fetchFileContent({
+        octokit: args.octokit,
+        fileInfo: {
+          ...KIE_SAMPLES_REPO,
+          path: file.path,
+        },
+      });
+
+      if (!fileContent) {
+        throw new Error(`Could not get file contents for ${file.path}`);
+      }
+
+      return {
+        path: decodeURIComponent(file.path).split(`${SAMPLE_FOLDER}/${args.sampleId}`)[1],
+        fileContents: encoder.encode(fileContent),
+      };
+    });
+  return Promise.all(sampleFiles);
+}
diff --git a/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx
index e286bc94c0..b49ecb1f3a 100644
--- a/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx
@@ -15,7 +15,7 @@
  */
 
 import * as React from "react";
-import { FileTypes } from "../../extension";
+import { FileTypes } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
 import { Grid, GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
 import { Gallery } from "@patternfly/react-core/dist/js/layouts/Gallery";
 import { PageSection } from "@patternfly/react-core/dist/js/components/Page";
diff --git a/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx b/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx
index 5885cc544d..896194c6cc 100644
--- a/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/routes/HomePageRoutes.tsx
@@ -19,13 +19,14 @@ import { Switch } from "react-router";
 import { Overview } from "../overView/Overview";
 import { RecentModels } from "../recentModels/RecentModels";
 import { Route } from "react-router-dom";
-import { SampleCatalog } from "../sampleCatalog/SampleCatalog";
 import { useRoutes } from "../../navigation/Hooks";
 import { supportedFileExtensionArray } from "../../extension";
-import { NewWorkspaceWithEmptyFilePage } from "../../workspace/components/NewWorkspaceWithEmptyFilePage";
+import { NewWorkspaceFromSample } from "../../workspace/components/NewWorkspaceFromSample";
 import { NewWorkspaceFromUrlPage } from "../../workspace/components/NewWorkspaceFromUrlPage";
+import { NewWorkspaceWithEmptyFilePage } from "../../workspace/components/NewWorkspaceWithEmptyFilePage";
 import { EditorPage } from "../../editor/EditorPage";
 import { NoMatchPage } from "../../navigation/NoMatchPage";
+import { Showcase } from "../../home/sample/Showcase";
 
 export function HomePageRoutes(props: { isNavOpen: boolean }) {
   const routes = useRoutes();
@@ -38,6 +39,9 @@ export function HomePageRoutes(props: { isNavOpen: boolean }) {
       <Route path={routes.importModel.path({})}>
         <NewWorkspaceFromUrlPage />
       </Route>
+      <Route path={routes.sampleShowcase.path({})}>
+        <NewWorkspaceFromSample />
+      </Route>
       <Route
         path={routes.workspaceWithFilePath.path({
           workspaceId: ":workspaceId",
@@ -61,7 +65,7 @@ export function HomePageRoutes(props: { isNavOpen: boolean }) {
         <RecentModels />
       </Route>
       <Route path={routes.sampleCatalog.path({})}>
-        <SampleCatalog />
+        <Showcase />
       </Route>
       <Route component={NoMatchPage} />
     </Switch>
diff --git a/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/SampleCard.tsx b/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/SampleCard.tsx
deleted file mode 100644
index 689412102c..0000000000
--- a/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/SampleCard.tsx
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import * as React from "react";
-import { useMemo } from "react";
-import { Card, CardTitle, CardFooter, CardBody } from "@patternfly/react-core/dist/js/components/Card";
-import { Grid, GridItem } from "@patternfly/react-core/dist/js/layouts/Grid";
-import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
-import { useRoutes } from "../../navigation/Hooks";
-import { Link } from "react-router-dom";
-import { Text } from "@patternfly/react-core/dist/js/components/Text";
-import { Label } from "@patternfly/react-core/dist/js/components/Label";
-import { FileTypes } from "../../extension";
-import { Sample, tagMap } from "./Types";
-
-export function SampleCard({ sample }: { sample: Sample }) {
-  const routes = useRoutes();
-
-  const tag = useMemo(() => tagMap[sample.type], [sample.type]);
-
-  return (
-    <Card isCompact={true} isFullHeight={true}>
-      <Grid style={{ height: "100%" }}>
-        <GridItem
-          md={6}
-          style={{ overflow: "hidden", textAlign: "center", verticalAlign: "middle", position: "relative" }}
-        >
-          <div style={{ position: "absolute", bottom: "16px", right: 0, left: 0, margin: "auto" }}>
-            <Label color={tag.color}>
-              <tag.icon />
-              &nbsp;&nbsp;<b>{tag.label}</b>
-            </Label>
-          </div>
-          <sample.svg style={{ height: "100%", maxWidth: "100%", maxHeight: "400px" }} />
-        </GridItem>
-        <GridItem md={6} style={{ display: "flex", flexDirection: "column" }}>
-          <CardTitle data-ouia-component-type="sample-title">{sample.name}</CardTitle>
-          <CardBody isFilled={true}>
-            <Text component="p">{sample.description}</Text>
-          </CardBody>
-          <CardFooter style={{ alignItems: "baseline" }}>
-            <Link
-              to={{
-                pathname: routes.importModel.path({}),
-                search: routes.importModel.queryString({
-                  url:
-                    sample.repoUrl ??
-                    `${window.location.origin}${window.location.pathname}${routes.static.sample.path({
-                      type: sample.type || FileTypes.SW_JSON,
-                      name: sample.fileName,
-                    })}`,
-                  renameWorkspace: sample.name,
-                  ...(sample.repoUrl ? { removeRemote: "true" } : {}),
-                }),
-              }}
-            >
-              <Button variant={ButtonVariant.tertiary} ouiaId={sample.fileName + `-try-swf-sample-button`}>
-                Try it out!
-              </Button>
-            </Link>
-          </CardFooter>
-        </GridItem>
-      </Grid>
-    </Card>
-  );
-}
diff --git a/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/SampleCatalog.tsx b/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/SampleCatalog.tsx
deleted file mode 100644
index b26bc2c997..0000000000
--- a/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/SampleCatalog.tsx
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import * as React from "react";
-import { TextContent, Text } from "@patternfly/react-core/dist/js/components/Text";
-import { Sample, SampleType } from "./Types";
-import { ReactComponent as GreetingsSvg } from "../../../static/samples/greetings/greetings.svg";
-import { ReactComponent as GreetingsKafkaSvg } from "../../../static/samples/greetings-kafka/greetings-kafka.svg";
-import { ReactComponent as ProductsDashboardSvg } from "../../../static/samples/products-dashboard/products-dashboard.svg";
-import { ReactComponent as SwfReportSvg } from "../../../static/samples/swf-report/swf-report.svg";
-import { ReactComponent as KitchensinkSvg } from "../../../static/samples/kitchensink/kitchensink.svg";
-import { ReactComponent as CompensationSvg } from "../../../static/samples/compensation/compensation.svg";
-import { Gallery } from "@patternfly/react-core/dist/js/layouts/Gallery";
-import { SampleCard } from "./SampleCard";
-
-const samples: Array<Sample> = [
-  {
-    name: "Greetings",
-    fileName: "greetings",
-    svg: GreetingsSvg,
-    description: `This example shows a single Operation State with one action that calls the "greeting" function. The workflow data input is assumed to be the name of the person to greet. The results of the action is assumed to be the greeting for the provided persons name, which is added to the states data and becomes the workflow data output.`,
-    type: SampleType.SW_JSON,
-  },
-  {
-    name: "Greetings with Kafka events",
-    fileName: "greetings-kafka",
-    svg: GreetingsKafkaSvg,
-    description: `This example is similar to the Greetings sample, but this time the "greeting" function is triggered via an Apache Kafka event. The event payload is assumed to be the name of the person to greet and in which language. The results of the action is assumed to be the greeting for the provided persons name, which is added to the states data and becomes the workflow data output.`,
-    type: SampleType.SW_JSON,
-  },
-  {
-    name: "Compensation",
-    fileName: "compensation",
-    svg: CompensationSvg,
-    description: `This example contains a simple workflow service that illustrate compensation handling. This is simple workflow that expects a boolean shouldCompensate to indicate if compensation segment (which is composed by two inject states) should be executed or not. The process result is a boolean field compensated which value should match shouldCompensate.`,
-    type: SampleType.SW_JSON,
-  },
-  {
-    name: "Dashbuilder Kitchensink",
-    fileName: "kitchensink",
-    svg: KitchensinkSvg,
-    description: `Explore all Dashbuilder components. Navigate in tabs to learn about Dashbuilder concepts and check how to use and the look of all visual components available for use in Dashbuilder.`,
-    type: SampleType.DASH_YML,
-  },
-  {
-    name: "Products Dashboard",
-    fileName: "products-dashboard",
-    svg: ProductsDashboardSvg,
-    description:
-      'In this example we show a dashboard from a "products" dataset. It displays the dataset information in a bar chart grouping products by counting them. At the end we have a table listing all products.',
-    type: SampleType.DASH_YML,
-  },
-  {
-    name: "Serverless Workflow Report",
-    fileName: "swf-report",
-    svg: SwfReportSvg,
-    description:
-      "This example is for Serverless Workflow Data Index. It connects to data index to retrieve information about running and completed workflows. The top row shows a general overview of workflow states, the middle row contains charts to compare workflows execution. This information can be filtered using the small combo box on right side. Finally a table shows all the workflows details.",
-    type: SampleType.DASH_YML,
-  },
-];
-
-export function SampleCatalog() {
-  return (
-    <>
-      <TextContent>
-        <Text component="h1">Samples Showcase</Text>
-      </TextContent>
-      <br />
-      <Gallery
-        hasGutter={true}
-        minWidths={{ sm: "calc(100%/3.1 - 16px)", default: "100%" }}
-        style={{
-          overflowX: "auto",
-          gridAutoFlow: "column",
-          gridAutoColumns: "minmax(calc(100%/3.1 - 16px),1fr)",
-          paddingBottom: "8px",
-          paddingRight: "var(--pf-c-page__main-section--xl--PaddingRight)",
-        }}
-      >
-        {samples.map((sample) => (
-          <SampleCard sample={sample} key={sample.fileName} />
-        ))}
-      </Gallery>
-    </>
-  );
-}
diff --git a/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/Types.ts b/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/Types.ts
deleted file mode 100644
index 037ec8e5e3..0000000000
--- a/packages/serverless-logic-web-tools/src/homepage/sampleCatalog/Types.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright 2022 Red Hat, Inc. and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import * as React from "react";
-import { LabelProps } from "@patternfly/react-core/dist/js/components/Label";
-import { labelColors } from "../../workspace/components/FileLabel";
-import { FileIcon, FolderIcon, MonitoringIcon } from "@patternfly/react-icons/dist/js/icons";
-
-export enum SampleType {
-  SW_YML = "sw.yml",
-  SW_YAML = "sw.yaml",
-  SW_JSON = "sw.json",
-  SW_PROJECT = "sw.project",
-  DASH_YML = "dash.yml",
-}
-
-export type Sample = {
-  name: string;
-  fileName: string;
-  svg: React.FunctionComponent<React.SVGProps<SVGSVGElement>>;
-  description: string;
-  repoUrl?: string;
-  type: SampleType;
-};
-
-export const tagMap: Record<SampleType, { label: string; icon: React.ComponentClass; color: LabelProps["color"] }> = {
-  [SampleType.SW_YML]: {
-    label: labelColors[SampleType.SW_YML].label,
-    icon: FileIcon,
-    color: labelColors[SampleType.SW_YML].color,
-  },
-  [SampleType.SW_YAML]: {
-    label: labelColors[SampleType.SW_YAML].label,
-    icon: FileIcon,
-    color: labelColors[SampleType.SW_YAML].color,
-  },
-  [SampleType.SW_JSON]: {
-    label: labelColors[SampleType.SW_JSON].label,
-    icon: FileIcon,
-    color: labelColors[SampleType.SW_JSON].color,
-  },
-  [SampleType.SW_PROJECT]: {
-    label: "Serverless Project",
-    icon: FolderIcon,
-    color: "orange",
-  },
-  [SampleType.DASH_YML]: {
-    label: labelColors[SampleType.DASH_YML].label,
-    icon: MonitoringIcon,
-    color: labelColors[SampleType.DASH_YML].color,
-  },
-};
diff --git a/packages/serverless-logic-web-tools/src/navigation/Routes.ts b/packages/serverless-logic-web-tools/src/navigation/Routes.ts
index b821ee0a80..0d2f7000b2 100644
--- a/packages/serverless-logic-web-tools/src/navigation/Routes.ts
+++ b/packages/serverless-logic-web-tools/src/navigation/Routes.ts
@@ -24,6 +24,7 @@ export enum QueryParams {
   EXPAND = "expand",
   REMOVE_REMOTE = "removeRemote",
   RENAME_WORKSPACE = "renameWorkspace",
+  SAMPLE_ID = "sampleId",
 }
 
 export enum PathParams {
@@ -122,6 +123,8 @@ export const routes = {
     queryParams: QueryParams.URL | QueryParams.BRANCH | QueryParams.REMOVE_REMOTE | QueryParams.RENAME_WORKSPACE;
   }>(() => `/import`),
 
+  sampleShowcase: new Route<{ queryParams: QueryParams.SAMPLE_ID }>(() => `/sample`),
+
   workspaceWithFilePath: new Route<{
     pathParams: PathParams.WORKSPACE_ID | PathParams.FILE_RELATIVE_PATH | PathParams.EXTENSION;
   }>(
diff --git a/packages/serverless-logic-web-tools/src/openshift/deploy/strategies/DashboardWorkspaceDeployment.ts b/packages/serverless-logic-web-tools/src/openshift/deploy/strategies/DashboardWorkspaceDeployment.ts
index 52a20b5ab8..33eec2b67b 100644
--- a/packages/serverless-logic-web-tools/src/openshift/deploy/strategies/DashboardWorkspaceDeployment.ts
+++ b/packages/serverless-logic-web-tools/src/openshift/deploy/strategies/DashboardWorkspaceDeployment.ts
@@ -14,7 +14,8 @@
  * limitations under the License.
  */
 
-import { GLOB_PATTERN, isDashbuilder } from "../../../extension";
+import { GLOB_PATTERN } from "../../../extension";
+import { isOfKind } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
 import { OpenShiftPipeline } from "../../OpenShiftPipeline";
 import { KnativeBuilderPipeline } from "../../pipelines/KnativeBuilderPipeline";
 import { DashbuilderViewer } from "../BaseContainerImages";
@@ -32,7 +33,7 @@ export class DashboardWorkspaceDeployment extends DeploymentStrategy {
     const dockerIgnoreFile = await this.createDockerignoreFile();
 
     const otherDashFiles = filesToBeDeployed.filter(
-      (f) => isDashbuilder(f.name) && f.relativePath !== this.args.targetFile.relativePath
+      (f) => isOfKind("dash", f.name) && f.relativePath !== this.args.targetFile.relativePath
     );
 
     const appDataFile = createDashbuilderViewerAppDataFile({
diff --git a/packages/serverless-logic-web-tools/src/virtualServiceRegistry/hooks/useUpdateVirtualServiceRegistry.tsx b/packages/serverless-logic-web-tools/src/virtualServiceRegistry/hooks/useUpdateVirtualServiceRegistry.tsx
index b453b270c7..7e72d6eaff 100644
--- a/packages/serverless-logic-web-tools/src/virtualServiceRegistry/hooks/useUpdateVirtualServiceRegistry.tsx
+++ b/packages/serverless-logic-web-tools/src/virtualServiceRegistry/hooks/useUpdateVirtualServiceRegistry.tsx
@@ -155,7 +155,7 @@ export function useUpdateVirtualServiceRegistryOnWorkspaceFileEvents(args: {
   );
 }
 
-export function useUpdateVirtualServiceRegistryOnVsrFileEvent(args: {
+export function useUpdateVirtualServiceRegistryOnVsrFileEvents(args: {
   workspaceId: string;
   catalogStore: SwfServiceCatalogStore;
 }) {
@@ -188,7 +188,7 @@ export function useUpdateVirtualServiceRegistryOnVsrFileEvent(args: {
   );
 }
 
-export function useUpdateVirtualServiceRegistryOnVsrWorkspaceEvent(args: { catalogStore: SwfServiceCatalogStore }) {
+export function useUpdateVirtualServiceRegistryOnVsrWorkspaceEvents(args: { catalogStore: SwfServiceCatalogStore }) {
   useCancelableEffect(
     useCallback(
       ({ canceled }) => {
diff --git a/packages/serverless-logic-web-tools/src/virtualServiceRegistry/hooks/useVirtualServiceRegistryDependencies.tsx b/packages/serverless-logic-web-tools/src/virtualServiceRegistry/hooks/useVirtualServiceRegistryDependencies.tsx
index 2e67266a23..765d0467d7 100644
--- a/packages/serverless-logic-web-tools/src/virtualServiceRegistry/hooks/useVirtualServiceRegistryDependencies.tsx
+++ b/packages/serverless-logic-web-tools/src/virtualServiceRegistry/hooks/useVirtualServiceRegistryDependencies.tsx
@@ -18,7 +18,7 @@ import * as React from "react";
 import { useWorkspaces, WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
 import { ActiveWorkspace } from "@kie-tools-core/workspaces-git-fs/dist/model/ActiveWorkspace";
 import { useState, useEffect, useMemo } from "react";
-import { isServerlessWorkflow } from "../../extension";
+import { isOfKind } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
 import { getVirtualServiceRegistryDependencies } from "../models/VirtualServiceRegistryFunction";
 import { useVirtualServiceRegistry } from "../VirtualServiceRegistryContext";
 
@@ -34,7 +34,7 @@ export function useVirtualServiceRegistryDependencies(props: { workspace: Active
       const dependencies: Array<string> = (
         await Promise.all(
           props.workspace.files
-            .map((file) => isServerlessWorkflow(file.relativePath) && getVirtualServiceRegistryDependencies(file))
+            .map((file) => isOfKind("sw", file.relativePath) && getVirtualServiceRegistryDependencies(file))
             .filter((value): value is Promise<Array<string>> => Boolean(value))
         )
       ).flat();
diff --git a/packages/serverless-logic-web-tools/src/virtualServiceRegistry/models/VirtualServiceRegistryFunction.ts b/packages/serverless-logic-web-tools/src/virtualServiceRegistry/models/VirtualServiceRegistryFunction.ts
index 99709b41d6..98b1d9f76a 100644
--- a/packages/serverless-logic-web-tools/src/virtualServiceRegistry/models/VirtualServiceRegistryFunction.ts
+++ b/packages/serverless-logic-web-tools/src/virtualServiceRegistry/models/VirtualServiceRegistryFunction.ts
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-import { isJson, isSpec } from "../../extension";
+import { isOfKind } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
 import { WorkspaceFile } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
 import { generateOpenApiSpec } from "./BaseOpenApiSpec";
 import * as yaml from "yaml";
@@ -39,12 +39,12 @@ export class VirtualServiceRegistryFunction {
       return;
     }
 
-    if (isSpec(this.relativePath)) {
+    if (isOfKind("spec", this.relativePath)) {
       return content;
     }
 
     try {
-      const parsedContent = isJson(this.file.relativePath) ? JSON.parse(content) : yaml.parse(content);
+      const parsedContent = isOfKind("json", this.file.relativePath) ? JSON.parse(content) : yaml.parse(content);
       if (parsedContent.id) {
         return generateOpenApiSpec(parsedContent.id);
       } else {
@@ -64,7 +64,7 @@ export async function getVirtualServiceRegistryDependencies(file: WorkspaceFile)
 
   let parsedContent: Record<string, unknown>;
   try {
-    parsedContent = isJson(file.relativePath) ? JSON.parse(content) : yaml.parse(content);
+    parsedContent = isOfKind("json", file.relativePath) ? JSON.parse(content) : yaml.parse(content);
   } catch (e) {
     // Invalid file.
     return [];
diff --git a/packages/serverless-logic-web-tools/src/workspace/components/FileLabel.tsx b/packages/serverless-logic-web-tools/src/workspace/components/FileLabel.tsx
index 2a1fc12768..544bb6dbc8 100644
--- a/packages/serverless-logic-web-tools/src/workspace/components/FileLabel.tsx
+++ b/packages/serverless-logic-web-tools/src/workspace/components/FileLabel.tsx
@@ -16,7 +16,7 @@
 
 import * as React from "react";
 import { Label, LabelProps } from "@patternfly/react-core/dist/js/components/Label";
-import { FileTypes } from "../../extension";
+import { FileTypes } from "@kie-tools-core/workspaces-git-fs/dist/constants/ExtensionHelper";
 
 type LabelColorType = { color: LabelProps["color"]; label: string };
 
@@ -24,7 +24,7 @@ const swfLabel: LabelColorType = { color: "green", label: "Serverless Workflow"
 const sdLabel: LabelColorType = { color: "blue", label: "Serverless Decision" };
 const dashboardLabel: LabelColorType = { color: "purple", label: "Dashboard" };
 
-export const labelColors: Record<FileTypes, LabelColorType> = {
+export const labelColors: Record<string, LabelColorType> = {
   [FileTypes.SW_JSON]: swfLabel,
   [FileTypes.SW_YML]: swfLabel,
   [FileTypes.SW_YAML]: swfLabel,
@@ -35,14 +35,19 @@ export const labelColors: Record<FileTypes, LabelColorType> = {
   [FileTypes.DASH_YML]: dashboardLabel,
 };
 
-export function FileLabel(props: { style?: LabelProps["style"]; extension: string }) {
+export function FileLabel(props: { style?: LabelProps["style"]; extension: string; labelProps?: LabelProps }) {
   const parsedExtension = props.extension.toLowerCase();
-  const labelColor = labelColors[parsedExtension as FileTypes];
+  const labelColor = labelColors[parsedExtension as string];
 
   return (
     <>
       {props.extension && (
-        <Label style={props.style ?? {}} color={labelColor?.color ?? "grey"} data-ouia-component-id="file-type-label">
+        <Label
+          {...props.labelProps}
+          style={props.style ?? {}}
+          color={labelColor?.color ?? "grey"}
+          data-ouia-component-id="file-type-label"
+        >
           {labelColor?.label ?? props.extension.toUpperCase()}
         </Label>
       )}
diff --git a/packages/serverless-logic-web-tools/src/workspace/components/NewWorkspaceFromSample.tsx b/packages/serverless-logic-web-tools/src/workspace/components/NewWorkspaceFromSample.tsx
new file mode 100644
index 0000000000..500a06bd09
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/workspace/components/NewWorkspaceFromSample.tsx
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { useWorkspaces } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContext";
+import { useRoutes } from "../../navigation/Hooks";
+import { useHistory } from "react-router";
+import { useEffect, useState } from "react";
+import { Bullseye } from "@patternfly/react-core/dist/js/layouts/Bullseye";
+import { Spinner } from "@patternfly/react-core/dist/js/components/Spinner";
+import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
+import { QueryParams } from "../../navigation/Routes";
+import { useQueryParam } from "../../queryParams/QueryParamsContext";
+import { PageSection } from "@patternfly/react-core/dist/js/components/Page";
+import { EditorPageErrorPage } from "../../editor/EditorPageErrorPage";
+import { KIE_SAMPLES_REPO } from "../../home/sample/sampleApi";
+import { useSampleDispatch } from "../../home/sample/hooks/SampleContext";
+
+export function NewWorkspaceFromSample() {
+  const sampleDispatch = useSampleDispatch();
+  const workspaces = useWorkspaces();
+  const routes = useRoutes();
+  const history = useHistory();
+  const [openingError, setOpeningError] = useState("");
+
+  const sampleId = useQueryParam(QueryParams.SAMPLE_ID) ?? "";
+
+  useEffect(() => {
+    sampleDispatch
+      .getSampleFiles(sampleId)
+      .then((sampleFiles) => workspaces.createWorkspaceFromLocal({ localFiles: sampleFiles }))
+      .then(({ workspace, suggestedFirstFile }) => {
+        if (!suggestedFirstFile) {
+          return;
+        }
+        history.replace({
+          pathname: routes.workspaceWithFilePath.path({
+            workspaceId: workspace.workspaceId,
+            fileRelativePath: suggestedFirstFile.relativePathWithoutExtension,
+            extension: suggestedFirstFile.extension,
+          }),
+        });
+      })
+      .catch((e) => {
+        setOpeningError(e.toString());
+      });
+  }, [history, routes.workspaceWithFilePath, sampleId, workspaces, sampleDispatch]);
+
+  return (
+    <>
+      {openingError && <EditorPageErrorPage path={`${KIE_SAMPLES_REPO.path}/${sampleId}`} errors={[openingError]} />}
+      {!openingError && (
+        <PageSection variant={"light"} isFilled={true} padding={{ default: "noPadding" }}>
+          <Bullseye>
+            <TextContent>
+              <Bullseye>
+                <Spinner />
+              </Bullseye>
+              <br />
+              <Text component={TextVariants.p}>{`Loading sample...`}</Text>
+            </TextContent>
+          </Bullseye>
+        </PageSection>
+      )}
+    </>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/static/resources/style.css b/packages/serverless-logic-web-tools/static/resources/style.css
index d542f433ac..9d002919ea 100644
--- a/packages/serverless-logic-web-tools/static/resources/style.css
+++ b/packages/serverless-logic-web-tools/static/resources/style.css
@@ -659,7 +659,6 @@ section.kie-tools--settings-tab {
 .pf-c-menu__item-description {
   word-break: normal !important;
 }
-
 .chr-c-app-title {
   color: #fff;
   padding: var(--pf-global--spacer--md) var(--pf-global--spacer--sm) var(--pf-global--spacer--md)
diff --git a/packages/serverless-logic-web-tools/static/samples/compensation/compensation.svg b/packages/serverless-logic-web-tools/static/samples/compensation/compensation.svg
deleted file mode 100644
index 90943659d9..0000000000
--- a/packages/serverless-logic-web-tools/static/samples/compensation/compensation.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1022" height="813" viewBox="0 0 1022 813"><defs/><g transform="matrix(1,0,0,1,0,0)"><g><g><g><path fill="none" stroke="#d3d3d3" paint-order="fill stroke markers" d=" M 0 0 L 1200 0" stroke-miterlimit="10" stroke-opacity="0.8" stroke-dasharray="5"/></g><g><path fill="none" stroke="#d3d3d3" paint-order="fill stroke markers" d=" M 0 0 L 0 800" stroke-miterlimit="10" stroke-opacity="0.8" s [...]
\ No newline at end of file
diff --git a/packages/serverless-logic-web-tools/static/samples/compensation/compensation.sw.json b/packages/serverless-logic-web-tools/static/samples/compensation/compensation.sw.json
deleted file mode 100644
index 45a1028d64..0000000000
--- a/packages/serverless-logic-web-tools/static/samples/compensation/compensation.sw.json
+++ /dev/null
@@ -1,75 +0,0 @@
-{
-  "id": "compensation",
-  "version": "1.0",
-  "specVersion": "0.8",
-  "name": "Workflow Error example",
-  "description": "An example of how compensation works",
-  "start": "printStatus",
-  "states": [
-    {
-      "name": "printStatus",
-      "type": "inject",
-      "data": {
-        "compensated": false
-      },
-      "compensatedBy": "compensating",
-      "transition": "branch"
-    },
-    {
-      "name": "branch",
-      "type": "switch",
-      "dataConditions": [
-        {
-          "condition": ".shouldCompensate==true",
-          "transition": {
-            "nextState": "finish_compensate",
-            "compensate": true
-          }
-        },
-        {
-          "condition": ".shouldCompensate==false",
-          "transition": {
-            "nextState": "finish_not_compensate",
-            "compensate": false
-          }
-        }
-      ],
-      "defaultCondition": {
-        "transition": "finish_not_compensate"
-      }
-    },
-    {
-      "name": "compensating",
-      "usedForCompensation": true,
-      "type": "inject",
-      "data": {
-        "compensated": true
-      },
-      "transition": "compensating_more"
-    },
-    {
-      "name": "compensating_more",
-      "usedForCompensation": true,
-      "type": "inject",
-      "data": {
-        "compensating_more": "Real Betis Balompie"
-      }
-    },
-    {
-      "name": "finish_compensate",
-      "type": "operation",
-      "actions": [],
-      "end": {
-        "terminate": true
-      }
-    },
-    {
-      "name": "finish_not_compensate",
-      "type": "operation",
-      "actions": [],
-      "end": {
-        "terminate": true
-      }
-    }
-  ]
-}
diff --git a/packages/serverless-logic-web-tools/static/samples/greetings-kafka/greetings-kafka.svg b/packages/serverless-logic-web-tools/static/samples/greetings-kafka/greetings-kafka.svg
deleted file mode 100644
index a64c18154f..0000000000
--- a/packages/serverless-logic-web-tools/static/samples/greetings-kafka/greetings-kafka.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1022" height="1010" viewBox="0 0 1022 1010"><defs/><g transform="matrix(1,0,0,1,0,0)"><g><g><g><path fill="none" stroke="#d3d3d3" paint-order="fill stroke markers" d=" M 0 0 L 1200 0" stroke-miterlimit="10" stroke-opacity="0.8" stroke-dasharray="5"/></g><g><path fill="none" stroke="#d3d3d3" paint-order="fill stroke markers" d=" M 0 0 L 0 800" stroke-miterlimit="10" stroke-opacity="0.8" [...]
\ No newline at end of file
diff --git a/packages/serverless-logic-web-tools/static/samples/greetings-kafka/greetings-kafka.sw.json b/packages/serverless-logic-web-tools/static/samples/greetings-kafka/greetings-kafka.sw.json
deleted file mode 100644
index c50238f31e..0000000000
--- a/packages/serverless-logic-web-tools/static/samples/greetings-kafka/greetings-kafka.sw.json
+++ /dev/null
@@ -1,99 +0,0 @@
-{
-  "id": "jsongreet",
-  "version": "1.0",
-  "specVersion": "0.8",
-  "name": "Greeting workflow",
-  "expressionLang": "jsonpath",
-  "description": "JSON based greeting workflow",
-  "start": "HandleNewGreet",
-  "functions": [
-    {
-      "name": "printMessage",
-      "type": "custom",
-      "operation": "sysout"
-    }
-  ],
-  "events": [
-    {
-      "name": "NewGreetEvent",
-      "source": "greetEvent",
-      "type": "dev.knative.kafka.event"
-    }
-  ],
-  "states": [
-    {
-      "name": "HandleNewGreet",
-      "type": "event",
-      "onEvents": [
-        {
-          "eventRefs": ["NewGreetEvent"],
-          "actions": []
-        }
-      ],
-      "transition": "ChooseOnLanguage"
-    },
-    {
-      "name": "ChooseOnLanguage",
-      "type": "switch",
-      "dataConditions": [
-        {
-          "condition": "{{ $.[?(@.language  == 'English')] }}",
-          "transition": "GreetInEnglish"
-        },
-        {
-          "condition": "{{ $.[?(@.language  == 'Spanish')] }}",
-          "transition": "GreetInSpanish"
-        },
-        {
-          "condition": "{{ $.[?(@.language  == 'Portuguese')] }}",
-          "transition": "GreetInPortuguese"
-        }
-      ],
-      "defaultCondition": {
-        "transition": "GreetInEnglish"
-      }
-    },
-    {
-      "name": "GreetInEnglish",
-      "type": "inject",
-      "data": {
-        "greeting": "Hello from JSON Workflow, "
-      },
-      "transition": "GreetPerson"
-    },
-    {
-      "name": "GreetInSpanish",
-      "type": "inject",
-      "data": {
-        "greeting": "Saludos desde JSON Workflow, "
-      },
-      "transition": "GreetPerson"
-    },
-    {
-      "name": "GreetInPortuguese",
-      "type": "inject",
-      "data": {
-        "greeting": "Saudações de JSON Workflow, "
-      },
-      "transition": "GreetPerson"
-    },
-    {
-      "name": "GreetPerson",
-      "type": "operation",
-      "actions": [
-        {
-          "name": "greetAction",
-          "functionRef": {
-            "refName": "printMessage",
-            "arguments": {
-              "message": "$.greeting $.name"
-            }
-          }
-        }
-      ],
-      "end": {
-        "terminate": true
-      }
-    }
-  ]
-}
diff --git a/packages/serverless-logic-web-tools/static/samples/greetings/greetings.svg b/packages/serverless-logic-web-tools/static/samples/greetings/greetings.svg
deleted file mode 100644
index a5a9265af5..0000000000
--- a/packages/serverless-logic-web-tools/static/samples/greetings/greetings.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="698" height="813" viewBox="0 0 698 813"><defs/><g transform="matrix(1,0,0,1,0,0)"><g><g><g><path fill="none" stroke="#d3d3d3" paint-order="fill stroke markers" d=" M 0 0 L 1200 0" stroke-miterlimit="10" stroke-opacity="0.8" stroke-dasharray="5"/></g><g><path fill="none" stroke="#d3d3d3" paint-order="fill stroke markers" d=" M 0 0 L 0 800" stroke-miterlimit="10" stroke-opacity="0.8" str [...]
\ No newline at end of file
diff --git a/packages/serverless-logic-web-tools/static/samples/greetings/greetings.sw.json b/packages/serverless-logic-web-tools/static/samples/greetings/greetings.sw.json
deleted file mode 100644
index a66f3396e7..0000000000
--- a/packages/serverless-logic-web-tools/static/samples/greetings/greetings.sw.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
-  "id": "jsongreet",
-  "version": "1.0",
-  "specVersion": "0.8",
-  "name": "Greeting workflow",
-  "description": "JSON based greeting workflow",
-  "start": "ChooseOnLanguage",
-  "functions": [
-    {
-      "name": "greetFunction",
-      "type": "custom",
-      "operation": "sysout"
-    }
-  ],
-  "states": [
-    {
-      "name": "ChooseOnLanguage",
-      "type": "switch",
-      "dataConditions": [
-        {
-          "condition": "${ .language == \"English\" }",
-          "transition": "GreetInEnglish"
-        },
-        {
-          "condition": "${ .language == \"Spanish\" }",
-          "transition": "GreetInSpanish"
-        }
-      ],
-      "defaultCondition": {
-        "transition": "GreetInEnglish"
-      }
-    },
-    {
-      "name": "GreetInEnglish",
-      "type": "inject",
-      "data": {
-        "greeting": "Hello from JSON Workflow, "
-      },
-      "transition": "GreetPerson"
-    },
-    {
-      "name": "GreetInSpanish",
-      "type": "inject",
-      "data": {
-        "greeting": "Saludos desde JSON Workflow, "
-      },
-      "transition": "GreetPerson"
-    },
-    {
-      "name": "GreetPerson",
-      "type": "operation",
-      "actions": [
-        {
-          "name": "greetAction",
-          "functionRef": {
-            "refName": "greetFunction",
-            "arguments": {
-              "message": ".greeting+.name"
-            }
-          }
-        }
-      ],
-      "end": {
-        "terminate": true
-      }
-    }
-  ]
-}
diff --git a/packages/serverless-logic-web-tools/static/samples/kitchensink/kitchensink.dash.yml b/packages/serverless-logic-web-tools/static/samples/kitchensink/kitchensink.dash.yml
deleted file mode 100644
index fe62e5dc69..0000000000
--- a/packages/serverless-logic-web-tools/static/samples/kitchensink/kitchensink.dash.yml
+++ /dev/null
@@ -1,822 +0,0 @@
-pages:
-  - name: index
-    properties:
-      margin: 10px
-    components:
-      - properties:
-          background-color: blue
-          opacity: 0.5
-          color: white
-          font-weight: bolder
-          padding: 20px
-          margin-bottom: 20px
-        html: >-
-          <strong style="font-size: xx-large; font-weight: bolder; font-family: sans-serif"> Dashbuilder Components </strong>
-          <br />
-      - type: TABS
-        properties:
-          width: 100%
-          navGroupId: MainGroup
-          targetDivId: all_div
-      - type: DIV
-        properties:
-          divId: all_div
-  - name: Tree
-    rows:
-      - columns:
-          - span: "3"
-            components:
-              - type: TREE
-                properties:
-                  width: 180px
-                  navGroupId: Displayers
-                  targetDivId: navigation_tree_div
-          - span: "9"
-            components:
-              - type: DIV
-                properties:
-                  divId: navigation_tree_div
-
-  - name: Menu
-    components:
-      - type: MENU
-        properties:
-          width: 100%
-          navGroupId: Displayers
-          targetDivId: navigation_menu_div
-      - type: DIV
-        properties:
-          divId: navigation_menu_div
-  - name: Carousel
-    components:
-      - type: CAROUSEL
-        properties:
-          navGroupId: Displayers
-  - name: Tiles
-    components:
-      - type: TILES
-        properties:
-          navGroupId: Displayers
-  - name: Navigation
-    components:
-      - html: >-
-          Multiple pages can be declared on the same dashboard. If the dashboard contains more than one page then a menu is available for displaying the pages. <br />
-          Pages can be organized in groups and then be embedded in other pages using Navigation Components. In fact, this example is built using TABS navigation component. <br />
-          Here are some other navigation components:
-      - type: TABS
-        properties:
-          width: 100%
-          navGroupId: Navigation
-          targetDivId: navigation_div
-      - type: DIV
-        properties:
-          divId: navigation_div
-  - name: Timeseries
-    components:
-      - settings:
-          component: timeseries
-          external:
-            width: 100%
-          lookup:
-            uuid: timeseries
-  - name: Forms
-    components:
-      - type: EXTERNAL
-        properties:
-          height: 500px
-          componentId: uniforms
-          uniforms.url: http://acme.com
-          uniforms.schema: >-
-            {
-               "title":"",
-               "type":"object",
-               "properties":{
-                  "workflowdata": {
-                      "title": "Sample Form",
-                      "default": { "language": "English", "name": "John" },
-                      "type": "object",
-                      "properties": {
-                          "name":{
-                             "type":"string"
-                          },
-                          "language":{
-                             "type":"string",
-                             "allowedValues": ["English", "Spanish"]
-                          }
-                      },
-                      "required":[
-                         "name", "language"
-                      ]
-                  }
-                  
-               }
-            }
-  - name: SVG Heatmap
-    components:
-      - settings:
-          component: svg-heatmap
-          external:
-            width: 100%
-          svg-heatmap:
-            svg: >-
-              <svg xmlns="http://www.w3.org/2000/svg">
-                <path id="svg_1" d="m23,23l82,0l0,51l-82,0l0,-51z" stroke-width="0" fill="#999999"/>
-                <path id="svg_2" d="m133,23l82,0l0,51l-82,0l0,-51z" stroke-width="0" fill="#999999"/>
-                <path id="svg_3" d="m240,23l82,0l0,51l-82,0l0,-51z" stroke-width="0" fill="#999999"/>
-                <path id="svg_4" d="m350,23l82,0l0,51l-82,0l0,-51z" stroke-width="0" fill="#999999"/>
-                <path id="svg_5" d="m461,24l82,0l0,51l-82,0l0,-51z" stroke-width="0" fill="#999999"/>
-                <path id="svg_6" d="m566,26l82,0l0,51l-82,0l0,-51z" stroke-width="0" fill="#999999"/>
-              </svg>
-          lookup:
-            uuid: svg-data
-  - name: ECharts
-    components:
-      - settings:
-          component: echarts
-          external:
-            width: 100%
-            height: 400px
-          echarts:
-            title:
-              text: Products
-              left: center
-            option: >-
-              {
-                "toolbox": {
-                    "feature": {
-                        "dataZoom": {},
-                        "magicType": {
-                            "type": ["line", "bar", "stack"]
-                        },
-                        "saveAsImage": {}
-                    }   
-                },
-                "series": [
-                        { 
-                            "type": "bar",
-                            "markLine": {
-                                "data": [
-                                    { "type": "max" }
-                                ]
-                            } 
-                        
-                        },
-                        { 
-                            "type": "bar",
-                            "markLine": {
-                                "data": [
-                                    { "type": "max" }
-                                ]
-                            } 
-                        
-                        }
-                ]
-                }
-          lookup:
-            uuid: products
-            group:
-              - columnGroup:
-                  source: product
-                functions:
-                  - source: product
-                  - source: quantity
-                  - source: quantity2
-  - name: Rich Table
-    components:
-      - settings:
-          component: table
-          external:
-            width: 100%
-          lookup:
-            uuid: products
-  - name: Geo Map
-    components:
-      - settings:
-          component: map
-          chart:
-            height: 400
-          lookup:
-            uuid: countries
-            group:
-              - columnGroup:
-                  source: Country
-                functions:
-                  - source: Country
-                  - source: Value
-  - name: External Components
-    components:
-      - properties:
-          margin-bottom: 20px
-        html: >-
-          It is possible to develop <a href="https://blog.kie.org/2021/02/dashbuilder-external-components-javascript-api-2.html">custom components</a> that can be rendered inside Dashbuilder. By default some external components are available for use:
-      - type: TABS
-        properties:
-          width: 100%
-          navGroupId: Components
-          targetDivId: external_components_div
-      - type: DIV
-        properties:
-          divId: external_components_div
-  - name: Meter
-    properties:
-      font-size: x-large
-      text-align: center
-    components:
-      - properties:
-          float: left
-        settings:
-          type: METERCHART
-          general:
-            title: "Memory Usage"
-            visible: "true"
-          chart:
-            legend:
-              show: "true"
-              position: bottom
-          meter:
-            end: "4120"
-            critical: "3000"
-            warning: "2000"
-          lookup:
-            uuid: memory_usage
-            group:
-              - columnGroup:
-                  source: Server
-                functions:
-                  - source: Server
-                  - source: Usage
-                    function: SUM
-  - name: Selectors
-    components:
-      - html: >-
-          Dashbuilder Displayers can filter each other. For filtering only we have selectors components. You can enable filter using the filter section:<br /> <pre>
-          filter:
-              enabled: 'true'
-              notification: 'true'</pre>
-
-      - html: >-
-          <strong> subtype DROPDOWN (default) </strong>
-      - settings:
-          type: SELECTOR
-          filter:
-            enabled: "true"
-            notification: "true"
-          lookup:
-            uuid: products
-            group:
-              - columnGroup:
-                  source: Section
-                functions:
-                  - source: Section
-      - html: >-
-          <br /><strong>subtype SELECTOR_LABELS (used only with LABEL column types)</strong>
-      - settings:
-          type: SELECTOR
-          subtype: SELECTOR_LABELS
-          filter:
-            enabled: "true"
-            notification: "true"
-          lookup:
-            uuid: products
-            group:
-              - columnGroup:
-                  source: Section
-                functions:
-                  - source: Section
-      - html: >-
-          <br /><strong> subtype SELECTOR_SLIDER (can't be used with LABEL columns)</strong>
-      - settings:
-          type: SELECTOR
-          subtype: SELECTOR_SLIDER
-          filter:
-            enabled: "true"
-            notification: "true"
-          lookup:
-            uuid: products
-            group:
-              - functions:
-                  - source: Quantity
-      - settings:
-          type: BARCHART
-          filter:
-            enabled: "true"
-            listening: "true"
-          lookup:
-            uuid: products
-            group:
-              - columnGroup:
-                  source: Product
-                functions:
-                  - source: Product
-                  - source: Quantity
-                  - source: Quantity2
-  - name: Metric
-    components:
-      - html: >-
-          Metric components render an HTML template based on data. Users can customize the HTML and Javascript based on data.
-      - html: "<h4><strong>Default Metric</strong></h4><br />"
-      - settings:
-          type: METRIC
-          chart:
-            height: "100"
-          general:
-            visible: "true"
-            title: Total Products
-          lookup:
-            uuid: products
-            group:
-              - functions:
-                  - source: Quantity
-                    function: SUM
-      - html: >-
-          <hr /> 
-          The following metric uses custom HTML and Javascript template:<br/>
-      - settings:
-          type: METRIC
-          html:
-            html: >-
-              <h2><strong>&#10026; Total Products:</strong>&nbsp;<span id="${this}">${value}</span></h2>
-            javascript: >-
-              ${this}.onmouseover = function() {
-                    ${this}.style.color = "red";
-                };
-                ${this}.onmouseout = function() {
-                    ${this}.style.color = "black";
-                };
-          general:
-            visible: "true"
-            title: Total Products
-          lookup:
-            uuid: products
-            group:
-              - functions:
-                  - source: Quantity
-                    function: SUM
-  - name: Map
-    rows:
-      - columns:
-          - span: "6"
-            components:
-              - html: "<h4><strong>subtype MAP_REGIONS (default)</strong></h4><br />"
-              - settings:
-                  type: MAP
-                  lookup:
-                    uuid: countries
-                    group:
-                      - columnGroup:
-                          source: Country
-                        functions:
-                          - source: Country
-                          - source: Value
-          - span: "6"
-            components:
-              - html: "<h4><strong>subtype MAP_MARKERS</strong></h4><br />"
-              - settings:
-                  type: MAP
-                  subtype: MAP_MARKERS
-                  lookup:
-                    uuid: countries
-                    group:
-                      - columnGroup:
-                          source: Country
-                        functions:
-                          - source: Country
-                          - source: Value
-  - name: Pie Chart
-    rows:
-      - columns:
-          - span: "6"
-            components:
-              - html: "<h4><strong>subtype PIE (default)</strong></h4><br />"
-              - settings:
-                  type: PIECHART
-                  lookup:
-                    uuid: products
-                    group:
-                      - columnGroup:
-                          source: Product
-                        functions:
-                          - source: Product
-                          - source: Quantity
-          - span: "6"
-            components:
-              - html: "<h4><strong>subtype DONUT</strong></h4><br />"
-              - settings:
-                  type: PIECHART
-                  subtype: DONUT
-                  lookup:
-                    uuid: products
-                    group:
-                      - columnGroup:
-                          source: Product
-                        functions:
-                          - source: Product
-                          - source: Quantity
-  - name: Bubble Chart
-    rows:
-      - columns:
-          - span: "6"
-            components:
-              - html: "<h4><strong>Bubble Chart</strong></h4><br />"
-              - settings:
-                  type: BUBBLECHART
-                  lookup:
-                    uuid: products
-                    group:
-                      - columnGroup:
-                          source: Product
-                        functions:
-                          - source: Product
-                          - source: Quantity
-                          - source: Quantity2
-                          - source: Product
-  - name: Area Chart
-    rows:
-      - columns:
-          - span: "6"
-            components:
-              - html: "<h4><strong>subtype AREA (default)</strong></h4><br />"
-
-              - settings:
-                  type: AREACHART
-                  lookup:
-                    uuid: products
-                    group:
-                      - columnGroup:
-                          source: Product
-                        functions:
-                          - source: Product
-                          - source: Quantity
-                          - source: Quantity2
-          - span: "6"
-            components:
-              - html: "<h4><strong>subtype AREA_STACKED</strong></h4><br />"
-              - settings:
-                  type: AREACHART
-                  subtype: AREA_STACKED
-                  lookup:
-                    uuid: products
-                    group:
-                      - columnGroup:
-                          source: Product
-                        functions:
-                          - source: Product
-                          - source: Quantity
-                          - source: Quantity2
-  - name: Bar Chart
-    rows:
-      - columns:
-          - span: "6"
-            components:
-              - html: "<h4><strong>subtype COLUMN (default)</strong></h4><br />"
-              - settings:
-                  type: BARCHART
-                  lookup:
-                    uuid: products
-                    group:
-                      - columnGroup:
-                          source: Product
-                        functions:
-                          - source: Product
-                          - source: Quantity
-                          - source: Quantity2
-          - span: "6"
-            components:
-              - html: "<h4><strong>subtype BAR</strong></h4><br />"
-              - settings:
-                  type: BARCHART
-                  subtype: BAR
-                  lookup:
-                    uuid: products
-                    group:
-                      - columnGroup:
-                          source: Product
-                        functions:
-                          - source: Product
-                          - source: Quantity
-                          - source: Quantity2
-      - columns:
-          - span: "6"
-            components:
-              - html: "<h4><strong>subtype COLUMN_STACKED</strong></h4><br />"
-              - settings:
-                  type: BARCHART
-                  subtype: COLUMN_STACKED
-                  lookup:
-                    uuid: products
-                    group:
-                      - columnGroup:
-                          source: Product
-                        functions:
-                          - source: Product
-                          - source: Quantity
-                          - source: Quantity2
-          - span: "6"
-            components:
-              - html: "<h4><strong>subType BAR</strong></h4><br />"
-              - settings:
-                  type: BARCHART
-                  subtype: BAR_STACKED
-                  lookup:
-                    uuid: products
-                    group:
-                      - columnGroup:
-                          source: Product
-                        functions:
-                          - source: Product
-                          - source: Quantity
-                          - source: Quantity2
-  - name: Line Chart
-    rows:
-      - columns:
-          - span: "6"
-            components:
-              - html: "<h4><strong>subtype line (default)</strong></h4><br />"
-              - settings:
-                  type: LINECHART
-                  lookup:
-                    uuid: products
-                    group:
-                      - columnGroup:
-                          source: Product
-                        functions:
-                          - source: Product
-                          - source: Quantity
-                          - source: Quantity2
-          - span: "6"
-            components:
-              - html: "<h4><strong>subtype smooth</strong></h4><br />"
-              - settings:
-                  type: LINECHART
-                  subtype: SMOOTH
-                  lookup:
-                    uuid: products
-                    group:
-                      - columnGroup:
-                          source: Product
-                        functions:
-                          - source: Product
-                          - source: Quantity
-                          - source: Quantity2
-  - name: Displayers
-    properties:
-      margin: 10px
-    components:
-      - properties:
-          margin-bottom: 20px
-        html: >-
-          Data can be displayed using <i>Displayers</i>. 
-          The usual charts types are supported and Dashbuilder internally use <a href="https://echarts.apache.org/en/index.html">ECharts library</a> to render them. <br />
-          Displayers configuration is described in the <a href="https://www.dashbuilder.org/docs/#chap-dashbuilder-yaml-guides">YML guide</a>
-      - type: TABS
-        properties:
-          width: 100%
-          navGroupId: Displayers
-          targetDivId: displayers_div
-      - type: DIV
-        properties:
-          divId: displayers_div
-  - name: Layout
-    properties:
-      margin: 10px
-    rows:
-      - columns:
-          - components:
-              - html: >-
-                  <p style="margin-top: 20px">
-                    A Dashbuilder application is composed of Pages. The smallest Dashbuilder YML application contain a single page with a single component
-                      <pre>pages:
-                    - name: Page
-                      components: 
-                        - html: Hello World</pre>
-                    Currently boostrap layout is used, which means that columns and rows can be used for organization:
-                  </p>
-      - columns:
-          - properties:
-              border: solid 1px
-              text-align: center
-              margin-bottom: 10px
-            components:
-              - html: ROW1
-      - columns:
-          - properties:
-              border: solid 1px
-              text-align: center
-            span: "3"
-            components:
-              - html: ROW2 CL1 SPAN 3
-          - properties:
-              border: solid 1px
-              text-align: center
-            span: "3"
-            components:
-              - html: ROW2 CL2 SPAN 3
-          - properties:
-              border: solid 1px
-              text-align: center
-            span: "6"
-            components:
-              - html: ROW2 CL3 SPAN 6
-      - columns:
-          - properties:
-              margin-top: 10px
-            components:
-              - html: >-
-                  This is the code for the layout above: <br /><br /> 
-                  <pre>pages:
-                    - name: Layout
-                      rows:
-                      - columns:
-                        - properties:
-                            border: solid 1px
-                            text-align: center
-                            margin-bottom: 10px
-                          components:
-                            - html: ROW1
-                      - columns:
-                        - properties:
-                            border: solid 1px
-                            text-align: center
-                          span: '3'          
-                          components:
-                            - html: ROW2 CL1 SPAN 3
-                        - properties:
-                            border: solid 1px
-                            text-align: center
-                          span: '3'
-                          components:
-                            - html: ROW2 CL2 SPAN 3
-                        - properties:
-                            border: solid 1px
-                            text-align: center
-                          span: '6'
-                          components:
-                            - html: ROW2 CL3 SPAN 6</pre>
-  - name: Data Sets
-    properties:
-      margin: 10px
-    components:
-      - html: >-
-          <p>
-            Data is retrieved using Datasets and it can be retrieved from JSON content. The content can be retrieved from a JSON URL or declared inline: <br />
-            <pre>datasets:
-              - uuid: products
-                content: >-
-                  [
-                    ["Computers", "Scanner", 5, 3],
-                    ["Computers", "Printer", 7, 4],
-                    ["Computers", "Laptop", 3, 2],
-                    ["Electronics", "Camera", 10, 7],
-                    ["Electronics", "Headphones", 5, 9]
-                  ]
-                columns:
-                  - id: Section
-                    type: LABEL
-                  - id: Product
-                    type: LABEL
-                  - id: Quantity
-                    type: NUMBER
-                  - id: Quantity2
-                    type: NUMBER
-            </pre>
-            Data Sets can be used with Displayers or External Components. For more information check <a href="https://blog.kie.org/2022/04/support-any-json-metrics-and-csv-as-dataset-in-dashbuilder.html">the article about datasets</a>.
-          </p>
-  - name: HTML & CSS
-    properties:
-      margin: 10px
-    components:
-      - html: >-
-          <p>Dashbuilder Support HTML components using the <i>html</i> element and CSS 2 properties using <i>properties</i> 
-          object that applies to any component (pages, row, columns and component). A page with font-size xxx-large could use the following declaration:
-            <pre>pages:
-           - components:
-                - html: Hello World
-                  properties:
-                    font-size: xxx-large</pre>
-          </p>
-          <p>
-            When using HTML you can make use of any library used by Dashbuilder. Currently it used Patternfly V3. Here's a sample panel:
-            <div class="panel panel-default">
-              <div class="panel-heading">
-                <h3 class="panel-title">Patternfly 3 Components</h3>
-              </div>
-              <div class="panel-body">
-                You can use <a href="https://www.patternfly.org/v3/pattern-library/" class="alert-link">Patternfly 3</a> components. Bear in mind that libraries used by Dashbuilder can change in future, so be careful when using patternfly or other provided libraries.
-              </div>
-            </div>
-            <div class="alert alert-warning" style="margin-top: 20px">
-              <span class="pficon pficon-warning-triangle-o"></span>
-              <strong>Using internal libraries</strong> Internal visual libraries are always a subject of change. Currently Patternfly 3 is used, but this may change in future.
-            </div>
-            <div class="alert alert-info" style="margin-top: 20px">
-              <span class="pficon pficon-info"></span>
-              <strong>Javascript not supported</strong> Javascript is not supported inside HTML elements.
-            </div>
-          </p>
-navTree:
-  root_items:
-    - type: GROUP
-      id: MainGroup
-      children:
-        - page: Layout
-        - page: HTML & CSS
-        - page: Data Sets
-        - page: Displayers
-        - page: External Components
-        - page: Navigation
-    - type: GROUP
-      id: Displayers
-      children:
-        - page: Bar Chart
-        - page: Line Chart
-        - page: Area Chart
-        - page: Pie Chart
-        - page: Bubble Chart
-        - page: Meter
-        - page: Map
-        - page: Metric
-        - page: Selectors
-    - type: GROUP
-      id: Components
-      children:
-        - page: ECharts
-        - page: Timeseries
-        - page: SVG Heatmap
-        - page: Rich Table
-        - page: Geo Map
-        - page: Forms
-    - type: GROUP
-      id: Navigation
-      children:
-        - page: Tiles
-        - page: Carousel
-        - page: Menu
-        - page: Tree
-
-datasets:
-  - uuid: products
-    content: >-
-      [
-        ["Computers", "Scanner", 5, 3],
-        ["Computers", "Printer", 7, 4],
-        ["Computers", "Laptop", 3, 2],
-        ["Electronics", "Camera", 10, 7],
-        ["Electronics", "Headphones", 5, 9]
-      ]
-    columns:
-      - id: Section
-        type: LABEL
-      - id: Product
-        type: LABEL
-      - id: Quantity
-        type: NUMBER
-      - id: Quantity2
-        type: NUMBER
-  - uuid: countries
-    content: >-
-      [
-        ["Brazil", 6],
-        ["USA", 3],
-        ["China", 5],
-        ["India", 5],
-        ["Russia", 6],
-        ["Canada", 6],
-        ["Australia", 9],
-        ["Mali", 4],
-        ["South Africa", 11],
-      ]
-    columns:
-      - id: Country
-        type: LABEL
-      - id: Value
-        type: NUMBER
-  - uuid: svg-data
-    content: >-
-      [
-        ["svg_1", 1],
-        ["svg_2", 2],
-        ["svg_3", 3],
-        ["svg_4", 4],
-        ["svg_5", 5],
-        ["svg_6", 6]
-      ]
-    columns:
-      - id: id
-        type: LABEL
-      - id: v
-        type: NUMBER
-  - uuid: memory_usage
-    content: >-
-      [
-        ["Server 1", 2512],
-        ["Server 2", 1900],
-        ["Server 3", 3200],
-        ["Server 4", 1200]
-      ]
-    columns:
-      - id: Server
-        type: LABEL
-      - id: Usage
-        type: NUMBER
-  - uuid: timeseries
-    url: https://raw.githubusercontent.com/jesuino/dashbuilder-data/master/samples/timeseries.json
diff --git a/packages/serverless-logic-web-tools/static/samples/kitchensink/kitchensink.svg b/packages/serverless-logic-web-tools/static/samples/kitchensink/kitchensink.svg
deleted file mode 100644
index b66e1affe4..0000000000
--- a/packages/serverless-logic-web-tools/static/samples/kitchensink/kitchensink.svg
+++ /dev/null
@@ -1,1892 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   width="210mm"
-   height="297mm"
-   viewBox="0 0 210 297"
-   version="1.1"
-   id="svg159"
-   xmlnsXlink="http://www.w3.org/1999/xlink"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlnssvg="http://www.w3.org/2000/svg">
-  <defs
-     id="defs156" />
-  <g
-     id="layer1"
-     style="display:inline">
-    <g
-       id="g1321"
-       transform="matrix(1.0515521,0,0,1.0515521,-7.7893147,20.694398)">
-      <image
-         width="93.902992"
-         height="59.590317"
-         preserveAspectRatio="none"
-         xlink:href="data:image/png;base64,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
-7Gzt379f99xzj/793/9dkpSfn6/77rtPW7Zs0fr16zU4OKi9e/fqyJEjcrvdamxsnLa2H99uPDty
-5Ig2bNggl8ulm2++WcYYvfvuu/ryl7+sv/qrv9JNN92kyspKTUxMaMeOHXrllVfkdrv1b//2bxob
-G9Ndd92ldevWKS8vT11dXZKkp59+Wnfffbe2bdumjRs36qmnnrrAs4yNPXv26Ic//KGWL18uSbrk
-kkt06aWXTnusyM/P17333quvfvWruummm/TUU0/pG9/4hq677jq98sorkk5fxbK0tFQul0ubN2/W
-Rx99JGny8eFb3/qWNm7cqGuuuUYdHR0XpgDz5JVXXtENN9yg6667Tt///vcladqaHjhwQLm5uSoq
-KtKBAwdC29i6dav+9m//Vtu2bZPL5VJ3d3eor6mpScXFxVq9erVeeuklSZpx377rrrv09a9/XZs2
-bdIjjzwSWn6qY80//MM/KD8/X9dee60ef/zx+S2UgTlw4ID5i7/4C1NbW2tOnjxpjDHm2LFjZt26
-dWZ4eNgYY8zExIQxxpjR0VFjjDHPPvuseeyxx4wxxmzZsiX02OfzmRtuuGHG9oaGBvPkk08aY4x5
-7bXXzE033WSMMeazn/2saWpqmvf5LgTf/e53zf79+40xxvzsZz8zGzZsMMacrtmdd94ZWm7Lli2m
-v7/fGGPM8uXLzRtvvGGMMWbv3r3m+9//vjHGmKuvvjq0/HS1/fh240VeXp45fvx4WNuZfdgYY7Zt
-22beeOMN8x//8R9m+fLlof39W9/6lnnhhRfM73//e+NyuULLP/300+aBBx4wxhjzhz/8wWRnZ5vh
-4WHzz//8z+YrX/mKMcaYsbExs2bNGhMIBOZ7ehfc5ZdfPqm+Z0x1rPjkJz9pfvWrXxljjKmsrDT3
-3nuvMcaYt956y9xyyy3GGGNuu+028/bbbxtjjHn00UfNj370I2PM5OPDme3/+te/NqWlpdGe2rx6
-8cUXzbJly8zVV18d+vcnf/In5u233zbj4+Nm/fr15tSpU8YYY770pS+FjgEfr+no6Kj5/Oc/b4LB
-oDHGmNtvv91897vfNcacfs3X1dUZY4z53e9+Z9asWRNq37lzpzHmdO3O7N8z7dtn1/eqq64yY2Nj
-0x5rVq1aFVr27NfafOAtdEmbNm1Sbm6ufvSjH2n16tV68cUX9ctf/lJf+tKXQmfjNptNgUBADz30
-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
-3cAAAAAASUVORK5CYII=
-"
-         id="image299"
-         x="7.4745264"
-         y="32.165771" />
-      <g
-         id="g1314">
-        <image
-           width="92.522018"
-           height="56.317757"
-           preserveAspectRatio="none"
-           xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAe8AAAEqCAYAAAA8rNjKAAAABHNCSVQICAgIfAhkiAAAIABJREFU
-eJzsvelzI3l63/nNO3EDBEESPItk3dPHjGbG1ugeObyywpKPtTdsyaHD2pDX0mit/RP0L+yuwroc
-G3ZoLWllK1bSzMovtNrRMZJHVo96eqqri12sYhVvgsSdQGYiz31BPU8DJEiCJHhWfiI6ukgCiUQi
-8Xt+z/V9hDAMQ0RERERERETcGMSrPoGIiIiIiIiI0xEZ74iIiIiIiBtGZLwjIiIiIiJuGJHxjoiI
-iIiIuGFExjsiIiIiIuKGERnviIiIiIiIG0ZkvCMiIiIiIm4YkfGOiIiIiIi4YUTGOyIiIiIi4oYR
-Ge+IiIiIiIgbRmS8IyIiIiIibhiR8Y6IiIiIiLhhRMY7IiIiIiLihhEZ74iIiIiIiBtGZLwjIiIi
-IiJuGJHxjoiIiIiIuGFExjsiIiIiIuKGERnviIiIiIiIG4Z81ScQEXHTCMOQ/y0IwhWeSURExJtK
-ZLwjrj1hGLKRbDQaEEURQRCg0WggkUjAtm3EYjEEQQDLshAEAXRdh6ZpME0TiUQCmUxmoNcKggCe
-56HT6aDdbkOSJAiCAMMwYJomfN/v+zxBEKAoCjKZDJLJJGRZRiwWG9o1iIiIiOhGCLvdiIiIK8Sy
-LLiuC9d12WD6vo9Wq4UgCCBJElzXhSiKcF0XnudBVVX4vs9G1vd9uK7LBt91XQDA/fv3EYvFYBgG
-EokEfN9HLBaD4zioVqtIpVLwPA/lchlhGCIIAvi+D1mW+WdVVSFJEoD9TQSwv7EQRRGiKEIQBHie
-B0mSkE6n8ejRI/i+j3a7jVgsBkmSIIpRpioiIuL8RMY74tIhw9vpdGBZForFIj7++GMYhgFRFOH7
-PkRRRBiGUBQFkiSxUTzK+Lmui1arhU6ng0QigVgsxoabPHV6nKqqPb8noxuGIUzTxNjY2InvgTYU
-YRjyRoE2DoVCAYqiwHEcAOD/h2GId955B5qmnfsaXjaO4/B1uwo6nQ4Mw+CIiqIoV3YuERHXgch4
-R1wKhmHA8zzs7u7CcRw24K7rYnR0FOVyGbquw/d99nTT6fSRxyND6Xkeh9TJOyfDH4Yh4vH4qc6z
-O0R/WsIwRKvVAvBJLlwURaiqing8jkQiwYZ9GNB7DMMQW1tbkGUZ7XYb8XgcpmlC13WEYYh8Pg9d
-10/l9TuOg6WlJbRaLSQSCbRaLcRiMbz77rscfbhMnj9/jlKpBF3XoaoqZFlGKpVCJpNhgx4R8SYR
-Ge+Ic0O5Z1nuX0LRbDbx7NkzOI6DeDwOXdf5b6ZpotFoQFEUJJNJhGEIz/MAAKlUCp1Op8cz1jQN
-nuchHo8jl8uhUqmgUqlA0zQkEolrUUDWbDZhWRYmJiYwMTGBTCYzVIO3tLQE3/chCAJkWYZpmqjV
-agjDELIsQxRFKIqCIAjgui5kWcZbb7117GboIBTur9frqNfrvPE4zTGGSb1eR7PZhGEY6HQ66HQ6
-UFUVgiDw+83n88jn87AsC5IkIZFIXMm5RkRcBpHxjjiRZrMJ27ZhGAZGRkaQy+UA7Oeo19fXUavV
-oOs6FEXB/Pw8Wq0WTNNENptFOp3G6uoqXr9+DVmWkc1mYVkWHMdhQy1JEkZGRg69ruM4qNVqmJyc
-hCRJkGUZgiDANE1+bhiGcBwHsVjsWuSTbdvm9zM7Ozv04/u+zx5xt6Gm1zZNE4IgYHJyEoIgIJPJ
-wPf9gVIBNwXTNLG7uwvXdWHbNqdH2u02RxsEQYCmaUgmk0gkEkin01EBYcStIjLeEZwPDoIArVYL
-2WwWjuPAMAxUq1WUy2VYloVCoYDR0VEUi0UAwMrKCvb29ji/m0gkIEkStra2oCgK5ubmMDs7i6dP
-n3IoHNhfZIMggKZp0HWdvdIwDNFutzkEqmkacrkcG/4wDCFJEnvg18HLPkin08HExAQmJycv7DUo
-WrGzswPXdaFpGmRZ5mI+uuaqqiKZTCKfz98q492N53ncIUA58TAM8eLFC06jdDod5PN5FItFxOPx
-IyNEERE3iegufgMJwxC1Wg2CIKBer8MwDNi2DWA/VJ3NZhEEAV69eoUgCJDJZLCwsIDx8fGe4yws
-LGBhYQH1ep0NP+0FBUFAOp2GKIq4c+cODMNApVKBYRjQNA1BEHBYkzwoVVUxNTWFVCoFWZaRSCRQ
-r9eRy+XQaDTY406n09fScFMRHl3LiyIej3P6YX19nfPbnufh7t27yGazSKVSvGGiNMR1wbZtWJaF
-bDZ77s+RDDHVFRAPHz7kgkdBEPDq1SssLS3xz3fu3IHjOMjn8wD279cgCCLDHnFjiDzvN4QwDNl4
-VioVDjWSNyxJEqanpzEyMoJ4PI61tTWUSiUIgoBPf/rTvKi1222YpslhdKrODsMQ6+vrEASBPel8
-Pg9ZlrG+vg5FUeC6LudMu/OxwL7Hevfu3UMeYqlUwvPnz3s8bcqB0yagO4d+VbTbbaiqikwmg3Q6
-zUbhonEcB81mk1MXMzMzl/K6g+K6Lvb29qCqKlqtFtrtNrcEapp2IQVwtm0jCAK0220kk0mUy2Vs
-bGxAlmXE43G0Wi1+TVVVud2vO9QeBAHGxsaGWtUehiGq1Sp0XefviaIo1yLdE3HziIz3G8STJ0/Y
-M47FYmi323Acp6c1K5fLQVEU7O3tIQgCmKaJ2dlZ3Lt3D6urq9jc3OwpiKJ8Ki1yW1tbSCQS7A1S
-CFwQBFiWxT3auq4jm80ikUicWC1cq9VQr9e5tUvXddi2DVEUOb9+2mrqYeN5HtrtNt5++22kUqkr
-O4/rQrvdxvb2NlqtFtcBUGtdLBZDPB5HMpnkFMx5CIIAjuNwHrxarUJRFHieB1EUWQ+gX6uh53k9
-3rbv+/B9H47jQFEUFAoFTE1NDeXearfbePLkCWRZ5s0D1S3EYjHIsoxCoYB6vY54PM7nTI+JiOgm
-Mt63EAqXkuLYwQrhzc1NbG1tsSAKiaLkcjnOIVIuulAooFAoQJIkNBoNfPTRRxAEAclkkntvKcRN
-RWiapvGi2el0OHwJgKujyesaRu/w+++/f+UeOFU4P3z48I0vjHJdF3/1V38FSZKQTCZZNCeXyyGf
-z0PTtKH2jK+vr6NcLsNxHN7EDcPYUfrjnXfeGZoH3mw2sbW1hU6ngyAI0Ol0uBCTOiu6Nx6u60JR
-FHzmM5+JetsjeogSPLeM7hCh67pcGAbse9szMzOYmprC+Pg4Xr16BdM0kUwmkcvlIEkSewTdob1O
-p4Nms4lYLIaFhQXkcjmUSiVeeMIwRCaTgSiKkCQJlmWh0+lAFEXOT9MGIQgC5HI5ZLPZoS3gc3Nz
-ePny5VCOdRYoDEziMG86pVKJvUlSv1tYWBha65bv+7Asi+skKBQvy/LQctaU1hkZGYFhGLw51HUd
-jUYD8XicPfnu12y1WhwKp2hD99/T6TTS6TR83+fUk6IofN/UajUuNKSIAoDIcEccIjLet4AwDFEu
-l2EYBur1Ou/kVVXlcK7neSiVSlBVFaOjo4jFYrhz5w4XrXU6HW7BkWUZjx8/hq7rWFlZ4YI26i3O
-ZrNotVoQRRGO40AURVQqFSSTSfi+z4sdFQdRKBLYz9G22200Gg2oqjqUBZ2EXS4b0zQB7F//iYkJ
-3Llz59LP4TpCxZCSJKHZbGJ+fn7gz5kMsyzLrK5HRXe02XNdF0+fPuXfUe3EMIvNRFFEPB5Ho9Fg
-gSF6LTLYJJCTzWa5iHBjYwPVapU7KQAgkUggm82yFgEA7kPvvi5hGOL58+fc7idJEmZmZoaSWoi4
-fUTG+wbjeR6LlFAVt6Zp3B9NUqO0a3ddl/PW6XQahmEgk8mw1KdlWRgbG8PY2BiWlpYgSRJs20Yq
-lYKqqhyWrNfrrHSVTCahqiqazSaLtVBLF0EhfFqEKbw+TC/pMquEfd+HaZpwXRf5fB737t1jbfU3
-HfIWyZOkdr9BWV9fx87ODjRNQxiGKBaLEEURq6uruHv3Lofhp6amsL29DUmSTq2iNyj9jn3Q0wb2
-RYqq1Srf91TDQaF7wzCwu7sLXddRKBT4PR1EEATcv38fjuPgww8/hCRJ2N7e5o0uRTNoUyNJEnzf
-H3joTsTt4o0x3kEQsEfQTxDkPMe9ihaTMAzxjW98A77vI5lMIh6Pw3EcmKbJ56MoSs/OPpPJsCfc
-6XTgui6azSZ0XUen08Hjx49RKBTg+z5SqRQajQZ0XUe73Qawn68ul8u4c+cOisUidF3H2toatra2
-eJoWsN9u1m3IqFWJcqBUaLa5uYlCocACL2fh9evXKJVKlyrZSV4+qbzd1JDmeaRgj8LzPFiW1XNN
-SqUSZmZmBnotKuYiL3ttbQ0PHjyA67pYWVnhvDBFlwzD4Lazy6Df9/yk9A9JuQLA9vY2arUapqam
-+PuysrKCiYkJBEEA27ahKArGx8dRrVbhOA6nrqhanTx+WZa55ZI2BpdVuNnpdKJK+SvmjShYe/Xq
-FUqlEqt5ffaznz1TvtVxHDiOg0ajgTAMYds2V9OOj49DlmVMT0/D87xLWdBXV1fZSyFDXavV0Gg0
-4LoustksYrHYkYumbdvQdR2WZSGfz2N+fp7/1ul0sLq6yhXn5HU7joOJiQnMzs5id3cXT58+RSqV
-OnWul44LANlsFjMzM8ee61FUKhWUSiXuAb8oL4yo1+tQFAWyLMNxHBSLRczNzV3oaw4Ly7Kws7PD
-GzjLsrivPxaLDa0GYXNzE5ZlwTRNWJYFYN/A5fN5TExMHPk6juPg2bNnPe2GnU4HwCfKdVQdToYv
-DMOeYTM3Ac/zuMNDVVU0Gg3OqVOBGjkFruueGLnwPA+2bbO3T5XqiUQClmVxESrVIIyOjp67uPOb
-3/wm2u02pqamonTRFfFGGO9SqQRZlqHrOmRZHniIAfU00w6YWl1oQaHjkday4zisY909/YjGVuq6
-PpA2tGma8DwPpmlCVVVYloV6vY6FhQUYhoHR0dFD0qCyLKPRaOCDDz7oUSzzfZ+L0Y6Cer7HxsYw
-OTnJC6+qqnj16lVPT3W73caDBw+Qy+Wwvb2NtbU1bjMDwAsIGQjaMJGndBC6npQ3npqaGtiAe56H
-5eVlnvHdbrcvVEms2WwiCALuFdY0DXfv3h1qJGeYkGBMpVLh0ao05tTzPP5sSGr285//PIDhFUd1
-Oh3U63XYts2dB48fP+75e3fbFLDvaZfL5R6vznVdjjC12+1b5fFRFOwsG9ejoGtN3zlBEPj72el0
-oOs6YrEYpqenB6pF2NzcRCqV4u8xbSqq1Spisdgh8aaIy+GNMN6ngRYcGoJAAg6D9loGQcBtUt3q
-VnTDq6qKQqGA2dlZhGGIUqnE+WYq7KKFldpFAPQYa/I6dF1HPp/HyMgIdF3HN77xDTSbTaTTaW4X
-0zSN87HUl+26Lnuo1NNKO3/KX7uui/HxcdRqNV5YyOt88OABe2qu62JtbQ2bm5v83pPJJFfQKorC
-BXHHLRRhGMKyLHz2s58deGGu1Wp4+vQpi12Ypol0On1hUQ8yhoqiQNM0jIyMYHp6+kJe67xUKhVs
-bGzAdV1YlsXa75qmwfd91Go13ozScA/6fIrFIjRNYynRi/BqgyDAhx9+CMdxuFaDOhOCIMDa2hoE
-QeBzovsfQI9y2kWyIWzgT6U/RUUow4cPAQJChBAhIhNm8O3BF/AgeHCh53BR0IYoHo/zdaSOkFgs
-1hM9NAwDrVaL+87pnqEISSwWg67rPcp/Uf3HxXNrjHcQBNjb20Oz2cTi4uLAhtYwDNaIBj7RSqZq
-7WFAYS3P87jgRlEUNsbkSVCuut+50zlRCxZVklP4TRRFGIbBAimqqrJBplYm3/e5yAz4xHDPzc2x
-BOmLFy8Qj8dh2zZyuRwPwJAkiTczYRhiYWEBY2NjWF1dRb1e52tFRXAPHjzg9/H69WsuLupnwEmU
-YnR0FNPT0wN/8cMwxPb2NnzfZ9W4YYbNaQNEBptyl+Pj49e2Jcw0Tezt7WFnZ4fnk9P7oN5913Uh
-SRJyuRz29vYAgD0rRVG4v5k89EQigXw+j1Qq1RNupTqSRCLBRVQHMQwDe3t7EEURIyMjkCQJpmny
-7Pbd3V2O6lCkiKROaeNBymd0XuRJXlRf/9fFr+Pr0n9FMZzA58PPQj6iNOgD8Vt4iVe4F9zD3/d/
-6ELO5aLpVjrsHqVLU9uoS4Q2/t0bKoIcAsrDU85+ZGTk1kRIriO3wng3Gg1sbW1xbrafDnc/Op0O
-/vqv/xqqqvICchFSjZZlDa0t6ijq9ToAYGpqir+Qa8Ia/lvsL/Gy8RKBEEASRYQAZEHBmDyGH4z/
-IO5KdwHsfzl3dnbQbrchyzLS6TRvFKhIx7Isvkajo6NotVrodDqchjBNk0dgptNpOI6DjY0NlMtl
-jI6OotPpwLKsnrQFedzkeaVSqYGlRRuNBuuvD2Mx706J0OaH+nkLhQKSyeS19ijK5TI2NzdRrVbh
-+z5HYGKxGEzT5M1ad/qG8tLkPfVbbGlxps1XOp3G+Pg4yuUyXrx4wZXPhUIBMzMzHKqv1WqcEqHB
-NWQEyIMDcCiNRXlsuo+7RV1oVGk+n+eCymEaiF9UfhGzmMKng3cHfs4r4TXeFz7Aj3g/ivHw9oaQ
-KRJ40vWmjoN4PI7JycmoGv6CuNHGu91uY2dnh3ubKe87PT2NfD7PueejcF0X3/zmNzm0PEzI26Zc
-3UVXQ5PSmaqq+BP8Cb4hvYepcBKfFz4HGVLP6wdBAD/08Q3xfWwKm7hvPsQX/S9C0zQ0m03Issx5
-9IPQYkwiMOSBksLYo0eP+Jo/ffoUe3t7GBkZwcLCAqrVKmq1Wt/jUsrA933cv3+fQ+5HUSqVsL6+
-3tOScx4o4pJOp1EsFjl8eFNot9t4/vw5Wq0WgH0xkH7XuVqtHvobbdxGR0d7ok39qtEdx4Hruly0
-uLGxga2tLVYGu3//Pr71rW+xJ06fIXn/p/0e9DsHwzBw7949bG5uDq3lsCyU8X/Kv47/PviHZz7G
-74tfwXf734t3T2H4bzOU+stms5iYmIjmqw+ZG2m8bdvG5uYmms0mLxoAOFcriiJSqRREUcTbb78N
-4JPdIEl61ut1zM/P46OPPhp6hTJ5290tIpeBAwe/ovwyFsI7eDt8a+DnPROW8LGwjJ/y/kfE/fiJ
-xpBEJKiPXFVV5HI5JJPJnuKtSqXCXler1epRnwI+qSTuTlHQfOZcLocHD47OJ1Jh06DFh0dBC4yq
-qrhz586JnxelDmzbxujoKERRRK1WQyqVguM4KJfLCMMQo6Ojl7ZYua6L5eVlbhU8rnKc1O+6W6t8
-30e1WkUmk+HnUZU4FSh1t2dZlsWqfNS+ROFzKlS8SKnadruNYrHInRbn3Rh30MEvK/8W//gchpv4
-ivgH+O/8v4e7wd1zH+u2QCF1Gk17HQYJ3QZulPGmXs+trS0EQYDx8fGeXblt2zxxSpIkZDIZzuWS
-yhgVkXmeh1gsNtTcGc2jptz2ZfZ+bwgb+B35P51rAfpd8ffxQ94/wEK40Pfv1F6USCSQSqWQSCTg
-eR5rn9NjKHcWBAHLtVKxFEEVscVikWeCA+CCvLm5uSM/l06ngydPnpzaMybP3rIsLsbSNA2FQoHb
-a47Dtm08e/aM87Bk6LtnkFPx3+joKO7evZwF/MWLF2g0Gj3Rg360223OK1P+u3uqW6PRYNlaeh+a
-pmFychLtdpvvbUoxNRoNrl6/qMK2flBES1XVoRQn/m/K/4p/FPzwEM5sn/9b/H38vPu/DO14twVK
-w42Pj2N0dPTG6iNcF26M8V5bW8POzg7nHW3bRqfTQSqV6smxUKXj6Ogo4vE43nvvPWiaxosUeU1U
-OTksSHWL5k1fJjWhhl+X/wP+UfAPzn2s3xO/jP/B+2eYCCd6fk+DFKjXfW5uDuPj4z1RC9M0sbGx
-wRO/PM/jCvuDGxnKoy4uLsI0TaytrUHTNMzMzCCfz5+YW37x4gXq9frABpx2/+l0GslkkqvST7PB
-CoIAH3zwARssAOyRHnxvlmXh3XffvXAvY2Njg1shG40GMpnMkekOTdMwPz8PRVHw+vVrVuUjyuUy
-MplMz6LaaDTw4MEDpNNpbG5uIpPJwPd9PH/+nKNbN5kvS19GUohh8YgN61mwYeNPxD/HT7s/PbRj
-3iZs24Ysy5iamsLo6OhVn86N5cYorE1MTCCfz3MokiZcGYaBeDyOxcXFvipL1M4EgPuUKWw4LOPt
-ui7a7TYkSbp0ww0A/0H+9+fK1XXzD4Mfxm/Jv4kvmT8H4JO+UKpCTiaTHCotl8t4+PAhe6DPnj3j
-xwPgtp9+xoQ0q5eXl/H48WO8/fbb3BM/CGdRtZubmztXT7YoiiwPS8pWB8+JqvonJycv1BOl+emV
-SgWqqrL+9lHXhHKPmqZha2sLjUbjkOdDnzEN1QD2dbnX19cxNjaG9fV1rg6/6UabWBFf4h8PYdPb
-jQ4dIQI0hSbS4eWvB9cd27bhOM6pZHMjDnNjPO9+bG9vY2NjA+l0GhMTE4c8AXpr9XqdB2JUq9Wh
-et000IOEDy6b35J/E3cwg8lwcmjHLPklPJOe419rPwNg//pZlsUKUDQLnOZyv/vuu9A0DfV6nXPh
-ZJx3dnZQrVbZ0Lmui06nw+1qnU4H9+/f558HZWlpiYUoTqLVamFsbKxHQe48vPfee9zjSlrt9PnT
-kIqLrLCt1+uoVCpoNBrQNI0V9ZLJZF9Pv9lsQlEUzMzMoFarcfdDP7a3t5HP53v+7rouR1xSqRQP
-5bjOlfeD8DXxa/DEDhbC4dwX3Xjw8DXh6/hx78eHfuybDtXBeJ7HBaLU4x8xODfG8+5HNpvF7u4u
-arUabNvGO++8AwDcptJqtXiBpbDhMA03Ff+QKMlVsCfs4TuCv33u45DKFgBMx6exFH+O+eL+ora1
-tcUpC+pRn5ycZOEVGsvYHfmgxT2bzaJarfL1pzYhqlqmfvXTUigUsLq6eqzxphzb1NQUpqamTv0a
-R/G5z32OQ+Mk8xqLxS68JYZ6pqkws1to52C4G/gkVUB9/BsbGxypOopEIoFWq8WiG8C+R35QJ/82
-LLTfkj7ADwU/eCHHliGjKlQu5NjXlUE7CqhvX9M0dDodvHjxgkWPxsbGLn1OxE3lRl+lWCyGd999
-lzW6t7e30Ww2eVwl9eqqqjrUECblzV3XRTqdvrIQ4n+R/gB/O/z8uY5BXzjSRCbJ1+8Jvwu/2vhV
-/KvMv8Lk5CTy+Tw+/vhjVnATBAHNZhPJZBJra2toNBo8UILC5aOjoxgdHeXHVqtViKIIy7IwMjKC
-yclJJJPJM1Vl5/N57Ozs9PSZH0QQBDx8+PBC8s40ZAXApaRKSqUS1tbW2JB2G+qjJpoFQcCz20mG
-86Tq/HQ6jVqtxuIctxkXzoUeP4GL1dm/TpD8brc88iBQdJSUGsMwHOpG+zZzo413N0+fPmVlse7F
-ehDDShW4g+z4yOO6DqP4lsVlfOocVbLdwxEOTgIbEUbw1c6f8s+apmFhYYHft2maaDQayOVyqFQq
-Pdrn5MWbpglRFJHP57lNxPd91Ot1Lig8DyMjI9jY2Oj7N9d1kUgkbsUu3vM8bG5uHnm96LofvB+7
-J+hJkoSRkRFsbW0dm96h2o2b1ON+VjRcbDHhOMawLqxjJpy50Ne5bEjZkZTuRFHkFtCxsTHs7e0N
-1MJJm8nFxUWkUinuAooYjBu9spHHWCqV0G63T+3BUf8xeee6rrNBOzgwAegtTLtqww0AAs4euiTl
-quMMnBT0vv/uvHQ8Hse3fdu3YX19nY1+t/qSqqqwbRuvX7+GKIp4/Pgxfz6k/HVeEokEh+DpHGgi
-EwBMT0/fCuNNrVhH5ZlzuRzK5TJ/HwiSDJ6c3K+HSKfT2NraOvR8WohJN+G2bHqOw4MHHefTCDiJ
-RJiAIRjAja0q6o/jOJiZmWHVxJ2dHdRqNSiKgmKxCMMwWF71ICTFGoYhVFXF48eP+Z6m+zxiMG7s
-lSJPu1AooFQqsQ7vIPlsKpoiHV+SbQT25UVlWcbW1harllFfLEmQdnv2juNcyThCFy5SOF2RFz/3
-b/KlJxWJjYRZ1IIacmL/qlBFUXhgQT90XYdhGCgWiz1fymaziZ2dHSwsLJzry5pOp3Hv3j1IkgTb
-trG9vc0iKvfu3bvw8aCXSSwWYxW7g3Tr23ejqiq2trbgeR5mZ2cRi8UwOTnJuudUcChJEjRNQywW
-42rz244ECQEuNjXgw4eEy5szf1kIgsDpNVmWsbi4iHq9zkOVuke00vz17hnkNPM9m83eitqJq+LG
-Gm8SCSkUCpBlGfV6He12+1iDRAVMiqLAMAxIksSzjMmbJl1t8mY0TUO73eZCH9/3eWdJue+xsbFL
-X/CaQhOJ8PS5YpokNEh1d0JIHGm8XdfF5ubmse1JwH64vVurvFKp4PXr1wjDEM1m89zjNKlNjSYa
-kfG5ipa9i0QURdi23RNdItEZGkjT7zmyLPNAD0mSMDk5iUQigUql0jNsglJH3eNdbzMCBNjoXOhr
-NNBEPhxMp/+q8X2fZ4h3Tw0jMZzumeCCIGB1dRWe57EmAxWrkrgP/Zv0N0ZHR+H7PuezW60W35cR
-Z+PGGu/Z2Vn+d7VaRaVS4albFPLuzks7zn5xyqNHjzgfqqrqkdWNsixjYmJfqIT6EV++fInd3V0O
-s3eP2rxs473vOQSnfl73mNITHxuGfT0Hz/Pw5MmTE9XpqBiOeoo3NjbQaDRYwYv674eFrus3Snqx
-0WhwyP8ksYpCoYByucw/d29EyRM6CMnPHiwAymQyaDQa2NjYYM/bsixYlnXi7PfbhIPh3n8H2RX2
-MBpefxESEq2iNkdgf+PXbrdZyVKWZZRKJWxtbXEb6MbGxqH7ljxs4JPU2fz8/CHZ4XQ6fes22JfN
-jTXe3eRyOdy/fx+pVApbW1vodDo8yrK7KvzOnTvconDavmIAmJychG3bbLRp4R2GB3lasmEWTaF5
-6nwaDRQZJMVQRx3j0uEpSRRmPWnnTC0hpI4H7HvipGVerVYHmv52G6HknyrHAAAgAElEQVSJXGEY
-QtM0ZLPZYyMYsVgMhUKBe+kTiQRmZ2ehKAqeP3/OksDdiKKIBw8ewHEcVCqVngiIruscVdJ1HalU
-ijcEbwppXGzdin/BYflhoSgKHj16dOj+O2iYSf2QBs4cvFdIYre7U4FEgebn568kvXibuRXf1GQy
-iUKhANd14XkeDMPgalma7lWpVM5dDBGLxfCpT30Kn/70p3Hv3j0uvLiqIgsT1qmfQ+EwUgM7jqZg
-QBcOe3SCIAysjiQIAtLpNHvF3cVtnU7njQyd+b6Pzc1NVqsTRRHf+ta30G63j3yOoihYWFjAo0eP
-8PjxY8zNzaFareLJkyfI5XIwTfPQczzPQxiGePbsGdbX11l7/6OPPsLu7i7GxsZYMKNcLqPT6bC3
-/ibw/d734+vCf7uQY68LG3gUPLqQYw8Tz/NY538Q4vH4kQp71LPd/TeaVPjs2TM8f/6cI6AR5+fG
-e97tdhuNRgPb29swTRPxeBzFYhEjIyNYWVlBEASYnZ3FxMTE0HZ+VBxHOcN+sqyXgXaGatnuUHYY
-htyv3O/aqNLR18u27XPnRtvtNiu3vUmYpslSsxROHLQ9KxaLodPp8EIYBAF0XcfIyAhM0+T+b8qF
-b29vIx6PY35+HoIgoFwu89hXEpeJx+OcbqJ85ZvAnfAOfk/43QupBn9P+Gv8vHf9h5MMU6Y0nU4j
-Ho8figBRKN4wDKysrGBxcTEaSjIEbpzxpklVwH7VcqVSgeu6yOfzWFxc7JkO9ejRI54rPGxoopHr
-uqjX65ceNgeAb/e/gCfSh3g7GHz8Z/cIVQBsyKkGgHbgHwXP8H2pL/Y9RqlU4tz1eVAU5dwjPW8i
-JIZDqYtms4mZmZmBQ9au67JMba1WQ7lchiAIrH5HOgSJRAJTU1OcqgD2C4UoQgXsG3mKHiUSCVSr
-VQRBwJ/NbQ+j/33/h/BH0lfxd4L+9/pZeCp8hIc3wOsG9tcxaiUcBpOTk1hfX++7Idd1HbVaDSsr
-K8eO+40YjBthvMMwhGVZ2NraQr1eR6vV4qrHfD6PdDqNsbGxQ8+7SI+Oio1kWb6yUNCng0/jj6Wv
-4m0MbrwPQoszeYOapkFRFHwgPMGPij/W81jaLJXLZei6fu6FXZZlLC8vY2ZmBtls9tYbCuATSd0g
-CGBZFtLpNGRZxurqKlKp1ED6AST5a9s2RkZG0Gw22QsPggCFQgGTk5N97//x8fFD08No3CdVFnf/
-LpFI3BjBFpozTznZQdqQ7gZ38V/Fv8CK8GooGucWLLwSVvGz3pfOfayLptPpcDHasBgbG0Oj0eD5
-7geJermHx7UeTGKaJiqVCnZ3d7nHtVgs8gxm3/evzHPzfR9/+Zd/yVq+V1U5+Q3xG3gpLuPbw791
-7mNRu9D74jeR6YzgR6Z+BGNjY6wfTznZYV5zyruLoojZ2dkrS0FcNL7v4/Xr11hbW0MqlcLU1BQ2
-Nja4eI+4e/fuQP3p3/zmN1Gv1xGPx7GwsICVlRWMj4/zUBFVVVnz3zRNJJNJ1Ot11kWntjC63pRG
-6b7+tm3Dtu1r+5kEQcAboU6nw7PGLctCJpPpqbHofk6/TeIvK7+Ed8O3MBWeXZrThYuviP/lxszy
-brVamJqaQiwW6ylm7OYsnTT1eh3b29uwLOvQWkGbzrm5Oe7miTgb19p4u66LpaUlrnocHx+/Uu+s
-2WyiXC5DlmUUCgV88MEHh1ogroJ/p/waPh2+jbHwcPThtNSFOv48/Dp+NvgSHj58CFEUsby8jEql
-cqHvleRpHz9+fGGvcVVYloXV1VU0m02WjM3lclhcXES1WkWpVIKu67Asi6/BcSkJ2ghsbW2xwBAZ
-rVwuh2w2i3q9zoI1VBzoeV5PTzf17VLRWr92tVqtBlmWr8V9bln7BZrU305tj8lksifE351ao0hS
-PB6H4zgwDIOv/0H+nfJrGEUe3xZ8+tTn9kp4jSfCh/g599+c4x1eLo7j9GhVZDIZ7O3tQZZljI2N
-IZvN4smTJ8jn86cOrTuOg5WVFe5mIOgefPDgwRuZMhsm19p4Xyc8z8MHH3zA0oDT09N48uQJfN+/
-FsUXv6j87/ju8DuQC89efNJGG38o/n/41+2fwfj4OH9ht7e3sb29faFfNgojF4tFzMzcLi3ovb09
-rKysIJlM8gjZ+/fvA9j3fnZ3d9k4Oo7Tc+0J27ZRq9VgGAbP8CZdetd1IQgCZFmGYRhwHIcN2nFQ
-FwaNMu23MQ6CALu7u1AUBblc7ko3z3t7exBFEclkEpIkHRt+pcK7IAi404QG59D1orbRbr4qfRXf
-Ej/Ad4XfgcIAPdoddPCH4h8hH47in3n//Hxv8AxQ5IE2M1TjM2jagKBuBVLqC8OQ5x1sbm7i8ePH
-KBQKpzo313Xx+vXrQyqMlmXh4cOHZ2rXjfiEKPkwICTrNzY2hunpaZimiXa7fS08EgD4Ofd/xi8p
-/xYLuINH4cNTP39ZWMaSsIx/4/487KBXItOyrAtftEVRRCwWQ71ev3XGm7w/+rfneRBFEWtra/w7
-QpIklEoltFotLC4uQpIkdDodfPzxxzy4geR6ie7NYyKR4FqMQc/ruHoD8pRoUtRVCBIRpFEwyCaS
-zlEURYyMjLCWNtFoNNButw+lLb7ofxFf9L+I35F+B38m/jlGMIJ74QImwgkWLNoV9rCCFWwLJeTC
-HH7a/Z+g4Go28CSuQzUoruvCMAwuPh3UQPZL1VDdg6qq2NjYgGVZPeJYJ0Htja9eveJzIi2BN0UI
-6CKJjPcp0HWdF0pVVXm61nVpdfoZ92fxFenL+D3xK/j+4HuRwskbCxMm/l/xq5gMpvAl7+cA7C94
-rVYLwCeteJexYLfb7Vs5DrBcLvOktU6ng7GxMVY26y4SAz4Z77m3t4disYhUKoVGowHP86DrOprN
-5rGvJYoi60uftEA6jgNRFGEYBm8IDhYikhfm+z5qtRoEQRj6/HoK/h3nKZIe9klKdP3od66ZTAad
-Toen4B3cEPwT/58APmAIBj4UPsRfie+jgw5kyCiGRXxf8HdOTFNRLp7UGC8CTdN6FCOB/ZYtx3Fg
-mia3z54FRVGQSqVQr9cRhiEqlQpyudypHBZJkrCwsID19XVUKhWIonijiiCvM5HxPgWf+tSnen6+
-qqEkx/FD/g8DPvAb8n/EnrCL8XAMd7HYs9DsCXt4+Teew0iYx5fcn+uZUEYDRzY2NlCtVjkkexHQ
-nGnf9+E4zplme193giCALMvcb51KpXikqqZpPAO9+/HUiri9vY0XL15A0zS0Wi2YpnmiASNv/aRN
-paZpqNfrHFJ2HIfDsBRpIsNAmw0672EswJ1OB5ZlsZY2RQLoXiOjTiFwUvXzfX8oiz+10Jmmyedw
-UDksFabwhfAL+ELwhVMf3/M8lgamNIcsy0NNP8ViMT7/bqhocW9vjzcnZ/kOS5KEeDzObbFra2uY
-n58/1YaAilGprbbVag08RCriaKKc9xlwXRfVahXLy8tIpVLXuvWhLJTxVHyKLWETDhwoUFEMi/hU
-8KljPQfP83hzchHvjyYQUcHVzs4ORkZGMD8//0ZoHtu2jRcvXqDZbLLBolYvmvZFIVFa9MmbPi73
-2G634boubNtGPB7nsalHUavVoOt6jzGkcyCP++AwFFp8qc3tLFiWBdu2+ftD89+pewP4pPuBDDv1
-p8uyPNR7xPM8VCoVVhsjQy7LMmKx2LHvkaIp1ALVfa0ptVYoFLj3vtVq8VAl4qhRr4NSrVaP1Zmg
-1k6aBHZaTNPExMQEXNfF7u4uEokEJicnj6xQP4owDHlE8Nzc3KnPI6KXyHifgaWlJVQqFRbESCaT
-1yZ0fh2gCtbuymZN07iqmTyeO3fuwPM8vHjxAkEQYG5ubqiCEdcV27bx5MkT9iiz2Sznnmmq087O
-Dnzf5xnyVC0tiuKRveCkK51IJKAoSo/O9FH36N7eHjKZzKkjSO12m1X2KG+cSCROTK+YpolWqwXP
-8478rKm9LZFIQNM0BEHA4jJkhIbttVEuPwgCDjVTtT4J2FDlfvc1IONNwzpIf4KKCWu1GtLpNF9f
-km+mx9NrUn/6cQbWsiyWN5Zlmf9NffvHfYbVahWqqp65SMxxHMzNzWFra4vz4Hfv3r02NT9vIpHx
-PgPlchnr6+sAPpmlfNKErcuAxvZdZSifFvSJiQmkUik0m02srKwglUphfHycDQst+svLyyzlmc1m
-MTIygnw+fyvD54Tv+yiXy6wGSMNbbNvuMbp0P3U6HTiOg2aziTAMMTk52ddINptN+L7f0wZF09vq
-9XqPYaDCt0QiceZrTVK7juNwMV33eMh+1Ot1APv57UEEaa4az/NQq9UgSRLCMGTjTMJMB99Du93m
-Gda0NvTziqltjeRpfd+HaZrwPI/D7LRBIc357tqAg4Vf2Wz2xA1Nd+1EEARIJpMDe/ztdhsTExPI
-ZrN48eIFCwXdvXv3RnyOt5HIeJ+RVquFjz/+mCtw6Xf0BequyiVD1R0eOxgq6/d44rjHdv+d8pXp
-dPrSd8RkDOLxOEzT5Lzr6OgoNE1DrVYDsF83IAgCWq0WVldXWdKTvEyS/XznnXfOFUq8CVAOm7y3
-zc3NnsKjg1C+l67TwfC57/toNBrc902eGXnsiqKwZx+GIVqtFnK53NCKh4IgwN7e3rGT4mq1Gnvp
-N4nuiAiwX7x62rDxoK9DGxz6jlN6ofuaNRoNVug7Tf6Ziuho6qKmaQM/33VdPH78GK9evcLe3h53
-NrzzzjtRAdoVcH2TtdecZDKJmZkZrKys8M+UmwR6DWy/9pqDvzvu8Sf93G3cXddFp9NBvV5nuVPy
-Aii8Oez+Ssdx4DgOFzRJksTGIgxDFIvFnipymnRFo0WB/cIYeh7lCm97H+jHH3/MhjQIAmQymWPD
-zuSJt1qtvpK81KNLIiZUeEg5YpJQpXoDSZI4j949ba7RaLCXfppFmcLKR7WT0Sb3OteIHAUZVRK1
-UVWV0xnD3GQe5akfRFVVztFTYeEgnxW1ZMZiMTiOw50k5I3bto1Wq8WTALshrYFisQjDMJBKpTA7
-O3vtinbfFG7et+gaQbtxQRB6ei0B9ISw+oWzDv7uuMef9PPBv+m6jjAMuXKWjAP1ge7u7vJc3vNC
-FcOUhyNjTLntxcXFQ88xTZOFRCgcSCFGKvy57V43AExMTGB3d5dVwgaFRn3WajVugyJjTGpZdB/S
-4txoNADsG04Kc5ZKJViWBdd1+f4ggY9ms8kGfJC2MAoDy7J85AaE2oRarRbrpl93lS3aXFExGrXJ
-kUY9RRIue6NJ35FarcaV25Zl8dCbQVBVFfl8HrVajXXhqSCw33Q5TdOQTCaRSCQwNjaGzc3NI+dK
-RFw8kfE+B9SOQx7NdRqsIQhC39AkFZPR4IDzhLuazSa3edFUK2qJod81Gg02FvV6naUq3333XQD7
-u/mdnR3s7u5ienoa9Xr9zG0tN42pqSmMj49jZ2cHOzs7A30WhmHANE1kMhnIsoxyuQzHcaAoClet
-031I8pfZbPZQu9/u7m7PSNLu+5dajyiSkk6ne6rAu6EWP8qtn6TCRfoIruui1WpB0zQ+T+qJvqhJ
-gGeh1WrBsiyoqgrHcXhTSd5rEAT8mZy1n/osdIvr0GS4TqeDRqNxKj36g1KxoiiiUqlwoWM33RMJ
-JycnUa1Wsb6+DsuyMDU19UZ8Z68T0dU+I2EYotlsslzjTUEQBMRiMfi+j729PUxOTp75S0eh1lwu
-B0mS0Gq1eiIPNDpU13VMT0/zqMBHjx7xNUsmk4jH45iYmODK4mw2e+09smEhyzKmp6chiiJ2dnaO
-fd++76PdbiOdTkNRFNi2zZEKagnzfR+lUok/GxJhoQ0UtUQdDIl3bzzj8TgbVwCc3rAsixdvRVHg
-OA7i8Tiy2SwqlQq/5klQisS2bTQaDRQKBeTzeR6EQgVi1wG6tpqm9a0Ep+r/SqVyqcabXhvY3wDT
-BoO+32c5DpFKpWDb9qHHUfsgANY/f/nyJVZXVyGK4q1TRrzuRMb7jFSr1YGlGq8jZDyr1eqZw16d
-TgexWIzFM7rzsJRbI83y1dVVzosfJB6P88L38OHppV1vAxMTE6zEdpQBpOl1tVqNq56pzYzSI5SG
-oGtPnrhhGD0a6K7rHrtpo+NRC9LCwgIEQcD29jYPKxFFEdPT0yx7ebCV6jho47G4uMiiM5RX7qci
-RwprJBpyWVBNwEmjLCkldZlzDqj4jEbDiqI4lP53yucfvBcPaj5MTk4OpD0QcTFExvuMVCqVvnmh
-s/Db2m+jKTWhBgp+3P6JoRxzEBKJBFeeHhc9IEEN6kel3Xe30aWcIFVCt1otjI2NcS5NFEUOE0cc
-hhbJkzxXCiv30yPvdDrIZrMwDAOtVovDz5QTJSnWXC6HWq2Ger2OdDrd1+BS+1K73cadO3fYKKyu
-rgLY30i02218+OGHiMViXPk8CDS68/Hjx5yftSwLH3/8MYemyQiShCnl4z3PQ71ehyRJF9pR0Wq1
-EIYhp4JOgooDqb+bVOCGHUEgAR5ZlnnDFI/Hh5KycxyHr+3BJqR2u43R0dFD70dVVaytrfEmPuLy
-iIz3Gdje3ka9Xh9Ku8tX1C/jO1JfwKfEx+igg1/Cr+Bf2v9yCGd5Mt1iD/3wPI934DQbmR5L1eTA
-vhclSRLGxsY4fK7rOlzXRSaTQaFQOLYFKgI8Feqkxf5gZwHwiXY3tep97nOfg2EYePXqFc/yJqEc
-6kHOZDKoVqvY3t4+pCdPSm+KomBsbKynJeqtt97CkydPYJomxsbGOGVCw1RINe84HMfB5OQkh3cd
-x8FHH32EMAxZDIXodDqssd39O8uyUKlULqRdq1sJbdDj0+a33W6z0IvrulzJPSzD1mq1OOI17A1M
-d7TlYAqE7oWDJJNJyLKMtbU1lMtljI6OctrlTVBKvEoi431KbNvG7u7u0Poad6VdfErcn2GtQQMu
-OdVH0pMECYFQhfpR1atU+CaKIn9hk8kk3n//ff6iT0xM3Lh+3ovCsizOIcfjcfZUqaWrXq8fO16W
-Cspo1GOtVsPExAT3iKuqCl3XUSqVoKoqisUiH9PzPJYh3dvbY9nbXC6Hvb09HjhC/fbUSy5JEkZH
-Rw+Fix89eoR2u90jzkF530qlAsMwji0603Ud5XIZqVSK8/f5fJ57qA+Gaj3P63k+jfJst9uoVqu8
-KaHirfMadEmSkMvlWOXtNNDjSfa3Vqtxu94wvPBYLMaf57ALZCk1QEWKhOd5R1bUp1IpZDIZ1ix4
-9eoVgP2NwNtvv30txiXfViLjfUp2d3e5UGcYjPsT+Jb/BO9Ib8MMTeBwkeeFQW1CtDjbts0hTfLK
-+3nLlFsdHR3F5ORkzxd0enoa8Xj8TNOfbiulUgnb29u82aEOBVVVORVBAzqo6IgMWLeSFml753I5
-FItFFAoFOI6D169fwzRNNuwvX76Eqqp48OABdF3H2toaqtUqh84ty4LjONB1nVMn1CMeBAFyuRyr
-pvUzXt3tZt3k83nkcjksLS2hVCrx/Gy6j2isKOWHS6US0uk0S+V2K8+RYVJVlWdNHySRSPTIhdLw
-jH567d1QwZ5hGLwpoup6x3G4l/tgt8RpEUUR+Xye0xg0H/s8bZC0kbmozhZSRaR0F80/P+r7vLOz
-g729Pei6zmsFKcJRQWzExRAprJ2CWq2GpaWloYeD/rP6n1GXa9ACHT9m/9hQj30UFHrsVkULw7BH
-h/m4546Ojp5qtu+bzNLSEhqNxrG5Sdd1eTAH9ehT+93Dhw8xOjrKw2Ko+nttbQ3b29uYnp7Gzs4O
-G0jaGNy7dw+qqqLRaODDDz9k4RvDMDg3K4pi3+hKq9VCoVDAwsLCmd5ztVrF1tYWGo0GG0V6TdK5
-D4IADx484A1Cs9lEu93G9vY2T/vKZrOo1+tIpVLcukYa50eFoklz/KDRDYIAlUqFdcUpREyFlpRT
-J7XCVqvFXRDnhaRryXjTRopel6rED4oxUWRFURR0Oh3evF2E8bYsC+VyGb7v4+7du8jlctjd3cX4
-+PiRBWmvXr1CuVxmRUXqZKHpeZHnfXFEnvcpaDabF9LC8k+dfwocFsy6UGhxSiQSHK4llbiTCIIA
-W1tbGB8fj4pUBqTdbrPxJO3qbhRFYWNDnqZlWaxBDeBQxbNhGAD2Q6mFQoHbtaj6e2lpCbFYDAsL
-C/jO7/xObGxs9BSckbEigSGqli6VSlAUBeVyGfPz8z2eYqVSYZ11KuaiuePdjIyMQFEUPHv2DIqi
-cBiZpp4pigJN0/DkyRM8fPgQ2WwW6XQa6XQam5ubPPuZfAvqJadCMJqk1e/+03Ud1WqVVcCA/fud
-zjmXy/F7ouhAN7SxoBGlw+BgGJr+03Wd0xSO4+Brsa9hI7EOV/ibtiwJUEQFn/M/j3vBvQvJ8dNm
-x/M8ZLNZOI6D6elpFmM5jkKhgGq1Ct/3MTU1xWNlB1GJizgfkfE+BbTI3QaoL3iQCU20wFNYl/Kr
-kSjDYIyMjKDRaEBVVQ5ZHxfd0DSNB1RMT08fec+RQt3IyAgby1KpBNM0oWka9/JTDQL1k798+ZK9
-Ttu20Ww2US6XAYCNCOV833vvPSwsLECSJDSbTW6RJK+93W7j+fPniMViKBaLkGWZaybq9Tp3H1Cl
-O0UGGo0GUqkULMvC69evce/ePfbAx8fHEYYh8vk8tre32dumQjcK71NxWPcMcGDfIFNBXreWezwe
-R7VaRaVS4ZTBQSjkS9Gli/BwaRPW/bn+lvKbMCQD34Uv4HvD7+QwPr2vvw7ex29mfgOfcb8NX/BP
-P1sc6D96tNlsskgOSb3OzMwMnOtPJpOYmJjA5uYmWq0WFhYWIm/7kojC5gPSaDSwvLz8xgnw+76P
-ZrPJ4cTPfvazN0qU5jqwu7uLra0t9mapJ/co2u02xsfHkc1mj8y3tlotfPTRRxAEAQ8ePGDPjgqH
-tre3We+aZobPzs7C932sra31hIq7R9uSsaV+alLQo6EmB0O7BI2ABXo1zslANRqNnoE1pFBGbUnp
-dBrj4+OsvrayssLdDpR3pXoBgiIPpmkil8sd2hBRDQe1zR0Mldu2zXUDpJJoGAaSyeSlTcry4OFX
-tV/BDyh/F1PCyfnhP/O/hi1vBz/h/OSpXofU7GgDDuwrHtJnRDU8nU4Hmqbh0aNHA29cgiDAe++9
-x7oDi4uL10pt8rYSuU4Dsru7e21Uny4TWuCmpqa4QCjidNAsaio8O25hoyr0mZmZYx9HFdeu66LZ
-bLLxTiaTbHxevnzZMz1qeXmZF1aSTaUwp+/7KBaLKBaL+PDDD2EYBveHDxKdOSkilUgk2APXNA2p
-VKon5F2r1diwyrLMXjV5g/28OQqJ0+O7BwN1n1M8Hudpa2Sggf0KeeojJy3+kZGRS92g/6r+K/gp
-ZXBth++WvgsvxJf49/g/8JPOTw30nE6ng4mJCeTzeU5jUP1EIpFgw011CSfdewehwrxmswnDMLC+
-vo65ubmBnx9xNqLt0YB0599uO1RNbhgGNE3DzMzMqWb/RnwCLWgk4tFPM7obSZIwMTFx4uJJRsr3
-/b7pC03TcO/ePW4tymazePz4MUZHR7ngiQyzpml46623OL+ZSCTY4A9iuAeBZEapULJWq3EY3rZt
-6LqO+/fvA9hvFZufn2dFuJOIxWJQFAWGYbBhJih1QFXlVCxG50GFZBMTE0MdjzoIv6b9Kv6F8iOn
-ft5dYRF3lDv4qvTVYx9HCmxBEHAqwvM82LaNRCKBO3fu9LTiUcj8LAW5JL6kaRrq9To6nc6pjxFx
-OiLjPSAUSrztUEUuhTjv3r176ZrNtwkacUp9zycZZco/ngQJrWQymSOLgxRF4V5yqlKWZRmzs7PI
-5/PcDtTd1w2AhVeGjSRJiMViSKVS6HQ6PFClWq1yixyRSqVQLBb7amz3I5lMcqUz5XEBcGsava/x
-8XEkEglkMhluJ6Nq+MtkSVzCtDQJDWcTLvp28W/hY2Xp2Mf4vo9kMonFxUWeeKhpGorFIu7du4f5
-+Xk8fPiQjXcYhtjY2MDW1tapzyeRSPB17nQ6LCAUcXFEYfMByWazWFtbu/VFWlRQFY/HT1W4EtEf
-MhDkiRxnFCn/OGgF/507dw79rlarcVW2YRisBNj9WFVVMT4+DsuyAOx7rq9fv4aqqhgdHUUQBBxG
-HiaqqrIBp8WeCtgOGk9ZllEsFlGr1QCAPUgAhwrUCF3Xoes6DMPgULiiKBgdHUW1WuXjNBoNlvNU
-VRVhGLJE8GWpAP6p8if4celfnOsY3yN/J/5Y+mN8n/99ff9OETRqN0skEnj06FFPdIFmuJPUaqPR
-4OLK02g1UBscsP85v2m1QVdB5HkPCIXmbjtUwJTJZDAxMXHVp3PjkWUZ+Xz+RM+OxFNyudyxkQ5q
-Y6Lwu2maPSImW1tbePnyJTY2NlCtVhGPxzE3N3co/DwyMsJhbNM0ebQnsN/WRJ75MKDhNFQUFoYh
-t2GRmhkV0pEKXfd7NQyDW7+azSZarRbq9XrPY7sh1S9SYKNNiuM4aLfbEAQBtm3ze6YN1cGQ+0Uy
-jIKuBWEBH8tHe9+qqsK2bb4fyuUyPvzwQywtLfEQHOpooM6BeDyOkZERrK6uYnNzc6DzCMMQu7u7
-vEGlzzviYrndbuQQuS0tYichCAJSqRQePHhw1adyayCDRTKTpPBFw15kWYbneZidneXcYavVgiAI
-bPAonN5oNOB5Ho/UpL8pioLPfOYzuHfvHmq1GsrlMprNJhKJxJFh9YmJCXz00UeQJAkPHjzgnDeF
-1g3D4AWZ5m4f1MOnv4ui2BN+JeU4avGiynfP82AYRs8GhQrNtre3uX+bvHQSKhkdHe3ZPLdaLdbU
-1zTtkLhJo9Fg75ymlDWbTWiaxsIvlJulNIWqqj294RdFVahiUigO5ViBcPxwpHg8zvdNvV6Hruuo
-1+vY29vD48ePkc/nuVBxZ2cHr1+/BrAf3aAxp93zvg/y9OlTLhQcKXsAACAASURBVHikz9T3fZ4X
-H3FxRMZ7QGgE4m2ne15zxHCYnZ3loS3NZhPLy8s8T5tCt7quY3x8HJ7nsUgJ5aPJUAZBwHKjZMSp
-v9vzPG4DIkWsUql07AKaSCSwsLCA9fX1Q/e2pmmYnZ1Fs9mEZVloNBrQNA3JZBKWZfGCTcVv5KWR
-kafwOLWbFQoF3ri4rntoqIgkSdyqVi6XWbZXVdW+kQiqqm80GmxwKVRLG4ru41PBGkHh9XQ6zUZe
-VVX27C/S8NRQw4hwtEE8DfIAwxC65xd4nodYLNajbHfwsVTU1263ORp0FDRXvjvFQh5/xMUSGe8B
-ocpcGsd3W/F9/8I9jzcNkr4E9g3K+vo6gH2j7jgORkZGYNs2Xrx4gVarxepex5FOpzmPS7ljktEE
-9lv8Op0OisWjPTxZltnQN5tNbGxscD6acp6UA69Wq0gkEojFYmi329z77zgO5ufnUa1WIYriIaPX
-6XR6NPLJa+90OqjVaocMA53/oPn2TCYDy7LQbrc5GmHb9qGK6YObEwrdHzzfRCKBVqvFrWsXoRSm
-QIGL4RR0hRi8A4bSItPT030N8sTEBJrNJtdJxONxVCoVjI2N8ZrXarVYZIc8epotT1Dr3mVEMd5k
-bq8VugAymQzq9fqtDQeR9xYNFbk4dnZ2uOd7eXkZQRBgY2MDrVYLsVjsTOkZmqbVXQwXj8f7FrQd
-9XzLsli8RVEU3Llzh0eF0uS4bl6+fAnLsjAzMwNBEHoGUxw89sEojiRJSCQSHM4+L6TfTprt+Xz+
-xGr5RCLBOt4kFENiNLlcjj3w7h76YTEZTuIvwq/h80M4lhcOPskoDEOkUqkjdcqB/c0lbQpt2+6Z
-SR6GIVZWVmDbNn+m1H5Hfw/DkIfeREVrF0tkvE+BoigIw5ALO25L3zON90wmk0in05emLvUmUq/X
-oWnaoehN96I3CJVKpWeKE00oOyvFYhHj4+PctnWc5yuKIrLZLCYmJjA9Pc1T0fp5vLZt9219G7SH
-exCoMv648G43QRBwBI0ME1Wh00AYQRBQKBT498P8TsiQUQ1qQxn/mwwHdyREUYRhGHjx4gXm5+f7
-bnCo4t6yLM6HU4FfqVSCbdscFu+eP0+1AzRqlqRyIy6O6Oqegnw+j3g8jq2tLdTrda7MvslQfnJu
-bu7YHXnE+Wi1Wtje3kar1eqbw5Vl+UQBl24op0wc1T51Gvp52P2IxWJ46623+Ofd3V202+2eECmJ
-gVCv8UH66Wyf57xPc+1arRYMw+i530nbO5VK9eTHwzAcWtV9NyP+CJpKE2mc3av/Q/+P8H3uFwd+
-PK1VlALpl1LRNA0PHjxgkR6iXq9jdXWVaxjI+xZFkaMTDx8+fCO0MK4Lt78Ca8jEYjEsLi5ienqa
-q2tvKu12G5lMBo8ePYoM9wWyvb2NFy9eoFarHdkGdlCk5CTIUwf2F9x2u43l5WU2pIMas2azeW7l
-wHK5zKFzYN/brtVqrHV9lAIcsH8Pnhcy3oNGHnzf57w+QZsnz/N68uP0mQzbgP9z90fwe+6Xz3WM
-LX8bs+Hpx/ImEgns7Owc2RqXSCR6DLdhGFhdXYWu67zposFE+Xwed+7cwczMTGS4L5nI8z4j2WwW
-L168gOu6CIKARw3ehFARKWpNTU0hn88PJXpwMOcasU+lUsHW1tZA4yWpLWyQroZUKsUjajVNQywW
-w97eHkzT5KlV2WwWIyMjfT1fy7Kwvr7OVeSpVArT09NnuhdIYpQMXBiGiMVixxpTKmLzfR/lcvlc
-dRZUsDdoN0gYhoeuCY1ppZoW2ohIkgTLsuB53tCVBu+69/Gn4p/he6TvPvVzf939j/hR5+wiL5Ik
-YWVlBTMzMycW5cViMaTTabTbbU41kIRtJOJ0dUSe9xlRFIW/8PF4nLWVqRrzIFQFe9UtFDScYXZ2
-FlNTU0PrX7+I0OJtgFq6jvKqSUPesiwemTkI1GpGM79pYaWBJZIkoVKpYHl5ua/O9NraGprNJuLx
-OD92aWkJL1++5P7ug8Y3DMND4huu68KyLDaetPkwTRO2baNcLh/pXScSCaTTaei6jkajMdD77gel
-r046BvWYU8HgQeh73P0eqa89m82e+fyO4ov+F1Fx6/jz4C9O9bzf8H4L3+F8F1Lh2Su5JUmC67rY
-2to68bsryzLu3r0LXdd5WMxbb70VGe4rRvqFX/iFX7jqk7iJCIKASqUCRVFYerBbapBkCUnViUQ3
-6ItyWTKMB3EcB9PT00MPkw9bSvO2sLGxwUVQB/F9H9VqFZIkIZvNnnojRfee67qwbfuQJjkt0PV6
-HY7j9Izg3Nzc7AnVK4rCuuCrq6toNBrY29tDq9Xigsb19XWUSiVUKhUet9lsNjmykMvlYBgGVFVF
-MplEKpXi7wQZxKMiUzQm9KwIgsCDX/pdx3q9DtM0IYoi4vF43+8fqbl1RwEEQWD51KOmm52Ht4O3
-sRwu48+Fv8Bb4mMIODp1shau43e838UPdH4Q98J7535t6tGmfv3joHtpd3cXmUxm4OLAiIvj+sd4
-rzG6rvOs4Hv37mFlZQWu67IXTguEIAicY6OeWQBD3blSvk6WZYRhyKGtbqiaOcpvXw6kNNbPYJFc
-qKqq565ktiyrZzBEN7quw/M8NrqpVIoXXs/zeowR9WDLssz5TcMwejxaXddhmiaP4KQRppQ3TyQS
-vFEAwP+n6AJ5bt3QxD767pwF2jz08/KpJz2TyRx7/CAIWPCm+zNLJpOsiOd5Hiu6DStF9gPe34Pt
-2fi/1N9CR7SxIM1jTpiFLuhohA08D16gFJQw7c/gZ90vDeU1CRrKMki6ZnJyklMsEVdPZLzPgSzL
-PMSD1LKoCrP7Bu/e5dOXngqKqLeaRjQeB/WiUm8lGWcaqUieFA0koCIeKjAh5aSIy4EmWnUvjNSm
-ZFkWNE07t+GmDcJxkRzKgQPgwRPdcpbHnX+/45LkJrBvnLuV3FzX7ZsmSKVSHGI/2DttmiZPs0sk
-ElxJf9pq9Far1ff+ptz6SRsDmv521NAT6ie3bXvo4XQdOn7C+UkAwJawhXVxDTZ2kQ7T+LvhD5wr
-RH4SVFF/kn6FIAiRBsQ1IjLe5yCfz/P4zEajwZrJJ5FMJmEYBu/kDcNALBbjDUA/TNNk4QPSiiZD
-7vs+FhYWesKO9XodpVIJ+Xwem5ubPRraEZdDpVLhaAeFtj3P4+KnYURestksR1oG4aT0hiRJAx2r
-VqtB13XE43G4rsv1HrFYDNlstq8XR4NILMvC3t4ekskkG454PI5sNou5uTk0Gg1sb2+fKhVDoXnq
-SabIAUU3TgrJ00b3OEEWihCk02lOWZCM7WmV2CgK4TgOZFnu2exPhpOY9CdPdbyzoqoqTNPE9vY2
-7t07fyg+4vKIjPc5yGQyGB8fx87ODtbX11EoFAbyFii0bRgGdF1HsVjE3t4eFEU5tGBRv+zc3BzG
-x8chCAKH9ahvmPSxu8lms+wVNJtNVKtVNvy0oEVcHBsbG9jd3eUCKMMwkEgkLiRXSCmTYURVyECd
-BMmkxmIxJJNJ9kRPEi8SRZE3LaTIpSgKCx/F43Fomoa9vb1T3aekrEYyqbFYjA3tIEWA5P0fR1No
-4rn0HLqiY0waw2RsklNkNMRjkLw9GXyal0BRmKv6Tqqq2reoMeJ6Exnvc5LNZlGr1dBoNFAsFhGP
-x/nLeBwHd+rkwXRD8oQH2zkorHecbnU3mqb1LKimaUbG+4LY3d1Fs9lEs9nsSWN0D84YNsMUC6KC
-tpOg3DeFqsMwPFUkofuxiUQCpmnyHG6aP768vHyqc9d1HZ1Oh+eZD3K9qare87y+IXAbNv6T+tto
-i20UxQmMa2NwAgtPxW/hD8L/B57m4dvlL2DRWITjOLwJoO8zpU5ok0L68/F4vCeVUa/XIQjC0CIy
-p8F13ajg9AYSGe9z0Gw2sbS0BFVV2XuYmprCq1evDhW9nARpLVMI0XVdpFIp3L9//9zn2Z2D7M6V
-RwyXra0trK+vcwshXWeKsFyk1vOg/eH/P3tvHiTZftV3fu+aN/e9Mmvvqt77vX6r9JDBjjH2YGR2
-BHjDQ3gQIAeMwfbAzDCMB4IZHMyMbRh7FsBgIbawgREgwBaLQ0K2dpD0Wuq9umvrWnLfbmbe/c4f
-xfl1ZlZmVmZlVnV11/1EKPS6KpdbefPe8zvnd873exSjfj8o0FiWhZmZGdi2jWq1euxZaApmGxsb
-WFpaQiQSQTabRaFQ6NtBPujvjUajzKOc+jwGoes6UxvrN6b3e+LvIS/t42+I3wqRbpV/XtwwTRNv
-ue8Ez/P4uPJJfEr6JL5b+x7Yts2kQ2mbJBqNssBOkwWd94ZwOMycuWhK5TQlijmOw8WLF0/t/Tym
-gzfnPQEkp0hexfV6HX6/H/F4/Fhzz9TcBBxcUEtL46snDTpOel1N02CaJlRVxfb2NtbW1qbyHucd
-0zRRKBRY8KpWqyiVSiiVSqxRq3dGelpQCXZarzUq1KcxNzeH+fl51hh2XKh8u7m5iXa7jfn5ebz0
-0ktIp9NQVZWNXlKAG6SZQB3jvZWsTizLQq1WQzKZRCQSOZTt/pL8S4j6wvg74t96Grh73oOy1S93
-34Vvc9+D/1v+v6DhwCOAZsbJiRAAy/A7qySapjGHLp/PNzXdhVHRNA2BQODU39djcrzgPQGiKOLK
-lStIJpPQNI017czNzbGgPg6BQACGYTDRi2ldUJ0dtIIgQBRFPHr0CDs7O9jZ2Zmau9N5pdVq4fHj
-xzAMg5k/0L5rMBhENBpFOBxmgizTxLKssaRBj4LmskfFtm22aMlkMhMFb+Bgi6fdbrNFjyiKWFpa
-wurqKoLBIEKhEGZnZxEKhQbu8VcqFUiSdKTCWyAQ6Hs+flv6LVySVvBO/s0jj5eqLEF/EN/Bfzt+
-wffzzOGMmkOpTB4Ohw9tl1HfQDabZZKjk8rVjstJ2J56nDxe8J4QQRCwurrK9stIzAEYL4sBno6j
-6Lo+lj71UZAACEln+nw+vPzyy3j99dextLT0wlqcnhalUonpljebTTSbTZb5ka82jQ9yHDeRmlgv
-lmWxccBpQU2Ro+Dz+VAsFlEqlZDNZhEOhyfWK5ckCdVqFZ/61KeY93k6ncalS5dw+fJl7O/vI5/P
-IxAIQNM0NJvNrr1rAF2iNzRi2buYprG0TkXECldBTarhDf71sY9bURR8Y/Dr8OGZD8Pn8zETD8Mw
-wHEcwuHwob3lfufuNIO34zjsc5rW/cbjdPCC95Sg0iXtay0sLAAY/4IIhUKQJAmXLl2a6kz24uIi
-bNtGIpGA3+9HpVLBxsYGVlZWprJXep7pdArTdR2BQACJRALRaBSxWAypVAqyLLOqh23b2NnZ6Suj
-Oy50451mSX7chQDpkwPAwsICZFmeKABRh75lWYe6oPf29phS2srKCq5fv46VlRVEo1HwPM+sKakD
-n3QUSAa28zPnOI6ZuhAflD6Ivyl867GPfY6bQ1M8GJkjJTfqzK/VaqjX6+xckS0pBXTaJz+t5jHH
-cZgSXqvVwhe+8AVUKpVTeW+PyfEa1qYAzdmSxnSr1UIsFkO73cbGxsbQ2dFebNuGz+ebupZyMBjE
-O97xDlY+J+WscRvrPLp58uQJ8zimqsuwRZeqqkzBrNlsdmU+x4W6tckQZNLF2LiLRr/fj1arxQxG
-gsEgarXaRA161LxlGAYqlQoLvNvb23AcB7ZtI5fLYWFhAYFAgKkG0r446bt3Yts21tbW0G63u7Ya
-aP9cURS4wuTbD39J+Ap8VPgo/qL1F2GaJiKRCMLhMHtfKpULgtB1rqjn5bQmQZrNJlZWVgAcfI/b
-7TZarZYnffqc4KVcU4Acdmjve2dnB8DBKNfc3NxY+5wkFHESAbXzNaPR6FQ9lc8jpVIJxWIRgiCg
-Wq2yTGYYJGySTCYRDAZZr8QkBAIBhEIhpl7Wy7j74ePuewMHAX93dxe2bSOZTLIO6uMiCAKi0Sgq
-lQru37+PtbU1ZktJ3eeFQgH3799HsVhk70V72f0WIIIgYG5uDqZpolarMRVCRVGgKArWuXVc4ScX
-KlnmlrAmrEEURQSDQZZpk5GM3+9HrVbD/v7+oYUWz/MoFAonngG3223Mzc0hk8nAsiy0223WZOfx
-fOAF7ylCTTV0YwCAmZmZLjnJo7Asa2or32q1inw+j8ePH2NjYwN7e3ts3y8ajeLNN9/05FIngDr3
-6TMUBIF1Dg+CFPGAg+7qae2DU7+EaZqoVCpMz7vRaDAdglHL9McN3vR3JRIJXL16lY2SHRdq2iTl
-NBr94nmeWaw2m02sra0hn8+P9JrhcBjXr1/H7OwsE5ghdbNtfhtL/OKxj7cTgzu4/ju3EGj+vFwu
-w3VdJBKJQzrhwWAQmUyGVfH64TgOKpUKisXiscRVdF1HIpHA4uLB30r9AKTt7vF8MNX07rx7OvM8
-j2w2C8dx2L4VeeF2jhENY5AD1Ti4rovNzU3s7+8DOAgywWAQruuiWCxiZmYGsix75bEJodFAslkl
-jfph3budwRs4CHqhUAiqqqJSqSAcDo9ddTFNE81mE5IkIZlMAjgoiebzeQiCgGQyyfy22+02wuHw
-0NI6Ccsch42NDSwuLkKWZaRSKWxsbExURaJGP2riJAMT0vcnC9RyuQye51mvyTBCoRCuX7+OjY0N
-VCoVVqY2OAM+TGm/+c8vYb/fz0bbTNPsakrtVx6n+ydJKNMIG2mq+3w+uK7LKhCNRgOGYQw1C7Ft
-m8mwAsD8/DwymQz7vc/nQyQSQS6Xe+aWxR6jM7Xgbds27ty5g+vXrzNv3/NI50VBpFKpkctgZFk4
-KlT67lw43b59G5VKBel0GrOzs9ja2mL7hJqmYWtrC5Zl4dKlS57D2DHJ5/Ns77JarbKGtKP2K8lI
-pJdQKATDMMYWdCF/6t5Z3XA4zEahKMjJsszminv1tDsZ5D3fTxild8FOxidvvPHGscxFeuk0VaFG
-NFVVUS6XD5lklMtlzM/Pj/ye0WgUuVyOnbOYG0XVrSLOTd5vwrkHCyCqPJTLZSiKgtdeew1bW1vY
-2dkZ2sxKDm+lUon1U9DceOd5pi0bMjwSRbHrfBiGAcuykE6nh1p5Li8vo1qteo5hzxFTC96CIODK
-lStotVpYW1vD/Pw8UqnUuc7EiUAgcMhdahCapqFcLvddBHRSr9dRKpVYac1xHFy5cgWKomBhYQEX
-L15kAeDmzZtwXRe5XI5Jd4ZCIWxsbEDTNKTTaU+kYUzu3bvHhHioi5xcqYZBC61+kCpbs9lkjU7D
-oFJ7NBoduMdL5hwUSP1+P8v8SqUS64ruPcZ4PH5oITJK8AYOyrIk7TvN3g2a6OhUryMsy8LS0tJY
-i4VIJIJMJsOy7wv6Cj4mfhQr8oWJjzXkhNBqtZBMJhGPx5lZSzAYZNsJwxZ6pMRmGAbq9TqzS+3d
-hvD7/WxRnkqlwPM8a14EDsyTaOtuGD6fD2+99dbEf7fH6THVsjl1eF69ehW3bt1CoVDAyy+/PM23
-eC4hC8ZRbmSj7Dfmcjmsr68zlSfqnKXX79epznEcstksstksdnd3sbe3B0mSkMvlkMvlkMlkMDc3
-5y22RoQ8nTszZMqMjmKT28SHlA/B4A3wHAfHdZGxZvD1xjdAkiREIhEmVEJl8E4cx2Ha6UfdlKlh
-qlMqVBAE1pyk6zoqlQqTCCX6WdQOWiD0Oz5d16EoCmZmZrC3tzf1xWGvShm91zgIgoDFxUU4joNa
-rYaFyAJyXH5iqdlPOJ/Cl9nvgs/nw/Ly8qHrPp1OY3Nz88j3oAkWjuNYAK5UKiiXywfCMMEgm264
-du0aZmZmoOs6bt26BY7j8Morr3geBi8wU29pptLNq6++is3NTTY+cp4pFosjNwCJoohGo4FMJjPw
-4qbSKt3ATNPE0tLSyFlONptFo9FAsViEKIpwHAfr6+vw+/2QJImJSvA8j3g87nWk9+HVV1/FvXv3
-WHlzVH4z/BuIJ+L4B6Hv6/r5vpvD+1vvx7va78J1XEcwGIRlWcjn8yyjAg66hCkwjhIQZVlmal+9
-VQFJkiBJEjRNY/vhpmlC1/WJx7woqM/MzEBVVdRqtWPrnndCndGk/U17ucvLy8d6PRJZosz28vZl
-bJibWOVXjn2M96z7eKv+LiTnk32vyUAggNdeew1ra2sDRzWp2ZAybTrX0WgUlmWhXq+zUbPZ2Vm2
-cDEMA5FIBOVyGbVazdsWe4E5sQFfXddZk0UikTi3e+DAQemqXC6P9FhJkqCqKprNZt/9p3q9jkaj
-wVbUNBc6zkXK8zxCoRDS6TR0XWfWhLIs49atW0zsglSiel3NPMAWN+ME7l/z/Sr+cvC/wCX70qHf
-ZbkM/mHw+/Ez3M8i3AxjwV1gY2fVapXJZpLgyDgZVe88cS+KosDn80HTNLTbbaRSqYmEQkgGNhQK
-MQnh9fV15PP5Y6v5kZWtbdtdcr+WZfXt2h4XWth8Z+y9+O/2fgir4vGC9x9Yf4h3tf8CVlZWhl6T
-kUgEs7Oz2NnZgSAIh75H1JcQj8dZ82E8HofP54Moil1mQ53bK/l8HuVyGYIgsMrNeb73vsic2Fl1
-HAfBYNBT8MLBxbWwsABN00bq4nVdF0+ePIGqqgAOblDVahVPnjzBxsYGG/fqLE+OE0Rs20YqlUI0
-GsXs7CzS6TTbE52bmwPwtMvXcRzcu3cPW1tbAA5KlHRc5xmyWR21orLOrSOtpHFDuDH0cX8/8D58
-2P8fADwtbwMH3eOyLCMSiYxdCnUc58jtkM798EkVvqiJr5NMJjPycVOmXqvV2EgUNWVFo1EWrCzL
-mqoHAHDwWf311tfgV61/O/Zzb7lfRN1o4t3Zd2NmZubIa5J0IHpH+OjvikajrLGw9xonpT5yMCNU
-VWXXLe2zj4NhGBPL23qcDsKP/diP/dhJvDCpHp2kDeLzAs/z7IZTLBZh2zbL3PohiiI0TUMul0O1
-WsXe3h6KxSJqtRo4joMkSXBdF+12G6qqdjWnHYXjOLh9+zZ2d3dRrVbZ6Mrt27extbUFVVWZTCPw
-tImK9hXffvtt5PN5RCKRc9/klsvlRrbQ/JDyIfzXwb8HAEf2P5RRgqz7EEaYGZyYpolQKDT2zdg0
-TeZYNQo0jjTJVglVbiqVCpP7JclTUpgbBFWoBEFgXfdkMtKZYdJc8uLiIjKZzNS2dhRFgVWy4Lf8
-+F3+d/Gq8MpIz/uI/VGst7bwvf7vxfz8/MjvFwwGUSqVoGkay/4bjQabZQcOFlZUeaAGNp7nmbyq
-ruvsc6Zx0EQigWQyOfZC78GDB9jZ2UE+n0cwGPR8vs8wJ6qLed4z7l6y2Syb+a5UKnBdd2B3cmd5
-TJZlyLLMGmvoYtY0Da+88spY89o8z2Nubg57e3tMlIHjONy4cYPpSVuWhSdPnuDq1avsOCjbn5ub
-G6lR6rwwatCwBHPkx79Lehc+Jv5nzJqzXT8/zuw1GXaMyiQz3p24rou9vT34/X4mwTk7OwtVVdke
-O33/aLyJFrS9c+iCILA5b+oFIJGTkygLBwIBrFZWsYIV/JL7ASSEOL5GeDf4PoXKL7pfwmetP8NN
-9RV8t/JNTPhkVHiex/z8PDY2NtjPSAud9uGBg0U3yb6Gw2E2RWBZFgqFAsLhMJaXlzE7O4tEIgFJ
-ksb+XBzHYWOHrVZrbFdEj9PFE7U+RWivORQKIZFIYGtri62e+2UjvaXOdrsNTdMwOzvLlLyOU9lI
-pVJIJpNdgYTELohsNtv1HPrd6urq2O/3ItJut9ke9CiTBJ03fiq3D7q5hrkIWlx36fK4jk/jNtTR
-eNkkkEyrLMuo1+usf8Lv92NpaQlf+MIXmGIaz/OsimRZ1kABGZ7n0W63WQd2JpOZmt99L+l0+mAu
-Gwq+R38f8lwevy39Lqpc9aDSAg4OHMiOD6/Zr+I7m+9FMBjEhQsXjjWt0buAJ+0GujdwHIdYLHbo
-O0NNiKZpYm9vDz6fD9ls9tjZMr02JRWFQgGJRMJrWD2jeMH7GRGNRnHt2jXs7e2xbITneXYht9tt
-OI7DjCZc14Usy6yhrddisFOmc5QVt3dBTkaj0WCNQTzPs7nsQVsJtvs0+FLQH8S2s4UZ++mcv6qq
-UBTlWIGBhGRG5TjSqL1YloVQKMTG1NrtNvuexmIx+P1+uK7b1bwWDAaHKjSKoohoNIpsNssat04K
-8tUmZtwZ/B3j2/s+1jAMWM6BCMpxj6nzWiSNcY7jUK/XIYoiO3+91zVZpyaTSaiqivX1dXAcd6RG
-xCCoLE+SruM2ZHqcLl7wfoZIksSyh52dHdRqNTSbTYiiiFgsxrSySb+4VquxETHKwmnem6wQXdfF
-3Nzc2DOvHuOhaRpTNRMEgbnJKYrCAjOp2gFARIigpJQQ+3P1rmFNZB/RP4r36N8C0zVZBzjJZI5D
-uVxGIBAYOXhToJ2GvjW9Bs/z2Nvb6+qQT6fTfRUHB30eJPhy48bwZr9pQeYm9Xp9aF8HfQdoQTHJ
-+/E8j2aziWw2i9nZWTx8+JBtlQ2CpHnpODRNw9raGoD+So9HQTKqdJ6OuwjwOB284H1GmJ+fx/z8
-PCqVSpd0ZaVSwePHj9FqtTAzM8NW361Wi11klLWTete9e/dQq9Vw+fLkDkkeh2m1WqzZjzI00qIm
-X2vKWEia9Kvb78b7hQ/gH/i/D67rHiqzk5RmwS2gUT/QOad9S+o2HgeaHx41cNMUAY2NHRf6O8hV
-TFEU1Ot1bGxsYGlp6aAhbASzEtIwt20bwWCQTUGcFouLi3jw4MFA5z0aWbt+/frE76UoCm7evAnL
-sthnn0wmsbu7e6TKHn2+iqKwWfrt7W1W+RgHmjABxpdp9jh9vOB9xuhdwcfjcczPz+PevXsscJNj
-FD2WAkE+n2ereK/Z5OTY399Ho9E4pGQXDodhmiYMw0AqlToUoN9pvxO/7PwKvsv/3q6fU6NQwS3g
-A41fxrfsfwuC0eBEN89xDSaoZD3pvDT1ABSLRZimySRNGkYNTQAAIABJREFUqbJ09epVRKPRoTao
-rutC13XE43Gk02kEg8FTb35VFAXxeBx7e3t9gyC5qA0SWRkXQRC6Kg+kVd4v86bvCzXuWZaFVqvF
-Pmue56Gq6tjBWxRFZLNZ3L9/H7IsI5/Pw+fznXudjrPKiY2KeUwPGgMhgRZyJCLxjkajAVVVEQgE
-EI1G4TgO5ubmjlVq9TiaQCCAQqEA13WhaRrr0O/Unu4nRpJ1s1BMBb/m/hpUrokUl4ToiHhkPsJv
-6h/EffsBvsv6LliWBb/f33Uzp/NORiNHlbYty4JhGCNrAJBS2TTkNKnMT82Z9LdomoZqtYpsNst8
-xzuPzbIs6LrO3MEWFhYmHlubBFEU2VhWP+jzPYkMNRAIQFVVtFot2LbN9qGpka1SqTA3O9M02Ugg
-SfTqun4sdbVgMAjTNFGtVlGr1VCtVlEul+H3+8/9aOhZw8u8nxPm5+eRTqfRbDaRy+WYhCldWLFY
-jN3QaZzE42Tw+XxMQRA4yIQoSMmyDMMwBnaTX3Qv4mLrIh41HuG38Ntoui3MurP429LfhoCnDYed
-e890gw4Gg0wDoFqtsqBIPyPou+G6LhqNxpGlVwBdJdtJoPfuLdeTOU+z2cTm5ibrGqcsm8YhZ2Zm
-kE6np2poclxI751EU3rp9BOYNmQOUygUmOkNAOYM108+2bIsNJtNZk5Sr9dHOvf9XkMQBGQyGezv
-77NATpK0HmeDZ3+FeIwM3eDi8Tja7TaazSbu3buHYDDYlYm5rntsgxEqBXriDMMRRZFpeNM8fqPR
-YEGJ9MEHdVDP6rNIGklEIpFDN+FgMIharYZyuYxwOAxVVbtG+RRFQSgUYiVT27ZZIKfxQUmSkM/n
-WSPjsOy1c3EwLr1l42HOauRBnc/n2eSEoiiYm5sbquX/LPH7/cjlcgNlXSftzB9GJpPB5uYmHMdh
-FQhSYzNN89A12ukVL4risRoPRVHE/Pw8bt++jUQigZWVFWxubmJnZweGYWBmZmbsBYHHyXD2rhaP
-kfD7/UilUlhZWemaAXYcB4FA4FjBu91uY21tDZ/4xCdQLBZx79491unu0U02m4Vt20zEhrr/ydyj
-1WqxANwrN0ldveRM1osoikgmk9B1HYVC4dACgEYKSSwnFAqxKQRZllkHfCwWY0YmwyCJ0V5J06PQ
-NA2FQgGFQgHAQeCmMbFBdGrC37hxAzdv3sTs7Gzfz0HXdWxsbLAmwGfBsLlpURRPtJRMzYpkFnP5
-8mVcvnyZTZd00jlbD4A5DR6HZDKJxcVF8DyPRqOBpaUlrK6uolQqYX19/diaAx7Txcu8n3Pm5+dh
-2zZ2d3fh9/uZq9CowZtGnJrNJur1OnNA03WdBZ7l5eWRnOEmtVJ8nlhaWmISoJQZdZq3kEJVLBZD
-o9FgQR44KC3T7wCwfXJq8KL/JmOKcrl87BsxZdVHBRlqwBqHTklPOuajmsvo76IssTNrd10XpVKJ
-9XZQT0EqlXpmzoSKoiCVSrFxt15OsrxPErG2bbOxREVR8MYbb+Du3bvseqOqTzQahc/nY/vfo3T1
-90KStisrK3j06BH29/eZJ7hhGNB1HfV6faLROI/p4AXvF4BsNotHjx4xkwJJkkaySCSzE5otpzll
-27axv7/PMqjHjx+z8SbLspgbWaVSQb1e78oMV1dXz8R+5UlDHsr3799HqVQ65LrWeaPXdZ19RpR1
-0+8bjQba7TYTLqGFk+u6bDTwOFUUTdOYQMtRimnUdCcIQpckJ416DYIWLfReVPUZBpmWOI6D3d1d
-AAefD70Gaes7jnNomuJZkclkUCqV+v7uJMvmANg13fn9kiQJiUQC29vbzF2MmtUMwwDP87h48eLY
-e9SWZeHu3bt4+eWXIUkSgsEgdF1HLpdDPp9nQlHeCNnZ4MW/y54DeJ5n+9605zpKgwk5CIVCISb2
-QFrn9FrAQYPW5uYmgIMLfH9/n3Uz27bNMqSz0mh0mly5cgV37txhgY6U8ToVxKgkTc1swFMN8Wq1
-img0yhoMNU1jfQcEBdZxoHNDzWzhcHjgvrdt2zBNE36/H+12GzzPM/ldmrMmSqUSC9ok90uNaKPY
-fcqyzHoBDMNgAYjneVYmpu8vfR7T6ICfBJp/puZQOi5qLDzJ0jlpjfd+tgsLB5axjx8/hmmaiMfj
-bCtmdXX1WMf05MkT2LbNKiexWAzLy8vY2dkBcKBNT8Y1Hs+e81HjfMERRRGZTIbdEFVVxe3bt1kZ
-tF6v4/79+3j06BHa7TaAg2yHAgo9hrK8WCzWVUIlsQ+/389METiOQygUQjQaZTfkQCBw7vbDOI7D
-/Pw8RFFEoVBgmRB1nANPdeEDgQAymQybXaZmr87sTZZlCIKAYDCIZrPJgtc4i6LOc0ABtjdw03uq
-qgrTNJFMJtkirtVqsZnvdruNcrmMQqGAfD7PAhl1lHMcx5TARs3IaKFCXvLkbEd/I8kB02d3Frqc
-+1l8zs7O4v79+2yhcRLQ1ko/3YZYLIbXXnuNGQcJgnDswN1sNrG3t4eVlZWuRWcwGIQgCJibm8OV
-K1cQCoVw9+5ddh/xeHacrzTpBWZpaYm5hT148ACSJOGLX/wiZFlmjUQcx6FUKiGbzUJV1S4hB5Jc
-FUURzWZz6A2gV1CCbtqVSgWpVOqQeMmLTiwWY6M55IdNXss+n485Z1EQp0oJZec0BkS/A8C2Mair
-eJzMmwQ8wuEwK6N2Yts2c6cDwLJJKle3220kEgnIssyMKSjT7Ox4J8jycxxIkU5VVdZoR8eTy+W6
-Rh3PQh8FybtalsX27emcbG5u4tq1aydSISBp2AcPHuCll146NAJKCzXbtnHp0qVjBW7btnHnzh3E
-YrFDhkTpdJrtcauqikKhwDJ9z+752fLsrwqPqUCl7kwmw24s1BhFvsczMzMwTZNl4J3lUGo0Iv/o
-4whjiKKIt99+G9vb2+cuAydjCgpuruuiXC6jXq8PbOQjRSzaeiDovFEmOk5QoD1z0ufmeZ6V6gky
-tonH44jH4+yGT8dIMrv0M8qyB5VL6/X62GV9asajsn6tVmMLIFrsaJqGSCRyJoIEz/NYXl5mYjw3
-b95Eq9WCKIpQVfVEsm/btlllRJZl7O/vH3qMJElYXV3F1atXR9q26Ee9Xkc4HMa1a9cOVXio/+L+
-/fu4c+cOJElCIBA40WqDx2h4mfcLhs/nw5d92ZdB13U8efIEtVoNsiwjnU6j3W4z3+B+K/RJvZwd
-xwHHcdje3maltvOCJEmIxWKo1Wrw+XxwHAexWAyapqFUKg2cjSUxls7FEmmm08JrnHOi6zoMw2Dq
-WpFIBLlc7pDQyKBu4UQigWazyWw8jwrKJM153ABLHdQkDkKqZdQfcBZK5kQkEsGFCxfYKKYsy2yf
-fm9vb+re4oIgIJvNolarwbZtprbWe04m7fymRVw/isUiCoUCW8TRAm6YEJHH6eAF7xcQ2p+ORCLY
-2Nhgghi0Lzkok5MkiZXYgfHmWCnj43ke0WgUe3t78Pv952qkZGlpCevr66hUKrAsiznDAYc9mwnD
-MA7djKnrnGwZjwqgruui1WqxBrPOc9Yp4kIZ9FH758FgEI7jQFVVhEKhoe8viiJmZmZQr9fRbDaP
-LclLxxQMPtV053n+zG3BJJNJ9t/k6kXjWicRzCjbv3PnDtrtNh49eoTZ2dmpKihWKhW4rntoYsKy
-LBSLRaRSKcTjcWxtbcFxHNYf02q1jp3te0yOp23+AkOl0Ugkwkq0ZDPaL5hQUJckiQlDUCcyx3FD
-b+IkBhKPx8FxHEzTZC5VlFkdp2v6eYJKwY7jMGtFyqCB/uVv2tPs/Fw6P3cqX1Ng6A0OjuOg0Wiw
-9+x0hgKeKp5FIpGBojD98Pl8aDabTIhmGFQ1oP3145zjRqPBegGAg88gmUye6cUflftN0wTP85id
-nT0RHXaaic/n82i1WiiXywgGg1PZTiiXy3j06BHq9TpCoVDXueZ5Hul0GqlUCn6/n4nx0Dm+cOHC
-xO/vcXy84H3OcByH2Y72g0bESOxB13Xouo5Wq4VgMDjw5qTrOhOVoNehBpd6vY69vT0Ui0Xs7+8z
-6cYXMZDzPI94PA5N05jTEzV89QuEVK2g80GZsiRJSCaTmJubY93pNEvdGYB1XWdZfiAQ6Hp90jY/
-bgAMBAJMHe6ohjQ6/nq9Pnb2TXPeNHZGLC8vn+nRQ0VRmAAOmahMClVRehfL4XAYtVoNtVoNlmWh
-VqshEolMNKbWbrexs7PD9rVJTKizeZDK5TQBQJW5119/3SuZP2PO7pXhcSI4jjNyMxnt05ZKpSPd
-nXw+H8rlMpPpBMDmiykYGYaBer3ONJIXFxdfyAAOABcvXsT29jYKhQJ8Ph+bu+7cx6aRMhLAabfb
-bF+VqiWdkHhOZ0DTNG1ggBtmnKFpGgzD6AqY1G2uqipc12UqXbVaravTfBD0+FKp1FVeHkS5XIYg
-CNB1vWuLod1uI5lMPhcuVktLS1N9vUqlgrt377LxvqWlJbZ1QLK51Juys7ODcDh8rCBarVaZXzmV
-vjVNw9tvv413vvOdfcf+5ubmkEwm+/rRe5w+3hk4Z9DI2Lj0Nk11ZoAkmygIAvO5phJuZ4ZNDW3B
-YBDlchmWZeHSpUuT/1FnFNKHLhaLMAyD7eeSVSZ9XlTdyGQyyGQyA89PJBJBsVhkQjCiKILjuIHz
-1XR+qPmMIDUzSZJQqVQAHJT0aXuExttoL1fXddbE5roufD7focBKM+nhcBitVgulUgnRaLTrJk9K
-cpqmQVVVZkFK/wPAFALPU7NjJ6RsRt+BjY0NLC0tIZFIIBKJdPmLk2XouPvO7XabzaeHw2F2Xi3L
-QiaTGTqv7wm0nB284H3O6BTAGJXevVpqZFEUhQVkEgOhYERzwZ03786MX5IkJo/5IgdwsnKlzLu3
-e3qcEnM0GsXy8jJbIMmyjHq9ju3t7b77nxSIm80mfD4fC/oURMm7mTrGqT+hsxpCWyg0c07Pp/I+
-/ZvneciyzLznqeeBRg/J9KRUKrGGykAgcGihYpomEonEuQ0S4XAYFy9exMOHD1m/xN7eHnieRzKZ
-RC6XY48lj/Rxg/fe3h50XUcoFGLn0nEcRCKRqVcSPE4OL3ifM8i2chz8fj8ajQb7tyiKTHXNMIyu
-Bql2u82ESkqlElqtFlvJk8gFAJb5UZf0STT6nBU6M8tJSSQSXV3BPp+PzRn3C3iKosAwDORyORZg
-Ox2nqDpyVPNTZzbWbDbRaDSYJC91spPqFs27G4bByu5kY1oulxEKhfp+HrquI5FInPtGKArg6+vr
-8Pv90HUdW1tbmJubQyqVYhalruv2VV4bhK7rKJVKqFarSCaTbMuG3OdWV1c93fLnCK/j4Byxvr6O
-Uqk09l5iPylE13Wh63pX5kg3EkEQmM0k3cA1TWNNW1Sio8xd07TJ/rBzDM/ziEQiLIMmIwtVVVl2
-TDfkQCDAnKcmgYJzOBxmblf0mp3BhEwsSHq1XC6zBUQvpK1+XsvlvUSjUczNzaHVarHm0UKhwIRt
-bNsGx3Fs8XsUm5ubuHXrFvb29lg1TNd1tmgWBOGQda3H2cYL3ucETdOwv78/VgZI410+n491NRNU
-ju3U5ZYkiemrA0/3UYvFIrMXNQyDNSpRJl4ul8+dIts0oTG9er2OWq2GRqPBHLoajQaq1Sp4nkcg
-EOiSTj0utPjqPWeCIAzVvCYZ1F5Iv/3ChQvP3ITkLBGJRJivu6Io0DQN29vbbPQSOGg865TX7cQw
-DKytrTGrX1pokXmRZVlsG0eWZezt7Y19HW5ubqJcLk/2h3ocC69sfk7Y29tj86ijYBgG25+0bRu6
-rjNJVdq/jUQih7pOSS6SupVJNCQSibD3JkMO4OnedzQa9QQfjgk1LVETYSQSYSXVSCTCnKI4jmP7
-m5OgqipTGevkOFsfuq4jEolgdnb2TMigniUURcHq6iru3r3LJFJJDMlxHMiyjFqtBk3T+vZOPHny
-BJubm0yERdd15vVNRiYEZe/lcpmp85XLZfh8PvbajuNgbW0NgUAACwsLzGGwUCiwhYHH6eEF7xcc
-y7KY6peiKKhUKgiHw0eOelDwJdlPyqpIFrHzou4kFosdEtzopfO9RVGEYRiH9Lc9RkfXdWY0Qk1g
-kUgEqqpC07SuJrlxFnD9oOf3nluaOBhnppyObXV11ZsZHgDHcYhGo9jd3YUoimw7iqxIl5eXB15n
-tMgiDXZd1+H3+5k+e+diia739fV1xGIx7O3tYXt7G4FAoGs0rNlsIpPJsP+miQRqePQ4Pbzg/YJj
-WRZrLgIO9kgrlQoEQYBlWQOFHsgLmi5wamoBcKRS1zglWcMwmMCIaZpju1OddyjbTqfTXZkvqbH1
-y44naQ7sJ+cKgJVxRw3CrVYL6XT63DenjUI6nUY+n+9q7KQmUrLw7YX2xCORCFP7Gybfqmka0uk0
-FhYWUKlUsL29jVAoxNzvqDS/sLDAFoM0Y95pouNxenif+AtOPp/vmvOlMR3btpHL5VjZrd8NoFeO
-8yTKmlRmv3fvHhzHwdLS0sAxIo/D0Ghev3ND1ZLe303SUUzz+/1+PmrW7XWVj4csy1hcXMT29nZX
-T4AkSQObPalp1LIs9pyjFla0DUaaDa+++iort7daLYTD4a5zT6OgoigyQSfXdaFpGtNxiEajQ/0U
-PI6PF7xfYGjful9ZTRAEJpJh2zYajUZXxhwIBNi89kmWwzq7j2u1Gh48eMC6l2dmZhCLxbxsfAg0
-u90PSZKg6zr7NwmtTGpqQeNfBN3ga7Xa0ABOWXskEvG6yscklUqhVqsxz3jgqZRqLpdjpexOZmZm
-sL6+fmRWTMJNFNyr1SokScLGxgZUVYWqqnAcB+94xzsOPXd1dRWlUon9++HDh6jX62zLLZfLYX5+
-HvPz85P8+R598IL3C47run3LnM1mE4qiIBwOM6lMoFs5TRCEiSxCxyUajbLSoGVZ2N7exu7uLi5f
-vuzNnw4gGAz2Pb8U0Kl7mAJ3r3PUOFCzGzUcBoNBtg9LjVTVapXNf/eSSCSQz+eZcIvHeGSz2S69
-BfqM9/f3+wbvaDSKSCTCrvVBmKaJ1dVVpoxIlbpisQjbthGLxbC8vNw3ew6Hw12LwUQiwe4npK7Y
-ecwkOkNbdpFIxMvKj4kXvF9waNyrswzdarWYrjXZRBqGgb29PeZF7fP5YNv2qXeA0zFSOa7dbmN7
-exvBYBDhcJgFDI8DwuEwQqEQWq0WZFmGruvsZtkb1Pu5ko2DqqrgOI4ZV3QGBCqhapqGRqNxyN2M
-yqmXLl3yVLyOCcnrklMc8LR0/vDhQ8zNzXVV2WRZRiaTwaNHj4a+rizLrOxdLpeZaiLZCC8vL4+8
-2EqlUkilUnjw4AFKpRL7nriuC1VV8fjxY+i6DkmSmBdCIpFg/z8OqqpOVQDpecO7C77A0OzsxsYG
-s+Msl8tMAa0zOwqFQsya0nVdlMtl5ic9LfJcHg+4+8hzeZichYgbwQX3Aq4714f+DeVyGbVajVma
-yrIMQRAgCALm5+fPfZfr4uIi7t27x7p+ab+T4ziEw2E2GjQNb2wSgRn0WmRMQ3aZfr8fsixD0zTM
-zs565dMJmZ2dxf3797uuXVEUUa1W4TgOrl692vV4akyljnMyNeksvXdW51RVZeePtswKhcKhBVe9
-XofjOBAEAevr67BtG+FwGPF4vEu9TRRFuK6L3d1ddoy9wk47OztoNBqYn5/H7OwsW0gcxcbGBur1
-Oq5fv36mrWNPCs8S9AXnyZMnrNu8Xq8zb+fesiZ1JpN3cLvd7mtAMS51ro5fk34VHxP+BCUujyQX
-xwouYBHz8EPBDr+NPxL+CJ8QPgEbDhbdxUPHRTaFVKIlje1ms4lKpQLTNA9php8nSOK0Uqmw5rVw
-OMymAijrnbRUTYGA+hQGZTz0e+pQlmUZrusiHo+PbRfq0Y3P54MgCMjlcqwJlaoetm0fKp/Lsoxk
-MolIJMLU2ugaoqAei8WYC5xpmiiVSl09MZqmdb2ubdv4whe+gL29PQQCAXZfaTabKJVKmJ2dhaIo
-bHyR53m2D977naFFOGkR7O/vo1qtdmlEDILm0R89egRFUc7dd8vLvF9gyuUydnd3Wcep4zhHlsGp
-zE5iDpPwAfEXoXFtvNv5a+BwuHM8gjAi7lVccw+yhbv8Pfy08FP4eusbcNG9OPB1qWyuKAps20ah
-UIDf70cqlZroeJ9nUqkUKpUKm7cl21Ge59FqtSYWZgHAlLlkWR5pURcMBtFqtVCr1ZBOp9nN1mMy
-ZmZmUKlUoKoqW5ANWsDS7H8gEGDd4q7rol6vY2trC5FIpEsuN51Oo1wuQ1VVJJNJVoHrbGgVBAGv
-vPIK66GYn59nfSq5XA6CICAajbItLhpXHdR4Sn02oigysaGtrS3mLjczM9P3ebQwkCQJjx49QiqV
-Old6AV7wfoGpVCoIhUKsOzgcDg81JSEVNQryx+1KbqGFn5N+Fn/J/QqkndED6nX3Gq671/AH4h/h
-S86X8I32Nx75HKoWbG5uotlsMkGZ86jWdvHiRaiqilwux25sVLYcxV/7KDotXUcxt6Esr9VqneuF
-1bThOA7Ly8vY3Nxk2TRw9CgnBU8Sfrlx40bfvgjqPo/H4yiVSmg2m3jy5AmuX3+6vRUMBlmm29mn
-QtsiHMfhypUrrFqzu7vLmiY7jwV4+r3qPIZAIABN07C7uwtJkg6VxW3bZp321JtDqnHnpSfm/CxT
-ziHJZJKN5mQymaEBzTAMVKtVBAIBJBIJFgTHpY02fk76WbzH+Uak3ePdsL/a+SpYvIFfF//dSI+n
-5ppisYhHjx5ha2troN7ziwzP85idnYXjOAiHw0gmk5BlGYlEYipTA6IoQpKksebvOY5DOp0+l3uS
-J4nf78fly5cRiUSY4c+4I5X9ru92u808CEKhEC5evAhJko5lZkOvX6vVsLi4iOvXr+PSpUvw+/1d
-1+cgV0FFUWCaJhqNBqsGPnz4EOvr6/jkJz+Jx48fQ9M0LC0t4fr165BlGbdu3UKhUBj7WJ9HvOD9
-AiMIQpfT17CbLjW0Tdq5+XPSz+A9ztEZ81G803kTFkx8nP/4SI8XBIHNh7fb7XNrdJJIJOD3+7tu
-erVaDYVCYWL3Niq9j5PZkIynx/QRBAHLy8sIh8OwbRsbGxu4desWdnd3uwxixrEN9fv9uHbtGm7e
-vAlJkpBIJPDKK68ce0Kg0Wjgzp07LOMOhUK4dOkS05cAwBYf/aCRtdu3byOXy6FSqWBnZ4f9XRcv
-XkQymWTNeD6fDxsbG+dCbtlrWHvB0TSNeWcPgpq/FEWZKHh/QPxFvANvIIjpNI4sYREfET6KL3Pe
-NdbzSBpyGt3Vzxskf8vzPMLhMBRFYXvgZMNKOI7DGoVGgSwoad97FMiBLBgMntuRnpNEEAQkEgmU
-SiXW21KpVFAul9no3uPHj1kTGFWphtFp8QocLYc8jHK5jFarhfn5efYaPM9DVVWm5EZSzP2Oi8Yb
-6f5Emg/RaBTz8/MscBOyLGN3d5ddBy9yxccL3i8woigilUpB0zTWEdoP0zTRarUm+qKrnIrPCX+K
-19xXj/0a/VhxL+B3xA/hdeeNkZ/DcRwcxzmXDVIcx0EQBKiq2lUWpYpE5zx2pVJBs9lk2tSjbJPQ
-c2nWe5TH1+t1xONxT5jlhCC9esMw2LkxTRO1Wg21Wo2Ng5E+ejAYnFjjflQCgQAikUjXuW+326jV
-atB1ncmx9i4qqOGS4zjYtg1ZlnH58mXIsoxQKHSo0Y5QFAXRaBSyLGN9fR08z7N58hdtL/zF+ms8
-+rK4uMhsOvtdsCTKMgm/IfwGvtr5qoleox8++NDG+PvX5znLI8OIXqjJx7IstNtt9rhWqwVVVUda
-vHEcB9M0B+qp94Nuth4nRyaTQSQSQbvdZlaeNDlCwTEYDKJUKqFWq0GWZczPz7PqlK7rbN6b5rxJ
-XKVSqRwSUKEFwVEZOfXcdEKVAWpmcxyHBVbHcdhWi+u6TKnNsiw8efJkJD18+pveeustuK6Lt99+
-G3t7e7hx48bAa+N5xAve5wBJkpBKpbCzs9NXZlSSJLTb7YlcvepcFYI7foPbKLzhvoaPCB/BV9pf
-OdLjbds+13KqiqKwcmRnNp1KpdBoNGDbNoLBIAu+HMd1aaAPolqtguM4pnzXbrf7err30qmb7XFy
-kOlQZ6BtNpuo1WpoNptot9ts5p5Gzd58803s7+9jZ2cHlmUxJ7F8Pg+/389069966y0IgoDt7W2o
-qopGo4FQKIQbN26MdYy2baNarbIMmdQeaTvHMIwut7nNzU2USiVmZ5zJZEZeNNK97OWXX8bGxgby
-+TzW1tZw8+bNF2Jx7wXvc8Ls7Cyq1SprTOtEEAT4fD5Uq1Ukk0k2LjJqmanElZBx+89iToN5dx6/
-z3945OBtGMa5DhaUGfdrFOs3/qfr+pENfo1GA47jsMBgmiYMw0Cj0WASu4OqN5qmIZfLYXZ29hh/
-jcckdI50Ebquo16vIxKJgOM4VCoVJj9MTnTZbJYtzmKxGCqVCgqFAvb39xGJRJDNZo8ljCQIQlfA
-dxwH9XodmqaxSkE0GmUVQjJksSwLruviS1/6Eq5duzbWGKvf78f8/DxarRZKpRLy+TwWFhbGPvaz
-hhe8zwkcx2FmZgZbW1t99zYVRWEKSZSJpVKprhtyq9Vie1C0bwYAD7gHWMbyiR6/jqMzQ+DgxhSP
-x/saNZwXaNZ1mH9zJySZ2Zupd9JbkSFVN57nUavVmKpav22ZYdaVHqePz+fr6ge5efMm21L73Oc+
-B1VVceHCBbz00ksADhbDJEWazWaxsrIytQkCnufxjne8g6kASpLUlVmHQiHE43EUi0U2pnjnzh28
-/vrrY2XP+XweOzs7SKVSaDabUzn2Z835TU/OIfF4nJkN9MLzPNLpNAKBABRFYaYlAJiMIjU3aZrW
-dZPOc3kk3eO7VY0CP8JXlaoKy8snu5A46/A8j3hSL9GHAAAgAElEQVQ83jUuNAxStQIwUIltkDsd
-Zdyqqg4czxFFEU+ePOmyEfU4W9D1/NJLL2FhYaHru2MYBizLwtzcHK5evTr10T9JkiDLctdWTidL
-S0vIZrPMpUzTNNy6dWusEbilpSW88sorCIfDzOr4ecfLvM8RgiAgm81ie3t7YImTSmyNRgPlcpm5
-Atm2zUrqpVKpa3/c4qwT2+8mjuqLpczxypUrEzffvQikUikUi8WRH+84DhqNBgvAZChCn2W73R6Y
-lVMzlG3bXdl+ZymUmuXOswb984DP58Pq6mrXz0KhEG7evDnSNprjOMjlcmMrNJZKJTx69Ag3b97s
-G8Dn5uYwNzcHx3FQKBQgy/JY/TmkxS/LMorF4lTkgp81XvA+Z8Tjcezu7h5ZUiVPZpJf7FxtU+mc
-Lp6IG4HKNRF3T26u2sbwi80wjCNV5M4b46iqRaNRFnxp1K5SqbARHjKu6UXTNJimCVmWUavVoGka
-a5ZzHIc5kA0ryXucfUbtf7FtG0+ePEG73cbCwgKy2SwURWEz3YNK3TSHblnW0NfneX6iLbFgMIg3
-3hh97PQs4wXvc4Yoishms1hfXx+6MuZ5ngXs3uYnMpwwTROKouACfwFr3H3EcXLBe5Sy+XkUZRkE
-+TKPCt1UDcNg2vDk6W6aJvufYRiIx+OszNppz6ooCivX0/53ZxY+avC2bRt3797FzMzMQFMKj7OF
-4zgoFosolUrgeR6hUAjlchnlchmSJDGjo1deeeVQZazVaqFSqUCSJKiqemxPhfOGF7zPIeQcZBjG
-SCvq3gzO5/OB4zi0221UKhXM+Gbwh4kP4yWMNzYyKjZsJIfopLdaLSwsLJw7S8BB1Ot1lEqlkRt6
-OkV8TNNkN8/OBRuNB/U2pLXbbbYfTr/rV/ak2fJRaDQarHnSC95nF9M18bbxNm41v4SHlTXkyjn4
-ZB8CcgCL/AKucVew6C6yak4oFOr7nWw0Guw7VKvVvKmEEfGC9zmE53nMz8/j4cOHx1Yd6vRzLpfL
-0CwNpmsOLK9Owqe4zwwcE6PRkvPcXd5LsViEaZpHzsOWuBI+Y/8pvmTdRVmqwuYc2KIDTgM4nYMo
-CPALClJiAq8Gb+I6fxWyI3eJ/ViWBb/fD47j0Gw24ff7+27HSJI0UqOTbdvY29tjs+SqqnpbIWeI
-B+YD/JvcB7Cl7oLTRSi1CAJqGGYVUPjZg0U9XHxefoz/FPw8jLAK2SfghnQN//3yD/adRiC70NNQ
-fHuR8IL3OYXEGo6CLDeHkUgk8C7ry/El6TZumNenHrzzXAFz7lzf35E63Hme6+6EvJMHBe77/H38
-TuvfY79ZglOU4NuPQ64HISIIpc9CzgVQAPDByMdhzv97KDEOF6wFvEf4BsTMGHN7CgaDUBQFjUaj
-b1MaiX0cxdraGqrVKiKRCJNt9Xj2/F7j9/H/5X8HrV0Hsa0MItw88wmvNQ+mCCj4cuAQMqIIGVGg
-cqAJUIgb+B7+B5CNJvBDc/8Ys8LT7LrVarHRRsMwkMvlvMX4CHhXxjlFURSkUikUCoWhamS0z3kU
-XyF+Bf5P8adxw7w+1eakT3GfwV8eIs5CM8oeB5CYSi+/bf8uPtH4LIwtGfGdeUQ7+hNM1zwy64nU
-k0A9Cdd1sWVp+PGr/xKhtIBvi34DLquXoaoqYrEYms3mwGbIo8ZzSKyDyvZUavdcyZ4d9837+N+f
-/BScJwqCe3OQDAOCKMB1Xdb3Qnrq/XAc58A8RUwgtTsD7AL/beWfYCU1h5+Y+3F2byFNfk3TsLa2
-xkZXT4uNjQ34/f7natHgBe9zzPLyMjiOQ7FYhCzLfW+44xgYfLP1Hvw2/0F8A/d1Uzm+BlRUuCpe
-dQabnVBntMcBhmF0fR4fcf8Ev1/9Yzh3IojWVybyeyOtaThAeu0i+Mc8fm3hDxC88GH8TeGbEHWj
-AwO3ZVlIpfr3LVC1YHNzEzzPs3PabrdHytY9ToafzP0f+GLuPpZ2rqPVaqFttNmECU2cjNo30263
-WZKwuv8y2oUWvqP5Xvw3M++DYApssU8LtWazeWrB23VdlEql5277zQve5xiO47C8vIxQKIQnT550
-aQwTo5gPEEvuEuatRXyc/yS+3D6w8ZwkA/9j/j/iB8x/NPQxo4yXnCcqlQpEUYQJEz/R/GeorTmI
-7a4e+TyyZRwGGVwATz2io9tz4J5w+H8u/SouZWfx99y/e+h5hmEgHA4f6iK2LAvFYhHVahWqqrLO
-dXqOz+fzyubPiO/f+sdorfNY0V9GUzvQRe+dqx7l2uZ5HrZto9lsMkczAPDbASyt38RPFP8F3vS9
-jG/BN7PnkG7AacFxHBKJBKrV6rFfw7Is7O3tIZFInNqxexuFHkgmk7h69SrC4TBTUyJorGPUAPm1
-ztcCOoePcH8CwzCOVdJuoIHf4n/nyMBNvAgmA9PAsiwYhoHPc5/HD+b+Z3AfyyK2279XoBO6CQ/S
-N3cch416+Xw+JuDC8zw7x4k7K9j8eBs/yf0U6lydPZfcqhYXFw8tAvf397G+vg5N0+D3+7uCgW3b
-yGazA7N1j5PjfRvfB/FhEpFKAoVCAaqqTtRTQnK9zWYTqqqyypBpmpjbuIzPVe/h37q/3vWcVmt8
-J8FJyGazzIZ0XCqVCj75yU/i3r17p5pIcK63YejRQb1ex/b2NtrtNvx+P5MSHFcZ67P8Z/Ax50/w
-bu6vIcyPPrf5Ke7TqHB1vM9830iPbzQamJ2dPfeSqMQPf+ZH8PHdtxG/vcKqJpQt06Xuum7fWVtq
-TqT9R3oeaU73y7R0XWcz3dSFXn3HGr4n8XdxybmEYDCImZmZQ98f0zRx+/ZtAId104GDzPvChQsT
-ecx7jM/3bn4/Ag9ngRbHHOhG9XofBdu2wfM8IpEIms0mdF2HJEnYnXmEv5B+FV/LfQ2rpr322mtT
-ec9RGdULoPPx5XIZlUoFlmVhYWHhVGfUvZqURxeRSATXrl3DvXv3oOs6u8DGDd7vdN7Cq8Zr+Hn8
-a9gBC6/hVSy7S30fa8LEp7nPosAV8Vfsv4qbzs2x3sub7z7gn+//ND678QCZzavgfFxXJt3Zt2Db
-NtOnJ1lZjuNgWRZ4nmc3MfrvQYG797Xp/8OfXsHPvvkr+JE3/iFeS/S/AZMC2yApW0EQvMB9yvxP
-uz8KPA5DcfxomAez14PMZo4Lqe9RiZq2RebyF/GffJ/F1fgVXHIuQRCEiSyKj8O41YWNjQ3kcjlw
-HIfXX3/91GWZveDtcQhBEHDp0iU8fPgQrVYLfr9/LItQQpZlfFvhbyCKKD7j/zT+A/+HaKMNDhw4
-AA5cCBCQclP4K/Z/iaybHftYA4GANwcM4GfzP49P3LqN2dwVtJwWUz3rB8/z7FwahsEybQDshk0B
-nKRR+9GvUdCyLEiShAvrb+JfRv8NMuEMrkvXDz1O1/WBjYaGYSCZTI70d3tMhz9u/kds7xaxaF6G
-pmlMzvQkZq8HfS+Xtq/j/b5fwY/y/yMURTnVwH0cFEVBIpFAOBx+Jn4KXtncYyCNRgMPHz5krmKj
-dH/qus6aj2RZhqqqbAb4JLBtGy+//PK5nvP+k9bH8NN/+guYeXgFruuiUqmM3GhI3cK9j7VtG5Zl
-Db0p9T6GSqykiw8A5Tcf4Jde/Rn4ue65c8uycPfu3b7HqKoqrl275pmYnCL/1YP3YnnjJmzbRq1W
-YyNep01basJ3ScN3W9+J1dVVT/J4COf3judxJHRTJ+/uYSNZlmUxtzHK3NrtNjRNO7FV6bO6wZwl
-Wm4L/+rez2Pm4RUAB6VrWZYHNp/10qmW1gl9rqM24FBlJhKJdGVMiT+7gu99cLjxkPZRe4/TdV0o
-iuLpW58i/+vuP0XwUQatVgv1ev2ZXld+M4gnah5NuYkHDx5gd3d36u/xokyneMHbYyAkdUlNJsMy
-uWazyXzAw+EwotEoAoHAiZa+TNNENps911n3D6z9EJKfv9r1M0VRpvKZdBqT9KNzMcfzPAKBQP9M
-+vMy/rfdf9b1s1arxUxQen+eTqfP9Tk9DRqNBkqlEjY3N/Hp7c/BKR189oN820+Tpe3reL/9ywgG
-g9jZ2UEul5vaa9u2jc997nPY2NiY2ms+K7wrxGMoJLOpKAqazebAx/W7wZPn7kkY35umCZ/Pd673
-Rn+z+kGU7xyuhoiiyOQmR2HYviZlx/1216iZDXjqp96PRDODT2/dQskuscfu7e31zYBEUfR6GE4Q
-13WxsbGBhw8fYmtrC79Qfj+iu7OsKfGs6IsX2hUAYOOI00IQBESjUezs7JxIVn+aeMHbYyikN8xx
-HAvCNE9MwYH2Ovs1tCmKciIKaBzHDZV1PQ/8+taHkCou9P2d3+8/snROHd/DEEURHMdB1/Wu17Ms
-q8vykx4ziPTtq/gnG/8LgINxxGKxeGg7xXEc+P1+RCKRocfkMT61Wg3FYhF37txBqVSCz+eDLMu4
-7d5D1Eg868M7RGx/Dh/C78Hn86FSqUz1tdPpNHw+H3K53FSz+tPGC94eQ1EUBaIowu/3Q5Ik6LqO
-RqOBer2OarWKarWKQqHArCF7cV2X2TvWarWR92KHoes6LMs618H7Z/L/GtztwaNU1DA4KDjTuNgo
-JVKfz8ekUWnun3obCJ7nYZrm0PO7t13DprXJPJ97S+PtdvtcV1JOCsdx8ODBA9y9exemabLmUQMG
-jNbZ7FeO6DF8wfwigIMtuWmWuROJBFZWVpil8fOKF7w9joSCsizLKBQKcBwHqVQKwWAQmqYhlUoh
-Fouh3W4fKp8HAgGkUimEw2G4rot6vd7vLUY6BsMw0Gq1YNs20un0c6VDPG0+mvsEYq3B6mNU/hyW
-WYuieKQ6neu60DQNoiiy8Z1+3ekAugRh+jHz6BL+xfa/Yq/bi8/neyYjNy86rVaLVao6e1A+gU8h
-Ujo9849xaekak0rd39+HqqpTe+1kMonXX38dFy9enNprnjbenLfHUFzXZTdaRVGQTCZZedTn8yGb
-PZjNppJ5vV4/NBrG8zyT06xWq9A0bazRsVarxfa3JUlCKBQ61/uin9Y+A/Px0UFOFMWJO2t1Xe/a
-EiGjmn5d4p1l9EFs5/OIXoqiXC53/Zyc6LzxsOlTr9fB8/yhhdEX7S8hpp1d+VlJDaAQLiAtHJS5
-p91Id5Tf/VnHy7w9htKZTdm2jXa7PfAG7ff7EQwG2chJb6MJZXqqqqJWqx353qSzHovFcPnyZSwt
-LWF2dhbhcPjMNNY8C35l998hVVw88nGu607Ub0BCHb29DP2y+lHfR36cwof03zs0hWCapjcedgKY
-pon9/f2+/SgV5/hGHKeB0gzjER4DOPh+7ezsPOMjOlt4wdtjZMgsYFhDEakOCYKAVquFWq3Wlf1F
-IhEoioJ2uz30vVRVhd/vx6VLl3D58uXnfpU8TfZqhZEe5/P5Bi5yjmpWo+rKsEyaqjKmaUIQhJEa
-zaKtJD5a/s9dCzuSZz3P2yAnBS3g+mWthtN/BPCsEDTCeOI8AXBwXyH3OY8DvLK5x8gMk9zsJRgM
-wnEcNJtN1Go1xGKxLgnOYYHDtm0oioILFy6cmDLb88q6tQ43N9pnMqw6QYGXZFDJHaxzzneQNGrn
-VgoARKPRsTSwVV1HJpNBLpeD67oIhULIZDLeuT4BOqVwezmJKZBpIts+1F0V+POvFcdxyOfz53rL
-rBMveHsMhQwCZFkeOsvbD57nEQ6HWZNbZ/CmEny/jFrXdczPz3s38z78ceUjCOVHazI6am6XgjbP
-83Bdt2s2fFBTGjUOUvCORqPj70WWZMivyXgp9RIMw/AkME8I13Vx7949NBoNhEKhQ82JLs7+1pOL
-biGgs77gOE28srnHUHp9lse9eHRdh8/n69rjtCwLoVBo4EJAEASvTD6AO817UMzRRuR4nocgCH07
-u6mXwbIsFrgFQYAkSUNdxDo9j48rniEVI/hs888QCAS8wH2COI6DSqXCGkZ7OettIxZvwc89/a7r
-uu5l3R14wdtjKJ03/6P0zfthGAZM00S9Xke73Ua9Xu/yfh70HNpf9+imoh3d6NdJP/1wgub3x/Vr
-pu/DoOz8KKLtJL6k3h77eR7jIQgC5ufnB+ohSPzZLry2JRWz3NM+CJ/P5zU1duAFb4+hNJtNJr6h
-adrYmVI4HEYwGIRlWdA0Da7rMhOLQT7csix7JfMB6OZ42a6iKGybojMDp8XTOH0MwEFAIHUuv99/
-7K7/kvH8imM8T0iS1LfyAgAR4Wxnsa1AHRe51a6fjWtL/CLjBW+PI+nUNT9OpkUd6PH4gSJYKBQa
-2plsmqa3tzUAyx7vcyGlNU3T0G634TgOHMcZq3ehs1QOPN17nGTutm1PX+/e4zCSJA081xf5FbSk
-wX4Fzxo9rGLJXWL/9tyru/GCt8dQKGiLojix+lWj0QAwXByh1WohEol4e96DOMb9i5qVZFmGaZqw
-LIuJ5hyFaZrQdR26rrObp2VZUBRlonPkuN7i7DQgadt+fAX/5ajG90/5iEZH9j39frZaLUSjUU+B
-rwMveHsMJRqNsmxtkmzYsqyRGk4EQUAmk/EaUwZwnCq1KIps35OC+ChZs23bsG27q9nJsiy29ziJ
-UI7AnW8f9tNikGEQAKTdNJzwYDOZZ4nFm1iWDoSIXNeFLMtIp8+ulOuzwAveHkdC+6XDXKOOolwu
-wzCMoSILtm3D7/cjkTh7LkdnBUE8XtCTJIlJm44D9SjQtIAgCAgEAhMr3AVEr6fhNCAHwEEsynOw
-uckkdE+C/cw6vln4RgAH1b9sNuu5zfXgBW+PoXQ2mE1SJhUEAclkErIso1wu9zUoabVaSKXOrtby
-WcAvDTcSGYTP5xvL4xsAGx2jbnRycpu0acjhbMzIXhZ1GpAIzyC+Xfxb2Jl/eIpHNBpKhEfCTcB1
-XW9BPwAveHsMJRwOw+/3w7KsiRqUSOnJ7/cztbVyucyCSavVQiwW8y7SI0gqx/98/H7/2FsfFLht
-20YgEJjKFEAtUMJr4Vcmfh2P0Rh23UbcCBJDtqhoUoH+R//ubWKcJnupDXyr75sAHPTJZLPZQ1r4
-Hl7w9jgCshEURXGisjnwtFuU53nmPFYul5mQSyaTmbpz0IvGa+GbaPqOZ6sqiuKxyt3kAT2tPgRr
-RsWbgTem8loewzEM48gF29+XvhtbS3fYvylQkyeBz+dDNBpFLBZDLBZDJBJhVZyTmArxJR3ccG6w
-ShxNqXh04wVvjyM5Tsm1l149bODpwqBeryOTyXgX6Qj81ehXop0tHeu5pmmOlS2R6Qi5xU0LIW4i
-znvn+jRQVfXIrDXiRnA1tIKCvAfHcRAIBBCJRBAOh5FIJBAOh7t83GVZRjQaRTgcPnRPMM3JzE62
-lu/g++T3QdM0hMNhLC4ueln3ALzg7XEk5NMsiuIhH+ZRcRynb9bHcRxEUfQu0BHJClkI6ePdIDvt
-XTuhEij9z7ZtFuhDodDULVhnIsmpvZbHYPb399FsNvteW3SOgYNF2reo3wzhkoZ4PI5AIDCSUBIt
-6ju/N/0W6SMfb3wL7wq9gaAeRDQaxZUrVzyxpiF4wdvjSOhGPupscD94noemaYc6X13XxdzcnLfX
-PQbLsfljP7dzr7LzBt4Z2HmeRyQSYTfyaVIM7+LrZt491df0OEyr1cLjx48PLbo0TYNt26wZkfav
-s9ksfv7K/4vt1fFka3meh2VZLAM/ygxnEFWliETWh6/WvgqBQACrq6vHvteMQ6dd8fOGpzXnMRRy
-kRJFkfkuHwdFUcDzPCRJYl7elmUhkUhgcXFxmof8wvPeue/Ajyz8c6SeXBjrebIsIxwOo9lswnEc
-yLIMSZK6Rr+O6k6emIsN/PXwV5/c63sAODjXmUwGlUqFLdBEUUQ4HMbS0hLLaGmShPinqz+GH3Z/
-FBc2R2so7LSPpet63L6Vmq8C/kIL3+f8AERFxNLS0qkE7lqthvv37+PmzZvPpSiUF7w9hkJ65MBB
-88txm9YCgQA0TYMoilhZWQHP87BtG8lkcqol2fPANeka/IsO8GT85/r9flZG7TfydZI3TZdzcCW9
-fGKv7/EUURRx8eJF7O3todFoQJZlJBKJQ7PSvd+BRXERP3nxx/HD3I9ieePmke9DjafVapVZy45D
-PryL0IKLH3B+AK7rYmlp6dQCabPZRLvdxsbGBi5evNjXee0s45XNPYbS6f5F+97HRVEUaJoGn8+H
-eDyOVCrlBe5j8p75r0cxdozojeGqWydJ4dpD/A8LP3jq73uemZ2dxZUrV3DhwoWRRU4WxAX84pWf
-Q+HKGnK+3aGPpZ6VRCKBUCgESZJGbmzdmr+L5cUEflD4R/9/e/f2W1d21wH8uy9nX881Ocd2fBwn
-cWInk0yHzAU0EmIKAt4Qqqo+IB6oKsQLEkIgAW+VQKhFqgQtKkUtTBEPfeRPQDwiVe2knTKdTDKT
-m2M79vG57b3Pvq194SFaa+zE99g+3vbvI1nx5RyfZef4/PZa6/f7LWRZhsnJyWNtxFKv12HbtliF
-KhoK3mRHG+s7eU/rV5HnORYXFw9pdGfXl2tfgnHjYOdpj0MqJ7jWnkFNro17KGQPFCj4/uXv4ubN
-Nh60P9z19rIsw7Is6Lq+a/DuWqtYnr+LPz7/h/ia/EeIogi1Wg3T09OHNfw94RexQRDs2PnxpKLg
-TbaVZRmePHmyKVP8Va9Q+d75fk61Ilv7s7k/QWf24biHsSeDNz7Dty59Y9zDIPv0F60/xw9e+2dE
-t57hwYVfIJKDHW+/00ramr2Mxasf4daVi/h7/euYz+ZF8tw48l5kWQZjDK7rio6PRUpgoz1vsi1Z
-lmGapkh4kSQJnuft+0zvjaIowqVLl6gZyyF413wXs9f+C8PlCFpyck9bWm8t4ktXKMO8qMpyGd9q
-/wOC6QDfmfguPnb/D5mroDaYQJ1tLvvjuSyqqiJHjk55GaNaD6Zewm9bv4kv4j0kSYIwCUUCa6vV
-GsuydbfbhaIoqNVq6HQ6GAwGGI1GuH37diFKV6WcDkklO1heXsbi4iLK5TIYY3AcB+fP761Ol2en
-84x1SZJg2zbm5uYKucd0Uv3BL76G2o+vjXsYW2JKBOs3XHz36j+NeyjkEA2yAf7b+x/c8X6GLush
-TCJkeYY0zZAmCRQmo5HV8I78Fm5Lt+G6LizLAmMM1WoV09PTsCwLaZqOpZY7CALcv39fdA/kr22X
-L1/G7Ozs7t/gBKDgTXaUpik+/PBDqKqKMAwRBMGegjdjDGEYwrZtcZgFrx0mh+sz9hn+6s7fovWL
-6+Meyku8dz/Dj279cNzDIMcsz3P0ej2EYYjJyUkMh0MsLS1hYmICrVZrrCtvS0tL6Ha7iKIIlmUh
-jmNR+dJutwszsaBlc7IjRVFEZnKe53v+o+NHUL722mtjyWw+S66WruJPb34V/8L+ExN3T04A779z
-Dz947TvjHgYZA0mSNl3knz9/fs8rdkfNdV0wxkT5qmVZmJmZgWmahXqtooQ1siPe9lCW5T2Vim1c
-yMmybMezhMnh+Z3yb+Orr38Fazc+GfdQAAD9t+/h269/E3X54PkRpPj220//qIxGI5GMNjMzA0mS
-4Ps+dF3HzMwMKpVKoQI3QDNvsgtJkqAoiigV831/29Ol8jxHFEWQJEk0ZDkJf7hnxZdqv4/Gm3V8
-R/93tH4+nhl4osQIfvUpvv/at+nwkTPO9318/PHHME0TiqIgjmOUSiXMz88f67L56uoqHj16BFmW
-MTU1Bdd1EQQBzp07h3a7jUqlcmxjOUwUvMmuLMuC53kwTXPHEi/esOHSpUviMJPDPI2K7O6L1nu4
-dvsq/tr8OqQ7TdjR8TW9WG8+xeTrOt6/+v6xPSY5uXgfdb76liQJGo3GsQbulZUVrK6uQtd19Pt9
-uK6L4XCIqakpzM7OFiKrfDu0bE52xZeYoihCFEU71kIyxvDo0SM8fvy4MIkfp01bbeNHt97H7Hs6
-1ubvHfnj5VKG9V/5BL/36+/ie1e/feSPR4rBcRzkeY5SqYQkSVAqlY5133tlZQUrKytQVRWMMczM
-zGB2dha3b9/G1atXCx24AZp5kz3QNE3MpHe7ajZNE47jbHv8JDk+35j9O9y/cB/fnPxHDB8l+z7I
-ZC/WbtzDlfYUvnfph1AlejkhnwvDEIZhiK00nhR21Hq9HrrdLnq9HkzTRBAEaLfbmJiYKNy+9k6o
-VIzsajgc4sGDBzBNE8PhEEEQoNVqbXnbOI6hKAquX78OXT+5jUPOmjvxHfzr4/fRWXNQ/WwGBjv4
-dkbfXkN6tY8rrTb+5uJfoqVs/VwgZ9snn3yCXq+HyclJWJaFqampI3083/exvLwsssn5jH9ubu7E
-ZLofJgreZFdhGGJ5eVmcx93v91Eul7c865k3XVhYWBjDSMlu/NzHv639Bz7o/xzuMIS0ZsEenIMZ
-bx/MXaOPqDkEmhGa1Rp+t/Vb+Er9y8c4alJEfJvtqA8bcRwHS0tL8H1ffE5RFGiahlqthna7faSP
-Py4UvMmukiTBhx9+KA4miaIIvu+j2Wy+dNsoipDnOd5+++0xjJTs1112F/87/DE+DR5gGA8RpjFy
-5FAkGaZq4FypgdfLN/Fu+dfQVk/niyApJsdxMBgMsL6+DgDQdR2+78O2bUxPT79SG+ciOD0bAOTI
-qKoqrmR56dhW+9lRFEHXdUxOTo5hlOQgbpRu4EbzxriHQci+eJ6HR48eIY5jsY8eRRFs28aFCxdO
-feAGKHiTPeDZ5TxjtFQqbZu4duvWreMcGiHkjEmSBL/85S8hSZJob5rnOcrlMi5dunRmcm2oVIzs
-ynEchGG46XSxF3db8jxHlmVYXl6mrmqEkCOjqiouX76MarUKz/Og6zquXLmC+fn5MxO4AdrzJnuQ
-JAk8z8Onn36KUqkEWZYxHA63PGQkCAJIkoR2u33k2aWEkLOLn1RY9Hrtg6KZN9mVqqpIkgRxHENV
-VcRxjCzLtrztxv0nQgg5KpqmndnADVDwJiWTxdEAABAoSURBVHvEDyYBIM7f3arTWhiGUBSFjv4k
-YzUajbC6urpjN0BCioyCN9kTXddFu9ON+98vyvMc7Xb7yGs7CdnJ0tISHjx4gA8++GDHfvyEFBVl
-m5M9sW1bZHZKkgRN015qNZhlGdI03bJ5CyHHhTEmSojq9fqxHoRByHGhhDWyZ8+ePcPi4iIsy4Lj
-OIiiCJVKRSyjM8bQbDYxMzMz5pGSsy7LMrHNQ8hpRDNvsmdTU1MYDodwHAe2bUOWZfi+L4J3lmV7
-PklsdXUVkiTBdV1cuHCBZuvkUFHgJqcdBW+yL41GA/1+H4qiwDAMpGmKtbU1mKYJSZLw8OFDaJq2
-Y4ejR48eYXFxEZIkQZIkZFmG+fn5Y/wpCCGk2GjZnOzbw4cP0el0RNtUxhiyLMNoNEIYhrBtG++9
-996293ccB2trayiVSjBNc9tDTgghhGyNgjc5kDt37qDf78M0TZimiTRNEcexWEpfWFg4taf5EELI
-uFHwJgeSpikePnyIpaUlJEki6sAbjQaiKAJjDJcuXcL09PSWh5gQQgg5OAre5JWsrKxgdXUV/X4f
-tm3Dtm0wxjAYDGAYBmzbRrPZhG3bVPtNCCGHhII3eWVJksB1XaysrIhZd5IkyLIMSZJAkiRUKhW8
-9dZb4x4qIYScChS8yaFJ0xRhGMJ1XXiehyiK0Gq1YBgGZFlGuVwe9xAJIeRUoOBNCCGEFAx1MiCE
-EEIKhoI3IYQQUjAUvAkhhJCCoeBNCCGEFAwFb0IIIaRgKHgTQgghBUPBmxBCCCkYCt6EEEJIwVDw
-JoQQQgpGHfcACNlKEATodruQJImOFiWEkBdQ8CYniuM4ePLkCTzPA2MM5XIZFy5cgCzTIhEhhHDU
-25ycCL7v4+nTp+j1ejBNE41GA6qqYmJiAqpK15iEELIRvSqSE2FpaQnD4RCGYeDWrVsUsE+hIAiQ
-5zmyLINpmlAUZdxDOpA4jsX59budlJfnOZIkQalUOvRxPHnyBJIk4eLFi4f+vcnJRzNvMnaPHz9G
-p9OBYRgYjUawLAtf+MIXxj0scghc18X6+jrCMEQYhsiyDACgKApmZmbQbDaPfUxJkqDT6WBycnJf
-2zGj0Qhra2sYDoeIogi2bWNhYQGaponbMMbQ7/cRRRFGoxHiOEae51hYWICqqi8F8SRJxG0Mw0AU
-RQAAWZahaRpc10WWZZAkCXmegzGG0WgE3/fR7/dx/fp1tFqtw/nFkEKh4E3GajAY4N69e7BtG1EU
-oVqtolKpYHJyctxDIwfkui6CIIDv+3AcB1EUQdO0TaspcRzDsizMzs5C07RNs/Asyw4lx8H3faRp
-iizLkOc5oihCFEVwHAee5+Hy5cubgqkkSZAkCaZpIkkSRFEExhgkSUKv14PneciyTMy2oyiCrusw
-TRN5niMMQ6RpCsYYZFkWPy8fQ7lcRrVaRalUQhzHCIIArusiTVMAgKqqSNMUeZ5DlmUoioI4jgE8
-n8FLkiR+FkmSoKoqqtWqeAx+W357WZaxsLBwJLN+Mn4UvMlY9Xo93Lt3D5ZlAQBu3rxJS+YF4zgO
-+v0+GGMi4IVhCFmWYRjGtsvjQRBAkiQ0Gg1Uq1WkaYrRaITRaIRyuQzbtpHnOSzLQqVS2dNYXNfF
-cDiE53nwfR/A86CcJAnSNIUkSdB1HbIsI0kSZFkmPs9vy8fL76OqqvhZNsrzXARmHvh3eu7yWbai
-KGCMQdO0TbP2F/EgvZ0oiqAoCiRJQpqmUBRFBO04jpGmKd54442Xxk1OBwreZOxWVlawuroKxhiq
-1SqazSYajQZlmI9JGIYYDofbBs0oijAYDOC6LuI4RhiGYIxB13UkSQLTNPf1eIwxKIoigmmpVAJj
-TATPUqmEd955Z9tAFscxHMdBp9NBEATiPmd5xhnHMbIsQ61WQ7VahaZpKJfLCMMQiqLs+/+InDwU
-vMlYMMbw0UcfQdd1NJtNPH78GKZpgjGGLMugaRqq1SouXry44+yDHK5utyv2dVVVRaVSQblcxvT0
-NPr9Pp49e4YoihAEAVRVhWmaR3qR5fs+Go0Grl27tuXXPM9Dt9vFcDiEaZq0avMC/vekKApkWRYf
-X7t2DbZtn+kLnKKj4E3GwnEc3L9/H2maQtM0+L4P0zTFMmKapoiiCBMTE5iYmKCZAp4nTA0GA5H4
-dO7cOZEUFcexWC71fV8suZZKJVSrVTQajZcugvgecBiGcBwHvu8jyzJkWQZd15HnOeI4BmNM7APL
-snzkL/j8cfM8R6VSQbvdhm3bImHM8zwAz58jPJObgvbe8b15VVXx5ptv0sVxQVHwJmPDl8sVRRGJ
-OxuTcIDn+6K6rmN6ehrnz58f42gPl+u6KJVKm/YjGWMiMDLG4Pu+WJbmTWt4UEvTFJOTk2L2Kcuy
-+HypVBIfJ0kCAKhUKmLvN8/zTQlQaZqK7ObtHFYS2V7wC4obN27g3Llz8DwPnU4H/X4fAFAqlcQe
-MzmYPM/heR4ajQZKpRJ0XUeWZeLvz7btcQ+R7IKCN3lJv9+HZVmQJElkzfKEmMPS7XaxvLwsZtw8
-gAMQmcn88fj+5/z8PGq12qGN4Titra2h0+mIpd3l5WUYhgHLsqCqKjzPE8FI0zRRVsWDpqIoL2Vk
-x3EMVVX3NOvkyU08AJ/UfII0TRGGISqVCq5cuYJut4tOp4M0TaHrOgXsQ5Rlmfjb4hdy/G/+jTfe
-2PFijowfBW/ykp/85CcYjUYiiMqyDEmS0Gw2ceHChS2XTcMw3FdW65MnT/Ds2TPkeS6CEq8BbrVa
-6Ha7m5bK+QxxXLXBB5XnORYXF9HpdKBpGqIoQp7nYlmaz4BlWRbL3ny5+ywKggCKoqBer4uM8d0a
-oZBXx1d08jxHtVrF3NxcYZvonBUUvE8Bz/NgGIaYgb348X799Kc/FfumvBSlXC6DMYa3334bwPOy
-l+FwKPqP379/H4ZhoNVqIUkSqKqKWq0GVVXFbMl1Xei6Lj7H63AZY1hfX0ee51BVFVmWwfM86Lq+
-aVx8j/PixYsnvjFFv9/HYDCA7/sIggCGYdCscQ946RWAXUuvyKvh5WSyLIvExFqtJso2yclGwbvg
-sizDnTt3ROKXqqqinhR43slqYWEBpmnC931YloVerwdZlqHr+palQHEcY3FxEb1eb1PA4clKfImN
-JzPpui6WcPm+KgCRiSxJEgzDwNramqht5U0reCLUYDAQ5S2qqkLTtC2DXZ7nCIIA8/PzqNfrR/Rb
-fTWMMfzsZz8D8Px3QEGbjBvvzhbHMQzDQJIksG0blUoFlUplU54JKQYK3gWQ57lohOF5nqiD5XtS
-WZYhDENIkgTGGCzLQpqmIiu30WiIWlxVVcEYAwBRjpVlGWzbhqIoogOUoijodrvo9/ui2xTvlAVg
-X8u6G2dTG+/Hs6QBwLKsPe3D8tnCzZs3T+wMgTGGTz/9VCTbEXLceMc33nRGlmVx4I9hGCKTnxQX
-Be8Thr/w12o1MMYwHA43dUziV82lUknsA+d5Dk3TROIJ/xyATftWWwVcnrAiy7JIWOGlSFmWIYoi
-qKoqMpmDIECtVjv2hCc+FkmScP369RO5DzocDjEcDjEajeA4zp4vSAg5DEmSiARQWZZRq9VQr9eh
-aRqVWp5CFLxPmDiO8dlnn8FxHDGLHsfsjfdn3hj8+UXBce5DMsZEprFpmpiamhprGUue53BdV/S8
-9jwPURQhjmPRGpSCNjkufFWsVCqhXC7DsiycO3dOtIAlpxcF7zG6d+8earWa6CzGGEOtVoNhGOj1
-erh79y4syzozJRuO44hMbF4axRjDlStXxjLbf1Gv18PKygrCMBT7+rydJzUKIcfJdV1omoZKpQLL
-stBqtc7M6wR5joL3mERRhOXlZbiuKzpb8d7efMk6SZIztWfKE2r4Mr1lWZienj702m7HccThF5qm
-bfs75gdlBEGAbreLIAh2bWZCyFHhB77wlsKtVosOHTnDaKowJrquo9FoYHV1VdT18sxrnozGTyDi
-5VqnHZ/B+r4PWZYRBIFIdDssw+EQd+/eFTNmVVVRr9fRbrdfygnwPA8fffSRyAGgF0pynPI8Fxfx
-vLRSURS8/vrrZ7YPAPkcBe8xqtfrmJubQ57n6Pf7ov0jTw7jy2Kj0UgcW8iXaxVFEXvQvBf1aWmq
-wFs1GoYhMrb3k1kehuG2ncf4Xv7GhLf19XUEQYB2u72pZMYwDJTLZfi+L4645C+mVAJGDsvGzPCN
-fREAiLPCecfDZrNJgZsAoGXzE4WXhPFZJ2MM7XZbfI2XeKVpKg6iYIyh3++LcjH+tdPQm3hj9iwv
-ZavX62J7QVEUsYT98ccfQ9d1VKtVPH78GABw8eJFTExMiO/37NkzPH369KX96TiO4boupqamsLCw
-sGkMYRgijmN4nod6vY4sy9DpdLC+vr7lGc+E7Ib3SODd9fjpbM1mE4ZhiOcnXRySnVDwLjieRCXL
-smhRyvdqT2I51UHxTmzA50lifLuhXC5jNBrB8zyxMlEul+F5Hubn50U71X6/j6WlJXE4B89i1zQN
-jUZDlNUAn+8vRlEEWZYxGAzEMj7P8OX3JWQ3aZqKJkl8e4gftFOv1ylQk32j4F1w6+vrItC4ros8
-zxFFEQBs6nwG4FQGGt7khTeg4XiegGVZMAxDJL1VKhV4noc8z0VA5kuW/H6GYaDb7Yo2rzzLXdO0
-sWe8k+LgJYSGYcC2bZTLZVHGRcirouB9CiVJsmmGGAQBXNcVy+pZliHPcxiGcaqDEc8J4Ak/kiSJ
-lrCdTgeMMSiKIhpY8Nn4xjwCQvYjyzIEQQBVVWHbNhqNhjh2k5DDRMH7FHn69Ck0TUOv14OiKGKf
-VlVVsVzHg7rjOKI9aZqm4nvw7G7ejIX3Jgfw0r9FxH9eTdNOTYIfGR/+fOKH7iiKglarhYmJiVO1
-bUVOHso2P0V48lq320UYhiiVSlhdXYWu65s6LvHOafwoSn7SF+8Oxmfosiwjz3N4nrdphi5J0qaj
-LIs0Qz2NWwfk6PBVGH5cJn+f513w7RdFUcQ+9tzc3LiHTc4AmnmfYrwXeJqm4o1nuvIAnSSJ2APm
-B5ukaQpVVUVG+8ZmMXmei2Qx3hf9pJ7uRciLdgrGvERx49G0/EAPfsFr27Z4f6s3Qo4LBW8C4PMX
-tY2Bngd7nr3OP+ZZ17zumdegA5uX1vn7jDFx6MnG27x4+4P8S4qFv9wc9N8XP8ePqeUfb3U/fqrW
-dsGYf/3FQLxxy4iQk4aCNzkQXnfOl9Zf9S0IgpdefF98C8NQfI2fKU6Kgz9XeEA0DENc5G18Az6/
-+OPNcF71bWN5ISGnAQVvQgghpGBOb50QIYQQckpR8CaEEEIKhoI3IYQQUjAUvAkhhJCCoeBNCCGE
-FAwFb0IIIaRgKHgTQgghBUPBmxBCCCkYCt6EEEJIwVDwJoQQQgqGgjchhBBSMBS8CSGEkIKh4E0I
-IYQUDAVvQgghpGAoeBNCCCEFQ8GbEEIIKRgK3oQQQkjBUPAmhBBCCoaCNyGEEFIwFLwJIYSQgqHg
-TQghhBTM/wP0r5H+skcc1QAAAABJRU5ErkJggg==
-"
-           id="image287"
-           x="114.75478"
-           y="95.127419" />
-        <image
-           width="91.543488"
-           height="68.8339"
-           preserveAspectRatio="none"
-           xlink:href="data:image/png;base64,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
-vn37Ul1dzZw5c5p+gOHgD/Ydd9xBOBwGYOPGjYRCIYPvSoYjnc2UKVO4//772bdvH3AwYtuzZ89h
-taTPprq6mosvvpjf/e53TVFILHHy2axfv54dO3Y0/fnVV1/F6/WSn5//s97r8SJ5NhMmTGDJkiUs
-Xrz4B/sFf+7ZvPXWW1RWVlJRUUFFRQVXX301zzzzjBpiM6Km6DBKS0sZM2YM6enp5OXlsWzZMubO
-nQtAYWEhTz/9NFOnTiU3N5cePXrw7rvvHlHv0A/x6NGjmz72wAMPUFtbS5cuXcjJyeGKK65o+mF2
-Mkc6m0svvZQxY8YwePBgcnNzOf30049a4Sh5NvPmzeMf//gHkydPxuv1Nv330UcfndibPkacfDbb
-t29n1KhR5Ofn06FDB+bMmcPixYtjlpGQPJvc3FxycnJIS0v7QZQbrz9Tyo/RJcOKoiiK0ohGioqi
-KIrSiJqioiiKojSipqgoiqIojagpKoqiKEojaoqKoiiK0oiaoqIoiqI0oqaoKIqiKI2oKSqKoihK
-I2qKiqIoitKImqKiKIqiNKKmqCiKoiiNqCkqiqIoSiNqioqiKIrSiJqioiiKojSipqgoiqIojagp
-KoqiKEoj/w9LDrtwIfjOQAAAAABJRU5ErkJggg==
-"
-           id="image311"
-           x="9.8340321"
-           y="93.127213" />
-        <image
-           width="88.209435"
-           height="53.91893"
-           preserveAspectRatio="none"
-           xlink:href="data:image/png;base64,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
-i/60cN++fRQVFREXF0dWVhY1NTUUFBRQXl5OYGAg8fHxbN++HYCsrCxGjhzZkpsXERERJ7TomYHM
-zEySkpJISEhg3LhxhIWF0b59e9LT0wFITExk586dREREYLFY2LJlS0tuXkRERJzgYxq7C7ANycvL
-87zLBKfzKf7ya3eHcVU88XSfJ1KeXUN5dg1PzLMuE9SnEQhFRES8nIoBERERL6diQERExMupGBAR
-EfFyKgZERES8nIoBERERL6diQERExMupGBAREfFyKgZERES8nIoBERERL6diQERExMupGBAREfFy
-KgZERES8nIoBERERL+dUMVBdXc3MmTOJiIjAarVSUlJSb56MjAwGDx5MaGgoBw8evOLlRERExLWc
-KgY2b95MUFAQhw8fJi0tjTVr1tSZfubMGbZt28aBAwfIyspiyZIlV7SciIiIuJ5TxcCePXuYNGkS
-ADabjd27d9eZnpOTQ2JiIr6+voSEhODj40NJSckvLiciIiKu51QxUFhYSHBwMAABAQFUVFQ0Oh2g
-a9euFBYW/uJyIiIi4nr+ziwUEBBwVdONMVe0XHFxMcXFxfXafX19ycvLu8oo3S8g+AZ3h3BV7gy+
-190heAXl2TWUZ9fwxDx/V3ae7/LOuzuMK9apUyd69erVqttwqhjo1q0bxcXFWCwWKisr8ff3b3B6
-raKiIiwWyy8uZ7FYsFgs9baXl5fHgAEDnAlVroLy7BrKs2soz66hPLc+V3wZduoyQXx8PNu3bwcg
-KyuLkSNHArBv3z6KioqIi4sjKyuLmpoaCgoKKC8vJzAwsNHlRERExH2cOjOQmJjIzp07iYiIwGKx
-sGXLFgAyMzNJSkoiISGBcePGERYWRvv27UlPT29yOREREXEfp4oBPz8/Nm3aVK/99ddfd7xesGAB
-CxYsuKLlRERExH00AqGIiIiX84hioKGbCqXlKc+uoTy7hvLsGspz63NFjn1M7e/+RERExCt5xJkB
-ERERaT0qBi7z4YcfOh6wNGjQIE6ePOnukK55zzzzDL179yY8PJyhQ4fy0UcfNTjfrFmz+Pzzz5tc
-l4a4blx0dDTnzzdvoBXlt2k7duwgLCyM/v37069fP95//313h9Tm7d69myeeeKJOW1JS0i9+1n/J
-rl27eOaZZ5qcJyUlhePHjzdrO9cKp35NcC379a9/zfbt27ntttv48ccfadeunbtD8gpr1qzBZrNx
-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
-/3X5/6zg9TITAAAAAElFTkSuQmCC
-"
-           id="image415"
-           x="114.75478"
-           y="36.409554" />
-      </g>
-    </g>
-  </g>
-</svg>
diff --git a/packages/serverless-logic-web-tools/static/samples/products-dashboard/products-dashboard.dash.yml b/packages/serverless-logic-web-tools/static/samples/products-dashboard/products-dashboard.dash.yml
deleted file mode 100644
index 88e26858b5..0000000000
--- a/packages/serverless-logic-web-tools/static/samples/products-dashboard/products-dashboard.dash.yml
+++ /dev/null
@@ -1,42 +0,0 @@
-datasets:
-  - uuid: products
-    content: >-
-      [
-        ["Computers", "Scanner", 5, 3],
-        ["Computers", "Printer", 7, 4],
-        ["Computers", "Laptop", 3, 2],
-        ["Electronics", "Camera", 10, 7],
-        ["Electronics", "Headphones", 5, 9]
-      ]
-    columns:
-      - id: Section
-        type: LABEL
-      - id: Product
-        type: LABEL
-      - id: Quantity
-        type: NUMBER
-      - id: Quantity2
-        type: NUMBER
-pages:
-  - components:
-      - html: Welcome to Dashbuilder!
-        properties:
-          font-size: xx-large
-          margin-bottom: 30px
-      - settings:
-          type: BARCHART
-          dataSetLookup:
-            uuid: products
-            group:
-              - columnGroup:
-                  source: Product
-                groupFunctions:
-                  - source: Product
-                  - source: Quantity
-                    function: SUM
-                  - source: Quantity2
-                    function: SUM
-      - settings:
-          type: TABLE
-          dataSetLookup:
-            uuid: products
diff --git a/packages/serverless-logic-web-tools/static/samples/products-dashboard/products-dashboard.svg b/packages/serverless-logic-web-tools/static/samples/products-dashboard/products-dashboard.svg
deleted file mode 100644
index 643e728edc..0000000000
--- a/packages/serverless-logic-web-tools/static/samples/products-dashboard/products-dashboard.svg
+++ /dev/null
@@ -1,671 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   version="1.1"
-   id="svg39"
-   width="505"
-   height="581"
-   viewBox="0 0 505 581"
-   xmlns="http://www.w3.org/2000/svg">
-  <defs
-     id="defs43" />
-  <g
-     id="g45">
-    <image
-       width="505"
-       height="581"
-       preserveAspectRatio="none"
-       xlink:href="data:image/png;base64,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
-"
-       id="image47" />
-  </g>
-</svg>
diff --git a/packages/serverless-logic-web-tools/static/samples/swf-report/sampleResponse.json b/packages/serverless-logic-web-tools/static/samples/swf-report/sampleResponse.json
deleted file mode 100644
index 2d95bd665b..0000000000
--- a/packages/serverless-logic-web-tools/static/samples/swf-report/sampleResponse.json
+++ /dev/null
@@ -1,5122 +0,0 @@
-{
-  "data": {
-    "ProcessInstances": [
-      {
-        "id": "0aa4eba3-f0c8-4918-a559-7a7f065047df",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-09T05:02:51.334Z",
-        "end": "2022-03-09T05:02:51.399Z",
-        "lastUpdate": "2022-03-09T05:02:51.426Z",
-        "error": null
-      },
-      {
-        "id": "48bbb8fa-e04a-48ec-925d-d3af9699d266",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-09T14:08:05.779Z",
-        "end": "2022-03-09T14:08:05.897Z",
-        "lastUpdate": "2022-03-09T14:08:05.922Z",
-        "error": null
-      },
-      {
-        "id": "ec8212e5-26fe-446d-9425-d150be682f03",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-09T14:08:11.006Z",
-        "end": "2022-03-09T14:08:11.01Z",
-        "lastUpdate": "2022-03-09T14:08:11.011Z",
-        "error": null
-      },
-      {
-        "id": "4193ee7b-87b2-48d0-996a-b8fb9c1085d1",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-10T14:42:02.621Z",
-        "end": "2022-03-10T14:42:02.624Z",
-        "lastUpdate": "2022-03-10T14:42:02.626Z",
-        "error": null
-      },
-      {
-        "id": "9c8e1b2a-8176-431f-b717-854f59376e20",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-10T14:42:08.266Z",
-        "end": "2022-03-10T14:42:08.268Z",
-        "lastUpdate": "2022-03-10T14:42:08.27Z",
-        "error": null
-      },
-      {
-        "id": "68a6683e-f9bb-42b4-b159-595fdad91672",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-10T14:42:25.06Z",
-        "end": "2022-03-10T14:42:25.063Z",
-        "lastUpdate": "2022-03-10T14:42:25.064Z",
-        "error": null
-      },
-      {
-        "id": "a1a4ac9f-9139-4e6e-990e-2f01d3e96c86",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-10T16:37:45.049Z",
-        "end": "2022-03-10T16:37:45.052Z",
-        "lastUpdate": "2022-03-10T16:37:45.054Z",
-        "error": null
-      },
-      {
-        "id": "9e620f68-b3d9-4563-af81-e2c12a170cca",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-10T16:41:17.755Z",
-        "end": "2022-03-10T16:41:17.757Z",
-        "lastUpdate": "2022-03-10T16:41:17.758Z",
-        "error": null
-      },
-      {
-        "id": "65743702-202d-434f-a1e9-a61ed35e0771",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-10T22:25:05.813Z",
-        "end": "2022-03-10T22:25:05.816Z",
-        "lastUpdate": "2022-03-10T22:25:05.818Z",
-        "error": null
-      },
-      {
-        "id": "77a44c9a-7d50-44c9-acab-7d794cb7561c",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "ERROR",
-        "start": "2022-03-10T22:25:38.41Z",
-        "end": null,
-        "lastUpdate": "2022-03-10T22:25:38.435Z",
-        "error": {
-          "message": "b542885a-f023-4f44-b00a-84f9c9e1b242 - java.lang.IllegalArgumentException - XOR split could not find at least one valid outgoing connection for split ChooseOnLanguage"
-        }
-      },
-      {
-        "id": "71a05a34-b556-4146-ac38-084fc94fe3a8",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "ERROR",
-        "start": "2022-03-10T22:27:12.853Z",
-        "end": null,
-        "lastUpdate": "2022-03-10T22:27:12.856Z",
-        "error": {
-          "message": "57473835-b90e-426b-bf0c-756a74900aaf - java.lang.IllegalArgumentException - XOR split could not find at least one valid outgoing connection for split ChooseOnLanguage"
-        }
-      },
-      {
-        "id": "b8755fcc-c647-43e8-8a48-be987d65cf52",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "ERROR",
-        "start": "2022-03-10T22:27:15.783Z",
-        "end": null,
-        "lastUpdate": "2022-03-10T22:27:15.785Z",
-        "error": {
-          "message": "1e27e635-ed16-4aa0-8378-9f039d7f022d - java.lang.IllegalArgumentException - XOR split could not find at least one valid outgoing connection for split ChooseOnLanguage"
-        }
-      },
-      {
-        "id": "22b7d40b-cebd-4079-a6e2-d49abb01df11",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-10T22:27:31.494Z",
-        "end": "2022-03-10T22:27:31.502Z",
-        "lastUpdate": "2022-03-10T22:27:31.504Z",
-        "error": null
-      },
-      {
-        "id": "de686d16-c780-4590-9a6e-9edff2b9a4a8",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-10T22:27:33.368Z",
-        "end": "2022-03-10T22:27:33.37Z",
-        "lastUpdate": "2022-03-10T22:27:33.371Z",
-        "error": null
-      },
-      {
-        "id": "f9a56844-5025-47e2-b484-a8561c762fec",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-10T23:09:55.556Z",
-        "end": "2022-03-10T23:09:55.558Z",
-        "lastUpdate": "2022-03-10T23:09:55.56Z",
-        "error": null
-      },
-      {
-        "id": "253830fb-3cd8-4261-93b8-484fa2ae19f5",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-10T23:13:43.52Z",
-        "end": "2022-03-10T23:13:43.522Z",
-        "lastUpdate": "2022-03-10T23:13:43.523Z",
-        "error": null
-      },
-      {
-        "id": "32fd5dce-8126-4d1d-a077-6b00037a21b9",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-10T23:32:54.562Z",
-        "end": "2022-03-10T23:32:54.565Z",
-        "lastUpdate": "2022-03-10T23:32:54.567Z",
-        "error": null
-      },
-      {
-        "id": "d7f0ddda-388a-43ba-9619-7e9d116161b6",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-10T23:33:03.82Z",
-        "end": "2022-03-10T23:33:03.822Z",
-        "lastUpdate": "2022-03-10T23:33:03.828Z",
-        "error": null
-      },
-      {
-        "id": "bb42c091-b828-4182-9866-2e19e31367a9",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-10T23:33:06.853Z",
-        "end": "2022-03-10T23:33:06.857Z",
-        "lastUpdate": "2022-03-10T23:33:06.86Z",
-        "error": null
-      },
-      {
-        "id": "c3cee7fb-782a-4c87-ab28-280a4234ec20",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-10T23:33:11.331Z",
-        "end": "2022-03-10T23:33:11.333Z",
-        "lastUpdate": "2022-03-10T23:33:11.334Z",
-        "error": null
-      },
-      {
-        "id": "dbd27e42-68b8-4ca6-87fc-256cfc42f732",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-10T23:33:14.782Z",
-        "end": "2022-03-10T23:33:14.785Z",
-        "lastUpdate": "2022-03-10T23:33:14.786Z",
-        "error": null
-      },
-      {
-        "id": "749b1570-3b29-4b4d-8c52-dedaee1d479a",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-10T23:33:22.089Z",
-        "end": "2022-03-10T23:33:22.098Z",
-        "lastUpdate": "2022-03-10T23:33:22.099Z",
-        "error": null
-      },
-      {
-        "id": "23e4a0c8-71b6-48e1-824f-b6da0b817289",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-10T23:51:53.413Z",
-        "end": "2022-03-10T23:51:53.414Z",
-        "lastUpdate": "2022-03-10T23:51:53.416Z",
-        "error": null
-      },
-      {
-        "id": "7fe1c3d7-c4c7-455e-b1bd-0f0a98af5dfb",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T00:18:01.217Z",
-        "end": "2022-03-11T00:18:01.219Z",
-        "lastUpdate": "2022-03-11T00:18:01.22Z",
-        "error": null
-      },
-      {
-        "id": "10603c9a-7d85-4818-9b84-3769084bdfb2",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T00:18:53.142Z",
-        "end": "2022-03-11T00:18:53.145Z",
-        "lastUpdate": "2022-03-11T00:18:53.154Z",
-        "error": null
-      },
-      {
-        "id": "f65b1a7e-641f-440b-9979-1613c5acdfdf",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T00:20:44.196Z",
-        "end": "2022-03-11T00:20:44.198Z",
-        "lastUpdate": "2022-03-11T00:20:44.198Z",
-        "error": null
-      },
-      {
-        "id": "1fae1d16-2f52-43d2-944d-fa41b3276d4c",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T00:20:52.579Z",
-        "end": "2022-03-11T00:20:52.581Z",
-        "lastUpdate": "2022-03-11T00:20:52.582Z",
-        "error": null
-      },
-      {
-        "id": "cdd98f6c-6eb7-4af6-9228-3bfd581b6088",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "ERROR",
-        "start": "2022-03-11T00:25:44.409Z",
-        "end": null,
-        "lastUpdate": "2022-03-11T00:25:44.414Z",
-        "error": {
-          "message": "ad04c58e-93c3-4850-8e94-6f6fdda1ba74 - java.lang.IllegalArgumentException - XOR split could not find at least one valid outgoing connection for split ChooseOnLanguage"
-        }
-      },
-      {
-        "id": "2a3a2c26-e601-4c34-aa26-942b4d360697",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T00:31:13.203Z",
-        "end": "2022-03-11T00:31:13.205Z",
-        "lastUpdate": "2022-03-11T00:31:13.205Z",
-        "error": null
-      },
-      {
-        "id": "14bb3d63-59a6-416c-826f-a117b4a3e3c3",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T00:31:50.424Z",
-        "end": "2022-03-11T00:31:50.426Z",
-        "lastUpdate": "2022-03-11T00:31:50.427Z",
-        "error": null
-      },
-      {
-        "id": "7ac41d09-5ae4-4f9d-ad79-6880f1e6bd32",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T00:35:53.88Z",
-        "end": "2022-03-11T00:35:53.883Z",
-        "lastUpdate": "2022-03-11T00:35:53.884Z",
-        "error": null
-      },
-      {
-        "id": "37653791-587b-480a-9866-fd61caf16464",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T00:36:00.919Z",
-        "end": "2022-03-11T00:36:00.921Z",
-        "lastUpdate": "2022-03-11T00:36:00.921Z",
-        "error": null
-      },
-      {
-        "id": "596857aa-6f6d-4ade-803d-146f67cdedb3",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T00:36:05.506Z",
-        "end": "2022-03-11T00:36:05.514Z",
-        "lastUpdate": "2022-03-11T00:36:05.515Z",
-        "error": null
-      },
-      {
-        "id": "66e12947-7260-4da9-8cd0-ded4bd442472",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T00:36:11.999Z",
-        "end": "2022-03-11T00:36:12.001Z",
-        "lastUpdate": "2022-03-11T00:36:12.002Z",
-        "error": null
-      },
-      {
-        "id": "f2480279-6164-4126-8076-c76217f1dfd2",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T00:36:20.256Z",
-        "end": "2022-03-11T00:36:20.258Z",
-        "lastUpdate": "2022-03-11T00:36:20.258Z",
-        "error": null
-      },
-      {
-        "id": "f3493882-0177-4a52-9f00-3d73f4a4c87e",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T00:36:26.014Z",
-        "end": "2022-03-11T00:36:26.015Z",
-        "lastUpdate": "2022-03-11T00:36:26.016Z",
-        "error": null
-      },
-      {
-        "id": "b2298e2f-88f1-4114-bdfc-9503e7ec46c3",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T00:36:31.751Z",
-        "end": "2022-03-11T00:36:31.753Z",
-        "lastUpdate": "2022-03-11T00:36:31.753Z",
-        "error": null
-      },
-      {
-        "id": "f44aa304-f064-4f58-b8f5-cd85d21c5b45",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T00:36:38.005Z",
-        "end": "2022-03-11T00:36:38.006Z",
-        "lastUpdate": "2022-03-11T00:36:38.007Z",
-        "error": null
-      },
-      {
-        "id": "b037ffb9-12f7-48bb-bc65-59836d59b15f",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T00:36:55.775Z",
-        "end": "2022-03-11T00:36:55.777Z",
-        "lastUpdate": "2022-03-11T00:36:55.778Z",
-        "error": null
-      },
-      {
-        "id": "3dbebbac-9e5a-414d-8e5d-654996e25bb5",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T00:37:00.437Z",
-        "end": "2022-03-11T00:37:00.439Z",
-        "lastUpdate": "2022-03-11T00:37:00.44Z",
-        "error": null
-      },
-      {
-        "id": "7b114f5a-7205-498b-92f4-bd0a3173c997",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T00:37:06.095Z",
-        "end": "2022-03-11T00:37:06.096Z",
-        "lastUpdate": "2022-03-11T00:37:06.1Z",
-        "error": null
-      },
-      {
-        "id": "741ecf38-b5ad-4786-95d9-c85cb7b4d484",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T00:37:12.982Z",
-        "end": "2022-03-11T00:37:12.985Z",
-        "lastUpdate": "2022-03-11T00:37:12.986Z",
-        "error": null
-      },
-      {
-        "id": "d91ea74d-7166-4603-a8c4-c719cb259686",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T00:55:11.981Z",
-        "end": "2022-03-11T00:55:11.983Z",
-        "lastUpdate": "2022-03-11T00:55:11.984Z",
-        "error": null
-      },
-      {
-        "id": "ea54826a-bd04-41ec-9f0b-1ad5130f7899",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T02:15:35.421Z",
-        "end": "2022-03-11T02:15:35.432Z",
-        "lastUpdate": "2022-03-11T02:15:35.441Z",
-        "error": null
-      },
-      {
-        "id": "2bd47c95-f8bd-4a71-bf30-16eec9e1b07b",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T02:15:41.391Z",
-        "end": "2022-03-11T02:15:41.393Z",
-        "lastUpdate": "2022-03-11T02:15:41.394Z",
-        "error": null
-      },
-      {
-        "id": "a22dd9e4-f721-4cce-8ec9-9a7c0725becc",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T02:16:25.272Z",
-        "end": "2022-03-11T02:16:25.274Z",
-        "lastUpdate": "2022-03-11T02:16:25.274Z",
-        "error": null
-      },
-      {
-        "id": "bd824def-b10d-4e0a-bcf1-c33ea03206fd",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T02:16:29.701Z",
-        "end": "2022-03-11T02:16:29.703Z",
-        "lastUpdate": "2022-03-11T02:16:29.704Z",
-        "error": null
-      },
-      {
-        "id": "5e9eaac1-2d3c-4e0f-a457-9db5b320bbda",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T02:16:34.433Z",
-        "end": "2022-03-11T02:16:34.436Z",
-        "lastUpdate": "2022-03-11T02:16:34.437Z",
-        "error": null
-      },
-      {
-        "id": "4445e034-ccf9-4e10-9391-4d3e7d5036f4",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T02:17:25.949Z",
-        "end": "2022-03-11T02:17:25.95Z",
-        "lastUpdate": "2022-03-11T02:17:25.951Z",
-        "error": null
-      },
-      {
-        "id": "70523f4d-83e8-42f2-8c1b-496a9dd3433f",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T02:17:32.409Z",
-        "end": "2022-03-11T02:17:32.419Z",
-        "lastUpdate": "2022-03-11T02:17:32.42Z",
-        "error": null
-      },
-      {
-        "id": "93782288-0f2c-4060-90a9-0d318edfb752",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T02:17:40.151Z",
-        "end": "2022-03-11T02:17:40.153Z",
-        "lastUpdate": "2022-03-11T02:17:40.154Z",
-        "error": null
-      },
-      {
-        "id": "21ee45b8-260f-4df1-aed3-9646b7354fb9",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T02:17:46.729Z",
-        "end": "2022-03-11T02:17:46.731Z",
-        "lastUpdate": "2022-03-11T02:17:46.731Z",
-        "error": null
-      },
-      {
-        "id": "328f3f35-6393-488f-9cda-3afee9e0147c",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T13:45:22.507Z",
-        "end": "2022-03-11T13:45:22.509Z",
-        "lastUpdate": "2022-03-11T13:45:22.51Z",
-        "error": null
-      },
-      {
-        "id": "fe84ee9e-7587-432c-bae6-a3e64a663982",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T17:25:53.853Z",
-        "end": "2022-03-11T17:25:53.855Z",
-        "lastUpdate": "2022-03-11T17:25:53.856Z",
-        "error": null
-      },
-      {
-        "id": "9128cac3-3908-49b8-802f-703a3a21c3a5",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T17:25:57.228Z",
-        "end": "2022-03-11T17:25:57.229Z",
-        "lastUpdate": "2022-03-11T17:25:57.23Z",
-        "error": null
-      },
-      {
-        "id": "80509e04-2522-4c1e-89e5-389f03c28be4",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T17:25:59.504Z",
-        "end": "2022-03-11T17:25:59.505Z",
-        "lastUpdate": "2022-03-11T17:25:59.506Z",
-        "error": null
-      },
-      {
-        "id": "c3cbbc53-03ed-44d9-be3a-98b6f22e9ee4",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T17:26:01.537Z",
-        "end": "2022-03-11T17:26:01.539Z",
-        "lastUpdate": "2022-03-11T17:26:01.54Z",
-        "error": null
-      },
-      {
-        "id": "62bc666e-4f48-4c50-95af-7f4f8de96c32",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T17:26:03.558Z",
-        "end": "2022-03-11T17:26:03.56Z",
-        "lastUpdate": "2022-03-11T17:26:03.56Z",
-        "error": null
-      },
-      {
-        "id": "f626adeb-8e71-42d3-8d24-4590c16e553f",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T17:26:05.834Z",
-        "end": "2022-03-11T17:26:05.836Z",
-        "lastUpdate": "2022-03-11T17:26:05.837Z",
-        "error": null
-      },
-      {
-        "id": "2c110e56-5e07-49f5-869e-1aea39e18d81",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T17:26:07.731Z",
-        "end": "2022-03-11T17:26:07.733Z",
-        "lastUpdate": "2022-03-11T17:26:07.734Z",
-        "error": null
-      },
-      {
-        "id": "3a61c5fa-bbc8-4435-9666-ea49fe3f8cff",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T17:26:10.031Z",
-        "end": "2022-03-11T17:26:10.033Z",
-        "lastUpdate": "2022-03-11T17:26:10.033Z",
-        "error": null
-      },
-      {
-        "id": "948a17a3-32c1-49c0-bf77-1778074a7c2e",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T17:26:14.244Z",
-        "end": "2022-03-11T17:26:14.251Z",
-        "lastUpdate": "2022-03-11T17:26:14.252Z",
-        "error": null
-      },
-      {
-        "id": "95315504-b631-4fd1-a361-532ccdc2da16",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T17:26:18.463Z",
-        "end": "2022-03-11T17:26:18.475Z",
-        "lastUpdate": "2022-03-11T17:26:18.476Z",
-        "error": null
-      },
-      {
-        "id": "519a0949-4fab-4273-93dc-b4c87cff76b3",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T22:59:15.285Z",
-        "end": "2022-03-11T22:59:15.286Z",
-        "lastUpdate": "2022-03-11T22:59:15.287Z",
-        "error": null
-      },
-      {
-        "id": "fe27f173-5db3-4626-b06b-6add90275a1e",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T22:59:18.784Z",
-        "end": "2022-03-11T22:59:18.785Z",
-        "lastUpdate": "2022-03-11T22:59:18.786Z",
-        "error": null
-      },
-      {
-        "id": "5a0848a2-fec6-45f1-b617-8a49a9f32d2a",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T22:59:23.525Z",
-        "end": "2022-03-11T22:59:23.527Z",
-        "lastUpdate": "2022-03-11T22:59:23.527Z",
-        "error": null
-      },
-      {
-        "id": "5a8ffa47-d670-4723-9aa8-05a62b2a5ab2",
-        "processId": "yamlgreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-11T22:59:26.759Z",
-        "end": "2022-03-11T22:59:26.76Z",
-        "lastUpdate": "2022-03-11T22:59:26.761Z",
-        "error": null
-      },
-      {
-        "id": "d9b6c141-03b1-484f-98fc-29383059797c",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T00:42:21.362Z",
-        "end": "2022-03-13T00:42:21.369Z",
-        "lastUpdate": "2022-03-13T00:42:21.371Z",
-        "error": null
-      },
-      {
-        "id": "c15514d0-dd64-4a97-94d4-ae37e970b9fb",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T00:42:26.06Z",
-        "end": "2022-03-13T00:42:26.062Z",
-        "lastUpdate": "2022-03-13T00:42:26.063Z",
-        "error": null
-      },
-      {
-        "id": "567d03a4-b35e-4cd2-9c47-86902788c992",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T00:42:30.246Z",
-        "end": "2022-03-13T00:42:30.248Z",
-        "lastUpdate": "2022-03-13T00:42:30.248Z",
-        "error": null
-      },
-      {
-        "id": "ac929d79-6d8f-490d-90c6-8e73e1afeea4",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T00:42:32.148Z",
-        "end": "2022-03-13T00:42:32.149Z",
-        "lastUpdate": "2022-03-13T00:42:32.15Z",
-        "error": null
-      },
-      {
-        "id": "2da91068-0ab4-468d-8639-7398c11f3d53",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T00:42:34.518Z",
-        "end": "2022-03-13T00:42:34.519Z",
-        "lastUpdate": "2022-03-13T00:42:34.52Z",
-        "error": null
-      },
-      {
-        "id": "71a96a65-31f5-46c2-a5fb-051f266f5b98",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T00:42:48.408Z",
-        "end": "2022-03-13T00:42:48.413Z",
-        "lastUpdate": "2022-03-13T00:42:48.414Z",
-        "error": null
-      },
-      {
-        "id": "8536bd5e-74d2-44de-8bae-a4297b93fe35",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T15:56:11.688Z",
-        "end": "2022-03-13T15:56:11.69Z",
-        "lastUpdate": "2022-03-13T15:56:11.691Z",
-        "error": null
-      },
-      {
-        "id": "64e2ef0e-dac7-4bc8-bbf8-37cddcb00dce",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T15:56:14.544Z",
-        "end": "2022-03-13T15:56:14.545Z",
-        "lastUpdate": "2022-03-13T15:56:14.545Z",
-        "error": null
-      },
-      {
-        "id": "c53a6bdf-aa50-4ecd-b574-3e87c5ab2cd6",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:00:23.714Z",
-        "end": "2022-03-13T16:00:23.715Z",
-        "lastUpdate": "2022-03-13T16:00:23.715Z",
-        "error": null
-      },
-      {
-        "id": "98c712af-cc8b-440a-90e1-a45c1cbef506",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:00:58.069Z",
-        "end": "2022-03-13T16:00:58.07Z",
-        "lastUpdate": "2022-03-13T16:00:58.071Z",
-        "error": null
-      },
-      {
-        "id": "2af55fcd-c7d6-4ed5-819c-8bbd8fe8c5fd",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:01:06.612Z",
-        "end": "2022-03-13T16:01:06.653Z",
-        "lastUpdate": "2022-03-13T16:01:06.654Z",
-        "error": null
-      },
-      {
-        "id": "53fddb11-b257-44be-98e2-04bee3db5044",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:01:10.225Z",
-        "end": "2022-03-13T16:01:10.227Z",
-        "lastUpdate": "2022-03-13T16:01:10.228Z",
-        "error": null
-      },
-      {
-        "id": "10c53c09-3574-4a71-a449-68dd0e4fcc7b",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:01:15.353Z",
-        "end": "2022-03-13T16:01:15.354Z",
-        "lastUpdate": "2022-03-13T16:01:15.355Z",
-        "error": null
-      },
-      {
-        "id": "e1f2fe58-83ef-480f-bc09-3b30ff3886fc",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:01:18.731Z",
-        "end": "2022-03-13T16:01:18.733Z",
-        "lastUpdate": "2022-03-13T16:01:18.733Z",
-        "error": null
-      },
-      {
-        "id": "7838dd7b-7570-4613-8dd1-dddac155cdf8",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:01:21.846Z",
-        "end": "2022-03-13T16:01:21.848Z",
-        "lastUpdate": "2022-03-13T16:01:21.849Z",
-        "error": null
-      },
-      {
-        "id": "2315efab-d1c4-4fc8-ab3f-dbfa979110a1",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:01:25.342Z",
-        "end": "2022-03-13T16:01:25.343Z",
-        "lastUpdate": "2022-03-13T16:01:25.343Z",
-        "error": null
-      },
-      {
-        "id": "74c640fb-760f-497c-a4f3-96413b976c64",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:01:28.772Z",
-        "end": "2022-03-13T16:01:28.774Z",
-        "lastUpdate": "2022-03-13T16:01:28.781Z",
-        "error": null
-      },
-      {
-        "id": "2f08588a-6085-4262-8e5c-3d150e0f15c5",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:01:32.614Z",
-        "end": "2022-03-13T16:01:32.616Z",
-        "lastUpdate": "2022-03-13T16:01:32.616Z",
-        "error": null
-      },
-      {
-        "id": "2a513ebc-4ec9-4cd9-a133-0564c0828f8f",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:01:36.372Z",
-        "end": "2022-03-13T16:01:36.375Z",
-        "lastUpdate": "2022-03-13T16:01:36.388Z",
-        "error": null
-      },
-      {
-        "id": "77bface2-0247-475e-a0a9-371d9cf50732",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:01:39.661Z",
-        "end": "2022-03-13T16:01:39.662Z",
-        "lastUpdate": "2022-03-13T16:01:39.662Z",
-        "error": null
-      },
-      {
-        "id": "08b5a7ae-a119-4311-bd30-db892af6d7f2",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:01:43.422Z",
-        "end": "2022-03-13T16:01:43.423Z",
-        "lastUpdate": "2022-03-13T16:01:43.424Z",
-        "error": null
-      },
-      {
-        "id": "02738a3e-31f8-48bd-9fa0-c9974ea829ea",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:02:30.478Z",
-        "end": "2022-03-13T16:02:30.479Z",
-        "lastUpdate": "2022-03-13T16:02:30.48Z",
-        "error": null
-      },
-      {
-        "id": "3eb94f60-fe52-45f2-b92d-b57571123adc",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:02:33.924Z",
-        "end": "2022-03-13T16:02:33.925Z",
-        "lastUpdate": "2022-03-13T16:02:33.926Z",
-        "error": null
-      },
-      {
-        "id": "55fe38e8-9b6a-4479-bcc8-c9693755a294",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:02:38.255Z",
-        "end": "2022-03-13T16:02:38.256Z",
-        "lastUpdate": "2022-03-13T16:02:38.258Z",
-        "error": null
-      },
-      {
-        "id": "17c0f6cf-c0c0-48ff-9fcd-d0762d7baa10",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:02:41.061Z",
-        "end": "2022-03-13T16:02:41.063Z",
-        "lastUpdate": "2022-03-13T16:02:41.064Z",
-        "error": null
-      },
-      {
-        "id": "19b73f00-0991-46bf-9623-1d63471be21e",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:02:44.427Z",
-        "end": "2022-03-13T16:02:44.429Z",
-        "lastUpdate": "2022-03-13T16:02:44.429Z",
-        "error": null
-      },
-      {
-        "id": "585397ff-16c6-478e-a2b8-48d39d1a27f0",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:02:47.514Z",
-        "end": "2022-03-13T16:02:47.516Z",
-        "lastUpdate": "2022-03-13T16:02:47.516Z",
-        "error": null
-      },
-      {
-        "id": "02df931f-bb22-465b-9f76-d4a88519d6dd",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:02:50.8Z",
-        "end": "2022-03-13T16:02:50.801Z",
-        "lastUpdate": "2022-03-13T16:02:50.802Z",
-        "error": null
-      },
-      {
-        "id": "cb160be4-765e-48f0-b306-1b73d8129851",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:02:53.438Z",
-        "end": "2022-03-13T16:02:53.439Z",
-        "lastUpdate": "2022-03-13T16:02:53.439Z",
-        "error": null
-      },
-      {
-        "id": "d7be9eb4-3620-46b8-a4eb-e9ff1cf426b2",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:02:56.284Z",
-        "end": "2022-03-13T16:02:56.286Z",
-        "lastUpdate": "2022-03-13T16:02:56.287Z",
-        "error": null
-      },
-      {
-        "id": "3ddff3f1-687e-4f44-a57b-c6973bfe7320",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:02:58.795Z",
-        "end": "2022-03-13T16:02:58.796Z",
-        "lastUpdate": "2022-03-13T16:02:58.797Z",
-        "error": null
-      },
-      {
-        "id": "6b42955b-8981-42e5-bff6-179b366139a5",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:03:00.931Z",
-        "end": "2022-03-13T16:03:00.932Z",
-        "lastUpdate": "2022-03-13T16:03:00.933Z",
-        "error": null
-      },
-      {
-        "id": "cc47b9df-d0f7-44d1-ac5f-94bba8f0e0b2",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:03:04.095Z",
-        "end": "2022-03-13T16:03:04.099Z",
-        "lastUpdate": "2022-03-13T16:03:04.102Z",
-        "error": null
-      },
-      {
-        "id": "3a346472-7d63-4e2d-ab36-482bc82342be",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:03:09.982Z",
-        "end": "2022-03-13T16:03:09.983Z",
-        "lastUpdate": "2022-03-13T16:03:09.983Z",
-        "error": null
-      },
-      {
-        "id": "9951fdce-6c8a-4a02-a8a4-abf73822554f",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:03:12.485Z",
-        "end": "2022-03-13T16:03:12.487Z",
-        "lastUpdate": "2022-03-13T16:03:12.487Z",
-        "error": null
-      },
-      {
-        "id": "f5a99f39-a468-47ea-8111-8fc29e4a413c",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:03:15.912Z",
-        "end": "2022-03-13T16:03:15.913Z",
-        "lastUpdate": "2022-03-13T16:03:15.913Z",
-        "error": null
-      },
-      {
-        "id": "29b18b1e-8da8-44d2-ab1d-7dd1f7c40c2d",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:03:18.474Z",
-        "end": "2022-03-13T16:03:18.475Z",
-        "lastUpdate": "2022-03-13T16:03:18.476Z",
-        "error": null
-      },
-      {
-        "id": "feb2c3c8-a02f-40b8-8c9c-bcda6aa312ca",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:03:22.01Z",
-        "end": "2022-03-13T16:03:22.012Z",
-        "lastUpdate": "2022-03-13T16:03:22.014Z",
-        "error": null
-      },
-      {
-        "id": "eb1ce4a9-daa0-4a4d-862c-803eda43ee97",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:03:30.605Z",
-        "end": "2022-03-13T16:03:30.606Z",
-        "lastUpdate": "2022-03-13T16:03:30.607Z",
-        "error": null
-      },
-      {
-        "id": "84953de2-87f8-48b6-8ab2-231b055c7519",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:03:34.956Z",
-        "end": "2022-03-13T16:03:34.96Z",
-        "lastUpdate": "2022-03-13T16:03:34.961Z",
-        "error": null
-      },
-      {
-        "id": "0bd4e60f-7792-4a5f-9da0-726d29c4eefe",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:03:38.223Z",
-        "end": "2022-03-13T16:03:38.225Z",
-        "lastUpdate": "2022-03-13T16:03:38.226Z",
-        "error": null
-      },
-      {
-        "id": "331012df-d974-41a1-ae32-43916bee1e67",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:03:41.658Z",
-        "end": "2022-03-13T16:03:41.659Z",
-        "lastUpdate": "2022-03-13T16:03:41.663Z",
-        "error": null
-      },
-      {
-        "id": "dffa2c1e-551b-43f8-9a83-80c78ab5ef9c",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:03:47.864Z",
-        "end": "2022-03-13T16:03:47.865Z",
-        "lastUpdate": "2022-03-13T16:03:47.866Z",
-        "error": null
-      },
-      {
-        "id": "0de1cd77-41c9-4162-b373-9d47dc6d7ebd",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:03:50.872Z",
-        "end": "2022-03-13T16:03:50.873Z",
-        "lastUpdate": "2022-03-13T16:03:50.874Z",
-        "error": null
-      },
-      {
-        "id": "756aab3e-003e-418e-98d4-436398803a69",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:03:54.839Z",
-        "end": "2022-03-13T16:03:54.84Z",
-        "lastUpdate": "2022-03-13T16:03:54.841Z",
-        "error": null
-      },
-      {
-        "id": "e91a6002-0a59-4a95-be79-456e619d5653",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:03:57.199Z",
-        "end": "2022-03-13T16:03:57.2Z",
-        "lastUpdate": "2022-03-13T16:03:57.201Z",
-        "error": null
-      },
-      {
-        "id": "8c96ef9d-aa98-45f4-82ef-8a04e370eb67",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:05:18.042Z",
-        "end": "2022-03-13T16:05:18.045Z",
-        "lastUpdate": "2022-03-13T16:05:18.045Z",
-        "error": null
-      },
-      {
-        "id": "1897d7ab-ee7f-453b-9d97-2a8d5daf7bd9",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:05:26.027Z",
-        "end": "2022-03-13T16:05:26.028Z",
-        "lastUpdate": "2022-03-13T16:05:26.029Z",
-        "error": null
-      },
-      {
-        "id": "169b0138-22d0-46c1-8488-7fecf782ac78",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:05:30.76Z",
-        "end": "2022-03-13T16:05:30.761Z",
-        "lastUpdate": "2022-03-13T16:05:30.761Z",
-        "error": null
-      },
-      {
-        "id": "d4b5c9fe-824a-4cfd-9b38-e6e22f0cb56a",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:05:33.8Z",
-        "end": "2022-03-13T16:05:33.801Z",
-        "lastUpdate": "2022-03-13T16:05:33.801Z",
-        "error": null
-      },
-      {
-        "id": "ca7eb985-1a1d-4e4a-87b6-fffe67a69711",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:05:36.486Z",
-        "end": "2022-03-13T16:05:36.492Z",
-        "lastUpdate": "2022-03-13T16:05:36.493Z",
-        "error": null
-      },
-      {
-        "id": "44ec7a6b-b6d7-4553-ade2-5e53e618cf5c",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:06:31.689Z",
-        "end": "2022-03-13T16:06:31.691Z",
-        "lastUpdate": "2022-03-13T16:06:31.694Z",
-        "error": null
-      },
-      {
-        "id": "07eee0f6-a108-4f9c-8180-0794606db75b",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:07:04.874Z",
-        "end": "2022-03-13T16:07:04.875Z",
-        "lastUpdate": "2022-03-13T16:07:04.876Z",
-        "error": null
-      },
-      {
-        "id": "c36aa5b3-ccb7-47d3-96ce-82169c39f5f6",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:07:09.23Z",
-        "end": "2022-03-13T16:07:09.231Z",
-        "lastUpdate": "2022-03-13T16:07:09.231Z",
-        "error": null
-      },
-      {
-        "id": "663a3061-8702-4e0d-a274-c0a71ba0c222",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:07:14.814Z",
-        "end": "2022-03-13T16:07:14.817Z",
-        "lastUpdate": "2022-03-13T16:07:14.817Z",
-        "error": null
-      },
-      {
-        "id": "84d99b04-8a8d-457e-a114-2d77fc28a13a",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:09:45.002Z",
-        "end": "2022-03-13T16:09:45.006Z",
-        "lastUpdate": "2022-03-13T16:09:45.013Z",
-        "error": null
-      },
-      {
-        "id": "bc107aef-63b0-42e5-a531-a62cc1550d44",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:11:59.115Z",
-        "end": "2022-03-13T16:11:59.116Z",
-        "lastUpdate": "2022-03-13T16:11:59.117Z",
-        "error": null
-      },
-      {
-        "id": "4da36d4f-d8c7-4d78-aaf6-42ac71181aa4",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
-        "serviceUrl": "http://swf-greeting-persistence-monitoring-dashbuilder.kie-tooling-0ad6762cc85bcef5745bb684498c2436-0000.us-south.containers.appdomain.cloud",
-        "state": "COMPLETED",
-        "start": "2022-03-13T16:12:07.359Z",
-        "end": "2022-03-13T16:12:07.361Z",
-        "lastUpdate": "2022-03-13T16:12:07.361Z",
-        "error": null
-      },
-      {
-        "id": "f1fb4bb6-fc0d-4084-9731-6b258f5eb786",
-        "processId": "jsongreet",
-        "processName": "Greeting workflow",
... 14599 lines suppressed ...


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 02/27: KOGITO-8323: Refactor Settings according to UX redesign (#1404)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit db67ee42b83b2a09a5110d66c1c94c7b9da62366
Author: Fabrizio Antonangeli <fa...@gmail.com>
AuthorDate: Wed Jan 25 20:08:55 2023 +0100

    KOGITO-8323: Refactor Settings according to UX redesign (#1404)
    
    * KOGITO-8147 Refactor the app bar and menu according to UX redesign
    
    * refactor to function style
    
    * remove new home page
    
    * remove old home page
    
    * Updated OnlineEditorPage.tsx
    
    * Add Settings routes and Settings Nav sidebar
    
    * GitHubSettings page wip
    
    * Rename packages/serverless-logic-sandbox/src/settings/github/GitHubSettingsTab.tsx -> packages/serverless-logic-sandbox/src/settings/github/GitHubSettings.tsx
    
    * GitHubSettings page
    
    * Removed quickstart link after branching
    
    * add KieSandboxExtendedServicesSettings route
    
    * Fix expand content when sidebar is collapsed
    
    * Moved new settings routes to src/newSettings
    
    * Completing the new settings folder
    
    * WIP OpenShiftSettings
    
    * OpenShiftSettings page
    
    * Fix "setup" modal hidden by "add connection" modal
    
    * Fix: Can't perform a React state update on an unmounted component
    
    * Mv ServiceAccountSettingsTab -> ServiceAccountSettings
    
    * ServiceAccountSettings
    
    * R packages/serverless-logic-sandbox/src/newSettings/serviceRegistry/ServiceRegistrySettingsTab.tsx -> packages/serverless-logic-sandbox/src/newSettings/serviceRegistry/ServiceRegistrySettings.tsx
    
    * Refactor ServiceRegistrySettings
    
    * R packages/serverless-logic-sandbox/src/newSettings/kafka/ApacheKafkaSettingsTab.tsx -> packages/serverless-logic-sandbox/src/newSettings/kafka/ApacheKafkaSettings.tsx
    
    * Refactor ApacheKafkaSettings
    
    * R packages/serverless-logic-sandbox/src/newSettings/featurePreview/FeaturePreviewSettingsTab.tsx -> packages/serverless-logic-sandbox/src/newSettings/featurePreview/FeaturePreviewSettings.tsx
    
    * Refactor FeaturePreviewSettings
    
    * Sidebar title same as OpenShift Console
    
    * deleted:    packages/serverless-logic-sandbox/src/newSettings/SettingsModalBody.tsx
    removed settings modal related code
    
    * Fix Copyright
    
    * Add check not to show the loading in modal if we are in settings route
    
    * Removed unnecessary code for input focus
    
    * Code review
    
    * Fixed issues after merge conflicts
    
    * Fix issue after merge
    
    Co-authored-by: Xaiofeng Bai <bx...@gmail.com>
---
 packages/serverless-logic-web-tools/src/App.tsx    |   2 +
 .../src/homepage/pageTemplate/OnlineEditorPage.tsx |  16 +-
 .../src/navigation/Routes.ts                       |  12 +
 .../src/navigation/RoutesSwitch.tsx                |   6 +-
 .../src/newSettings/SettingsButton.tsx             |  35 +++
 .../{settings => newSettings}/SettingsContext.tsx  |  73 +----
 .../KieSandboxExtendedServicesSettings.tsx         | 273 ++++++++++++++++++
 .../featurePreview/FeaturePreviewConfig.tsx        |  42 +++
 .../featurePreview/FeaturePreviewSettings.tsx      |  72 +++++
 .../src/newSettings/github/GitHubSettings.tsx      | 239 +++++++++++++++
 .../src/newSettings/github/Hooks.tsx               |  34 +++
 .../src/newSettings/kafka/ApacheKafkaSettings.tsx  | 297 +++++++++++++++++++
 .../src/newSettings/kafka/KafkaSettingsConfig.tsx  |  70 +++++
 .../newSettings/openshift/OpenShiftSettings.tsx    | 151 ++++++++++
 .../openshift/OpenShiftSettingsConfig.tsx          |  58 ++++
 .../openshift/OpenShiftSettingsSimpleConfig.tsx    | 319 +++++++++++++++++++++
 .../src/newSettings/routes/SettingsPageRoutes.tsx  |  59 ++++
 .../serviceAccount/ServiceAccountConfig.tsx        |  66 +++++
 .../serviceAccount/ServiceAccountSettings.tsx      | 307 ++++++++++++++++++++
 .../serviceRegistry/ServiceRegistryConfig.tsx      |  66 +++++
 .../serviceRegistry/ServiceRegistrySettings.tsx    | 305 ++++++++++++++++++++
 .../src/newSettings/uiNav/SettingsPageNav.tsx      |  75 +++++
 .../src/settings/SettingsContext.tsx               |  14 +-
 .../static/resources/style.css                     |  12 +
 24 files changed, 2533 insertions(+), 70 deletions(-)

diff --git a/packages/serverless-logic-web-tools/src/App.tsx b/packages/serverless-logic-web-tools/src/App.tsx
index 540822c69c..eb5d51eb35 100644
--- a/packages/serverless-logic-web-tools/src/App.tsx
+++ b/packages/serverless-logic-web-tools/src/App.tsx
@@ -24,6 +24,7 @@ import { NavigationContextProvider } from "./navigation/NavigationContextProvide
 import { RoutesSwitch } from "./navigation/RoutesSwitch";
 import { OpenShiftContextProvider } from "./openshift/OpenShiftContextProvider";
 import { SettingsContextProvider } from "./settings/SettingsContext";
+import { SettingsContextProvider as NewSettingsContextProvider } from "./newSettings/SettingsContext";
 import { VirtualServiceRegistryContextProvider } from "./virtualServiceRegistry/VirtualServiceRegistryContextProvider";
 import { WorkspacesContextProvider } from "@kie-tools-core/workspaces-git-fs/dist/context/WorkspacesContextProvider";
 
@@ -35,6 +36,7 @@ export const App = () => (
       [EnvContextProvider, {}],
       [KieSandboxExtendedServicesContextProvider, {}],
       [SettingsContextProvider, {}],
+      [NewSettingsContextProvider, {}],
       [WorkspacesContextProvider, { workspacesSharedWorkerScriptUrl: "workspace/worker/sharedWorker.js" }],
       [OpenShiftContextProvider, {}],
       [VirtualServiceRegistryContextProvider, {}],
diff --git a/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx b/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
index 6f13f1ae49..7f55b5605a 100644
--- a/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
@@ -32,7 +32,7 @@ import {
   SkipToContent,
 } from "@patternfly/react-core";
 import { Page } from "@patternfly/react-core/dist/js/components/Page";
-import { useHistory } from "react-router";
+import { useHistory, useRouteMatch } from "react-router";
 import { KieSandboxExtendedServicesIcon } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesIcon";
 import { useRoutes } from "../../navigation/Hooks";
 import { OpenshiftDeploymentsDropdown } from "../../openshift/dropdown/OpenshiftDeploymentsDropdown";
@@ -40,6 +40,7 @@ import { SettingsButton } from "../../settings/SettingsButton";
 import { HomePageNav } from "../uiNav/HomePageNav";
 import { useLocation } from "react-router-dom";
 import { useState } from "react";
+import { SettingsPageNav } from "../../newSettings/uiNav/SettingsPageNav";
 import { Tooltip } from "@patternfly/react-core/dist/js/components/Tooltip";
 import { ExclamationIcon, BarsIcon } from "@patternfly/react-icons/dist/js/icons";
 
@@ -47,6 +48,7 @@ export function OnlineEditorPage(props: { children?: React.ReactNode }) {
   const history = useHistory();
   const routes = useRoutes();
   const [isNavOpen, setIsNavOpen] = useState(true);
+  const isRouteInSettingsSection = useRouteMatch(routes.settings.home.path({}));
   const navToggle = () => {
     setIsNavOpen(!isNavOpen);
   };
@@ -127,9 +129,17 @@ export function OnlineEditorPage(props: { children?: React.ReactNode }) {
   );
   const location = useLocation();
 
-  const sidebar = (
-    <PageSidebar nav={<HomePageNav pathname={location.pathname}></HomePageNav>} isNavOpen={isNavOpen} theme="dark" />
+  const pageNav = useMemo(
+    () =>
+      !isRouteInSettingsSection ? (
+        <HomePageNav pathname={location.pathname}></HomePageNav>
+      ) : (
+        <SettingsPageNav pathname={location.pathname}></SettingsPageNav>
+      ),
+    [location, isRouteInSettingsSection]
   );
+
+  const sidebar = <PageSidebar nav={pageNav} isNavOpen={isNavOpen} theme="dark" />;
   const mainContainerId = "main-content-page-layout-tertiary-nav";
 
   const pageSkipToContent = <SkipToContent href={`#${mainContainerId}`}>Skip to content</SkipToContent>;
diff --git a/packages/serverless-logic-web-tools/src/navigation/Routes.ts b/packages/serverless-logic-web-tools/src/navigation/Routes.ts
index 54189fd1c6..b62375e791 100644
--- a/packages/serverless-logic-web-tools/src/navigation/Routes.ts
+++ b/packages/serverless-logic-web-tools/src/navigation/Routes.ts
@@ -15,6 +15,7 @@
  */
 
 const IS_HASH_ROUTER = true;
+const SETTINGS_ROUTE = "/settings";
 
 export enum QueryParams {
   SETTINGS = "settings",
@@ -128,6 +129,17 @@ export const routes = {
       `/${workspaceId}/file/${fileRelativePath}${extension ? "." + extension : ""}`
   ),
 
+  settings: {
+    home: new Route<{}>(() => SETTINGS_ROUTE),
+    github: new Route<{}>(() => `${SETTINGS_ROUTE}/github`),
+    openshift: new Route<{}>(() => `${SETTINGS_ROUTE}/openshift`),
+    kie_sandbox_extended_services: new Route<{}>(() => `${SETTINGS_ROUTE}/kie_sandbox_extended_services`),
+    service_account: new Route<{}>(() => `${SETTINGS_ROUTE}/serviceAccount`),
+    service_registry: new Route<{}>(() => `${SETTINGS_ROUTE}/serviceRegistry`),
+    kafka: new Route<{}>(() => `${SETTINGS_ROUTE}/kafka`),
+    feature_preview: new Route<{}>(() => `${SETTINGS_ROUTE}/featurePreview`),
+  },
+
   static: {
     sample: new Route<{ pathParams: "type" | "name" }>(({ type, name }) => `samples/${name}/${name}.${type}`),
     images: {
diff --git a/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx b/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx
index 686c59fd1b..004b9837b9 100644
--- a/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx
+++ b/packages/serverless-logic-web-tools/src/navigation/RoutesSwitch.tsx
@@ -16,14 +16,16 @@
 
 import * as React from "react";
 import { useMemo } from "react";
-import { Route, Switch } from "react-router-dom";
+import { Route, Switch, useRouteMatch } from "react-router-dom";
 import { useRoutes } from "./Hooks";
 import { OnlineEditorPage } from "../homepage/pageTemplate/OnlineEditorPage";
 import { Label } from "@patternfly/react-core/dist/js/components/Label";
 import { HomePageRoutes } from "../homepage/routes/HomePageRoutes";
+import { SettingsPageRoutes } from "../newSettings/routes/SettingsPageRoutes";
 
 export function RoutesSwitch() {
   const routes = useRoutes();
+  const isRouteInSettingsSection = useRouteMatch(routes.settings.home.path({}));
   const buildInfo = useMemo(() => {
     return process.env["WEBPACK_REPLACE__buildInfo"];
   }, []);
@@ -44,7 +46,7 @@ export function RoutesSwitch() {
   }) => {
     return (
       <OnlineEditorPage>
-        <HomePageRoutes />
+        {!isRouteInSettingsSection ? <HomePageRoutes /> : <SettingsPageRoutes />}
         {buildInfo && (
           <div className={"kie-tools--build-info"}>
             <Label>{buildInfo}</Label>
diff --git a/packages/serverless-logic-web-tools/src/newSettings/SettingsButton.tsx b/packages/serverless-logic-web-tools/src/newSettings/SettingsButton.tsx
new file mode 100644
index 0000000000..7b1cde4e00
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/newSettings/SettingsButton.tsx
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2021 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
+import { CogIcon } from "@patternfly/react-icons/dist/js/icons/cog-icon";
+import { useSettingsDispatch } from "./SettingsContext";
+import { Link } from "react-router-dom";
+import { useRoutes } from "../navigation/Hooks";
+
+export function SettingsButton() {
+  const settingsDispatch = useSettingsDispatch();
+  const routes = useRoutes();
+
+  return (
+    <Link to={routes.settings.home.path({})}>
+      <Button variant={ButtonVariant.plain} aria-label="Settings" className={"kie-tools--masthead-hoverable-dark"}>
+        <CogIcon />
+      </Button>
+    </Link>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx b/packages/serverless-logic-web-tools/src/newSettings/SettingsContext.tsx
similarity index 84%
copy from packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx
copy to packages/serverless-logic-web-tools/src/newSettings/SettingsContext.tsx
index 242e71c961..76a2eeb0bf 100644
--- a/packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx
+++ b/packages/serverless-logic-web-tools/src/newSettings/SettingsContext.tsx
@@ -1,5 +1,5 @@
 /*
- * Copyright 2021 Red Hat, Inc. and/or its affiliates.
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,30 +14,25 @@
  * limitations under the License.
  */
 
+import { OpenShiftConnection } from "@kie-tools-core/openshift/dist/service/OpenShiftConnection";
+import { OpenShiftService } from "@kie-tools-core/openshift/dist/service/OpenShiftService";
+import { Octokit } from "@octokit/rest";
 import * as React from "react";
-import { useCallback, useContext, useEffect, useMemo, useState } from "react";
+import { useContext, useEffect, useMemo, useState } from "react";
 import { getCookie, setCookie } from "../cookies";
-import { Octokit } from "@octokit/rest";
-import { useQueryParams } from "../queryParams/QueryParamsContext";
-import { Modal, ModalVariant } from "@patternfly/react-core/dist/js/components/Modal";
-import { SettingsModalBody, SettingsTabs } from "./SettingsModalBody";
-import { readOpenShiftConfigCookie } from "./openshift/OpenShiftSettingsConfig";
-import { OpenShiftConnection } from "@kie-tools-core/openshift/dist/service/OpenShiftConnection";
+import { SwfServiceCatalogStore } from "../editor/api/SwfServiceCatalogStore";
+import { useKieSandboxExtendedServices } from "../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
+import { KieSandboxExtendedServicesStatus } from "../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
 import { OpenShiftInstanceStatus } from "../openshift/OpenShiftInstanceStatus";
-import { OpenShiftService } from "@kie-tools-core/openshift/dist/service/OpenShiftService";
-import { useHistory } from "react-router";
-import { QueryParams } from "../navigation/Routes";
-import { GITHUB_AUTH_TOKEN_COOKIE_NAME } from "./github/GitHubSettingsTab";
+import { FeaturePreviewSettingsConfig, readFeaturePreviewConfigCookie } from "./featurePreview/FeaturePreviewConfig";
+import { GITHUB_AUTH_TOKEN_COOKIE_NAME } from "./github/GitHubSettings";
 import { KafkaSettingsConfig, readKafkaConfigCookie } from "./kafka/KafkaSettingsConfig";
+import { readOpenShiftConfigCookie } from "./openshift/OpenShiftSettingsConfig";
 import { readServiceAccountConfigCookie, ServiceAccountSettingsConfig } from "./serviceAccount/ServiceAccountConfig";
 import {
   readServiceRegistryConfigCookie,
   ServiceRegistrySettingsConfig,
 } from "./serviceRegistry/ServiceRegistryConfig";
-import { useKieSandboxExtendedServices } from "../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
-import { KieSandboxExtendedServicesStatus } from "../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
-import { SwfServiceCatalogStore } from "../editor/api/SwfServiceCatalogStore";
-import { FeaturePreviewSettingsConfig, readFeaturePreviewConfigCookie } from "./featurePreview/FeaturePreviewConfig";
 
 export enum AuthStatus {
   SIGNED_OUT,
@@ -69,8 +64,6 @@ export class ExtendedServicesConfig {
 }
 
 export interface SettingsContextType {
-  isOpen: boolean;
-  activeTab: SettingsTabs;
   openshift: {
     status: OpenShiftInstanceStatus;
     config: OpenShiftConnection;
@@ -99,8 +92,6 @@ export interface SettingsContextType {
 }
 
 export interface SettingsDispatchContextType {
-  open: (activeTab?: SettingsTabs) => void;
-  close: () => void;
   openshift: {
     service: OpenShiftService;
     setStatus: React.Dispatch<React.SetStateAction<OpenShiftInstanceStatus>>;
@@ -132,31 +123,6 @@ export const SettingsContext = React.createContext<SettingsContextType>({} as an
 export const SettingsDispatchContext = React.createContext<SettingsDispatchContextType>({} as any);
 
 export function SettingsContextProvider(props: any) {
-  const queryParams = useQueryParams();
-  const history = useHistory();
-  const [isOpen, setOpen] = useState(false);
-  const [activeTab, setActiveTab] = useState(SettingsTabs.GITHUB);
-
-  useEffect(() => {
-    setOpen(queryParams.has(QueryParams.SETTINGS));
-    setActiveTab((queryParams.get(QueryParams.SETTINGS) as SettingsTabs) ?? SettingsTabs.GITHUB);
-  }, [queryParams]);
-
-  const open = useCallback(
-    (activeTab = SettingsTabs.GITHUB) => {
-      history.replace({
-        search: queryParams.with(QueryParams.SETTINGS, activeTab).toString(),
-      });
-    },
-    [history, queryParams]
-  );
-
-  const close = useCallback(() => {
-    history.replace({
-      search: queryParams.without(QueryParams.SETTINGS).toString(),
-    });
-  }, [history, queryParams]);
-
   //github
   const [githubAuthStatus, setGitHubAuthStatus] = useState(AuthStatus.LOADING);
   const [githubOctokit, setGitHubOctokit] = useState<Octokit>(new Octokit());
@@ -256,8 +222,6 @@ export function SettingsContextProvider(props: any) {
 
   const dispatch = useMemo(() => {
     return {
-      open,
-      close,
       openshift: {
         service: openshiftService,
         setStatus: setOpenshiftStatus,
@@ -285,10 +249,8 @@ export function SettingsContextProvider(props: any) {
       },
     };
   }, [
-    close,
     githubAuthService,
     githubOctokit,
-    open,
     openshiftService,
     kieSandboxExtendedServices.saveNewConfig,
     serviceCatalogStore,
@@ -296,8 +258,6 @@ export function SettingsContextProvider(props: any) {
 
   const value = useMemo(() => {
     return {
-      isOpen,
-      activeTab,
       openshift: {
         status: openshiftStatus,
         config: openshiftConfig,
@@ -325,8 +285,6 @@ export function SettingsContextProvider(props: any) {
       },
     };
   }, [
-    isOpen,
-    activeTab,
     openshiftStatus,
     openshiftConfig,
     githubAuthStatus,
@@ -342,14 +300,7 @@ export function SettingsContextProvider(props: any) {
 
   return (
     <SettingsContext.Provider value={value}>
-      <SettingsDispatchContext.Provider value={dispatch}>
-        {githubAuthStatus !== AuthStatus.LOADING && <>{props.children}</>}
-        <Modal title="Settings" isOpen={isOpen} onClose={close} variant={ModalVariant.large}>
-          <div style={{ height: "calc(100vh * 0.5)" }} className={"kie-tools--settings-modal-content"}>
-            <SettingsModalBody />
-          </div>
-        </Modal>
-      </SettingsDispatchContext.Provider>
+      <SettingsDispatchContext.Provider value={dispatch}>{props.children}</SettingsDispatchContext.Provider>
     </SettingsContext.Provider>
   );
 }
diff --git a/packages/serverless-logic-web-tools/src/newSettings/extendedServices/KieSandboxExtendedServicesSettings.tsx b/packages/serverless-logic-web-tools/src/newSettings/extendedServices/KieSandboxExtendedServicesSettings.tsx
new file mode 100644
index 0000000000..4e163afd88
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/newSettings/extendedServices/KieSandboxExtendedServicesSettings.tsx
@@ -0,0 +1,273 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { Modal, ModalVariant } from "@patternfly/react-core";
+import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
+import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
+import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
+import { ActionGroup, Form, FormAlert, FormGroup } from "@patternfly/react-core/dist/js/components/Form";
+import { InputGroup, InputGroupText } from "@patternfly/react-core/dist/js/components/InputGroup";
+import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
+import { Popover } from "@patternfly/react-core/dist/js/components/Popover";
+import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
+import { TextInput } from "@patternfly/react-core/dist/js/components/TextInput";
+import { AddCircleOIcon } from "@patternfly/react-icons";
+import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-circle-icon";
+import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
+import { TimesIcon } from "@patternfly/react-icons/dist/js/icons/times-icon";
+import * as React from "react";
+import { useCallback, useMemo, useState } from "react";
+import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
+import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
+import { ExtendedServicesConfig, useSettings, useSettingsDispatch } from "../../settings/SettingsContext";
+
+export function KieSandboxExtendedServicesSettings() {
+  const settings = useSettings();
+  const settingsDispatch = useSettingsDispatch();
+  const kieSandboxExtendedServices = useKieSandboxExtendedServices();
+  const [config, setConfig] = useState(settings.kieSandboxExtendedServices.config);
+  const [isModalOpen, setIsModalOpen] = useState(false);
+
+  const isCurrentConfigValid = useMemo(
+    () => config.host.trim().length > 0 && config.buildUrl().trim().length > 0,
+    [config]
+  );
+
+  const onClearHost = useCallback(() => setConfig(new ExtendedServicesConfig("", config.port)), [config]);
+  const onClearPort = useCallback(() => setConfig(new ExtendedServicesConfig(config.host, "")), [config]);
+
+  const onHostChanged = useCallback(
+    (newValue: string) => setConfig(new ExtendedServicesConfig(newValue, config.port)),
+    [config]
+  );
+  const onPortChanged = useCallback(
+    (newValue: string) => setConfig(new ExtendedServicesConfig(config.host, newValue)),
+    [config]
+  );
+
+  const onConnect = useCallback(() => {
+    settingsDispatch.kieSandboxExtendedServices.setConfig(config);
+  }, [settingsDispatch.kieSandboxExtendedServices, config]);
+
+  const onReset = useCallback(() => {
+    const emptyConfig = new ExtendedServicesConfig("", "");
+    setConfig(emptyConfig);
+    settingsDispatch.kieSandboxExtendedServices.setConfig(emptyConfig);
+  }, [settingsDispatch.kieSandboxExtendedServices]);
+
+  const handleModalToggle = useCallback(() => {
+    setIsModalOpen((prevIsModalOpen) => !prevIsModalOpen);
+  }, []);
+
+  return (
+    <Page>
+      <PageSection variant={"light"} isWidthLimited>
+        <TextContent>
+          <Text component={TextVariants.h1}>KIE Sandbox Extended Services</Text>
+          <Text component={TextVariants.p}>
+            Data you provide here is necessary for proxying Serverless Logic Web Tools requests to OpenShift, thus
+            making it possible to deploy models.
+            <br /> All information is locally stored in your browser and never shared with anyone.
+          </Text>
+        </TextContent>
+      </PageSection>
+
+      <PageSection isFilled>
+        <PageSection variant={"light"}>
+          {kieSandboxExtendedServices.status === KieSandboxExtendedServicesStatus.RUNNING ? (
+            <EmptyState>
+              <EmptyStateIcon icon={CheckCircleIcon} color={"var(--pf-global--success-color--100)"} />
+              <TextContent>
+                <Text component={"h2"}>You are connect to the KIE Sandbox Extended Services.</Text>
+              </TextContent>
+              <EmptyStateBody>
+                Deploying models is <b>enabled</b>.
+                <br />
+                <b>URL: </b>
+                <i>{config.buildUrl()}</i>
+                <br />
+                <br />
+                <Button variant={ButtonVariant.secondary} onClick={onReset}>
+                  Reset
+                </Button>
+              </EmptyStateBody>
+            </EmptyState>
+          ) : (
+            <>
+              <EmptyState>
+                <EmptyStateIcon icon={AddCircleOIcon} />
+                <TextContent>
+                  <Text component={"h2"}>You are not connected to KIE Sandbox Extended Services.</Text>
+                </TextContent>
+                <EmptyStateBody>
+                  You currently have no KIE Sandbox Extended Services connections.{" "}
+                  <a
+                    onClick={() => {
+                      kieSandboxExtendedServices.setInstallTriggeredBy(undefined);
+                      kieSandboxExtendedServices.setModalOpen(true);
+                    }}
+                  >
+                    Click to setup
+                  </a>
+                  <br />
+                  <br />
+                  <Button
+                    variant={ButtonVariant.primary}
+                    onClick={handleModalToggle}
+                    data-testid="add-connection-button"
+                  >
+                    Add connection
+                  </Button>
+                </EmptyStateBody>
+              </EmptyState>
+            </>
+          )}
+        </PageSection>
+      </PageSection>
+
+      <Modal
+        title="Add connection"
+        isOpen={
+          isModalOpen &&
+          kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.RUNNING &&
+          !kieSandboxExtendedServices.isModalOpen
+        }
+        onClose={handleModalToggle}
+        variant={ModalVariant.large}
+      >
+        <Form>
+          <FormAlert>
+            <Alert
+              variant="danger"
+              title={
+                <Text>
+                  You are not connected to KIE Sandbox Extended Services.{" "}
+                  <a
+                    onClick={() => {
+                      kieSandboxExtendedServices.setInstallTriggeredBy(undefined);
+                      kieSandboxExtendedServices.setModalOpen(true);
+                    }}
+                  >
+                    Click to setup
+                  </a>
+                </Text>
+              }
+              aria-live="polite"
+              isInline
+            />
+          </FormAlert>
+          <PageSection variant={"light"} isFilled={true} style={{ height: "100%" }}>
+            <FormGroup
+              label={"Host"}
+              labelIcon={
+                <Popover bodyContent={"The host associated with the KIE Sandbox Extended Services URL instance."}>
+                  <button
+                    type="button"
+                    aria-label="More info for host field"
+                    onClick={(e) => e.preventDefault()}
+                    aria-describedby="host-server-field"
+                    className="pf-c-form__group-label-help"
+                  >
+                    <HelpIcon noVerticalAlign />
+                  </button>
+                </Popover>
+              }
+              isRequired
+              fieldId="host-server-field"
+            >
+              <InputGroup className="pf-u-mt-sm">
+                <TextInput
+                  autoComplete={"off"}
+                  isRequired
+                  type="text"
+                  id="host-server-field"
+                  name="host-server-field"
+                  aria-label="Host field"
+                  aria-describedby="host-server-field-helper"
+                  value={config.host}
+                  onChange={onHostChanged}
+                  tabIndex={1}
+                  data-testid="host-text-field"
+                />
+                <InputGroupText>
+                  <Button isSmall variant="plain" aria-label="Clear host button" onClick={onClearHost}>
+                    <TimesIcon />
+                  </Button>
+                </InputGroupText>
+              </InputGroup>
+            </FormGroup>
+            <FormGroup
+              label={"Port"}
+              labelIcon={
+                <Popover
+                  bodyContent={"The port number associated with the KIE Sandbox Extended Services URL instance."}
+                >
+                  <button
+                    type="button"
+                    aria-label="More info for port field"
+                    onClick={(e) => e.preventDefault()}
+                    aria-describedby="port-field"
+                    className="pf-c-form__group-label-help"
+                  >
+                    <HelpIcon noVerticalAlign />
+                  </button>
+                </Popover>
+              }
+              isRequired
+              fieldId="port-field"
+            >
+              <InputGroup className="pf-u-mt-sm">
+                <TextInput
+                  autoComplete={"off"}
+                  isRequired
+                  type="text"
+                  id="port-field"
+                  name="port-field"
+                  aria-label="Port field"
+                  aria-describedby="port-field-helper"
+                  value={config.port}
+                  onChange={onPortChanged}
+                  tabIndex={2}
+                  data-testid="port-text-field"
+                />
+                <InputGroupText>
+                  <Button isSmall variant="plain" aria-label="Clear port button" onClick={onClearPort}>
+                    <TimesIcon />
+                  </Button>
+                </InputGroupText>
+              </InputGroup>
+            </FormGroup>
+            <ActionGroup>
+              <Button
+                isDisabled={!isCurrentConfigValid}
+                id="kie-sandbox-extended-services-config-connect-button"
+                key="connect"
+                variant="primary"
+                onClick={onConnect}
+                data-testid="connect-config-button"
+              >
+                Connect
+              </Button>
+              <Button key="cancel" variant="link" onClick={handleModalToggle} data-testid="connect-cancel-button">
+                Connect
+              </Button>
+            </ActionGroup>
+          </PageSection>
+        </Form>
+      </Modal>
+    </Page>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/featurePreview/FeaturePreviewConfig.tsx b/packages/serverless-logic-web-tools/src/newSettings/featurePreview/FeaturePreviewConfig.tsx
new file mode 100644
index 0000000000..36cce4c180
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/newSettings/featurePreview/FeaturePreviewConfig.tsx
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { getCookie, makeCookieName, setCookie } from "../../cookies";
+
+export const FEATURE_PREVIEW_STUNNER_ENABLED_COOKIE_NAME = makeCookieName("feature-preview", "stunner-enabled");
+
+export interface FeaturePreviewSettingsConfig {
+  stunnerEnabled: boolean;
+}
+
+export const DEFAULT_CONFIG: FeaturePreviewSettingsConfig = {
+  stunnerEnabled: true,
+};
+
+export function readFeaturePreviewConfigCookie(): FeaturePreviewSettingsConfig {
+  const stunnerEnabledCookie = getCookie(FEATURE_PREVIEW_STUNNER_ENABLED_COOKIE_NAME);
+  return {
+    stunnerEnabled: stunnerEnabledCookie ? stunnerEnabledCookie === "true" : DEFAULT_CONFIG.stunnerEnabled,
+  };
+}
+
+export function saveStunnerEnabledCookie(isEnabled: boolean): void {
+  setCookie(FEATURE_PREVIEW_STUNNER_ENABLED_COOKIE_NAME, String(isEnabled));
+}
+
+export function saveConfigCookie(config: FeaturePreviewSettingsConfig): void {
+  saveStunnerEnabledCookie(config.stunnerEnabled);
+}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/featurePreview/FeaturePreviewSettings.tsx b/packages/serverless-logic-web-tools/src/newSettings/featurePreview/FeaturePreviewSettings.tsx
new file mode 100644
index 0000000000..4b28dc3182
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/newSettings/featurePreview/FeaturePreviewSettings.tsx
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import * as React from "react";
+import { Form } from "@patternfly/react-core/dist/js/components/Form";
+import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
+import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
+import { useCallback, useEffect, useState } from "react";
+import { useSettings, useSettingsDispatch } from "../SettingsContext";
+import { Checkbox } from "@patternfly/react-core/dist/js/components/Checkbox";
+import { saveConfigCookie } from "./FeaturePreviewConfig";
+
+export function FeaturePreviewSettings() {
+  const settings = useSettings();
+  const settingsDispatch = useSettingsDispatch();
+  const [config, setConfig] = useState(settings.featurePreview.config);
+  const [stunnerEnabled, setStunnerEnabled] = useState(config.stunnerEnabled);
+
+  useEffect(() => {
+    settingsDispatch.featurePreview.setConfig(config);
+    saveConfigCookie(config);
+  }, [config, settingsDispatch.featurePreview]);
+
+  const onStunnerEnabledChanged = useCallback(
+    (isEnabled: boolean) => {
+      setStunnerEnabled(isEnabled);
+      setConfig({ ...config, stunnerEnabled: isEnabled });
+    },
+    [config]
+  );
+
+  return (
+    <Page>
+      <PageSection variant={"light"} isWidthLimited>
+        <TextContent>
+          <Text component={TextVariants.h1}>Feature Preview</Text>
+          <Text component={TextVariants.p}>
+            Data you provide here is necessary for configuring the preview of features that are not fully supported yet.
+            <br /> All information is locally stored in your browser and never shared with anyone.
+          </Text>
+        </TextContent>
+      </PageSection>
+
+      <PageSection>
+        <PageSection variant={"light"}>
+          <Form>
+            <Checkbox
+              id="feature-preview-enable-stunner"
+              label="Kogito Serverless Workflow Visualization"
+              description={"Enable/disable Kogito Serverless Workflow Visualization for JSON files."}
+              isChecked={stunnerEnabled}
+              onChange={onStunnerEnabledChanged}
+            />
+          </Form>
+        </PageSection>
+      </PageSection>
+    </Page>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/github/GitHubSettings.tsx b/packages/serverless-logic-web-tools/src/newSettings/github/GitHubSettings.tsx
new file mode 100644
index 0000000000..bd3be0578f
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/newSettings/github/GitHubSettings.tsx
@@ -0,0 +1,239 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { Modal, ModalVariant } from "@patternfly/react-core";
+import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
+import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
+import { Form, FormGroup } from "@patternfly/react-core/dist/js/components/Form";
+import { InputGroup } from "@patternfly/react-core/dist/js/components/InputGroup";
+import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
+import { Spinner } from "@patternfly/react-core/dist/js/components/Spinner";
+import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
+import { TextInput } from "@patternfly/react-core/dist/js/components/TextInput";
+import { AddCircleOIcon } from "@patternfly/react-icons";
+import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-circle-icon";
+import { ExclamationTriangleIcon } from "@patternfly/react-icons/dist/js/icons/exclamation-triangle-icon";
+import { ExternalLinkAltIcon } from "@patternfly/react-icons/dist/js/icons/external-link-alt-icon";
+import { GithubIcon } from "@patternfly/react-icons/dist/js/icons/github-icon";
+import * as React from "react";
+import { useCallback, useMemo, useRef, useState } from "react";
+import { makeCookieName } from "../../cookies";
+import { AuthStatus, useSettings, useSettingsDispatch } from "../../settings/SettingsContext";
+
+export const GITHUB_OAUTH_TOKEN_SIZE = 40;
+export const GITHUB_TOKENS_URL = "https://github.com/settings/tokens";
+export const GITHUB_TOKENS_HOW_TO_URL =
+  "https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line";
+export const GITHUB_AUTH_TOKEN_COOKIE_NAME = makeCookieName("github", "oauth-token");
+
+export enum GitHubSignInOption {
+  PERSONAL_ACCESS_TOKEN,
+  OAUTH,
+}
+
+enum GitHubTokenScope {
+  GIST = "gist",
+  REPO = "repo",
+}
+
+export function GitHubSettings() {
+  const settings = useSettings();
+  const settingsDispatch = useSettingsDispatch();
+
+  const [potentialGitHubToken, setPotentialGitHubToken] = useState<string | undefined>(undefined);
+  const [isGitHubTokenValid, setIsGitHubTokenValid] = useState(true);
+  const [isModalOpen, setIsModalOpen] = useState(false);
+  const tokenInput = useRef<HTMLInputElement>(null);
+
+  const githubTokenValidated = useMemo(() => {
+    return isGitHubTokenValid ? "default" : "error";
+  }, [isGitHubTokenValid]);
+
+  const githubTokenHelperText = useMemo(() => {
+    return isGitHubTokenValid ? undefined : "Invalid token. Check if it has the 'repo' scope.";
+  }, [isGitHubTokenValid]);
+
+  const githubTokenToDisplay = useMemo(() => {
+    return obfuscate(potentialGitHubToken ?? settings.github.token) ?? "";
+  }, [settings.github, potentialGitHubToken]);
+
+  const handleModalToggle = useCallback(() => {
+    setPotentialGitHubToken(undefined);
+    setIsGitHubTokenValid(true);
+    setIsModalOpen((prevIsModalOpen) => !prevIsModalOpen);
+  }, []);
+
+  const onPasteGitHubToken = useCallback(
+    (e) => {
+      const token = e.clipboardData.getData("text/plain").slice(0, GITHUB_OAUTH_TOKEN_SIZE);
+      setPotentialGitHubToken(token);
+      settingsDispatch.github.authService
+        .authenticate(token)
+        .then(() => handleModalToggle())
+        .catch(() => setIsGitHubTokenValid(false));
+    },
+    [settingsDispatch.github.authService, handleModalToggle]
+  );
+
+  const onSignOutFromGitHub = useCallback(() => {
+    settingsDispatch.github.authService.reset();
+    setPotentialGitHubToken(undefined);
+  }, [settingsDispatch.github.authService]);
+
+  return (
+    <Page>
+      <PageSection variant={"light"}>
+        <TextContent>
+          <Text component={TextVariants.h1}>GitHub</Text>
+          <Text component={TextVariants.p}>
+            Data you provide here is necessary for creating repositories containing models you design, and syncing
+            changes with GitHub.
+            <br />
+            All information is locally stored in your browser and never shared with anyone.
+          </Text>
+        </TextContent>
+      </PageSection>
+
+      <PageSection isFilled>
+        <PageSection variant={"light"}>
+          {settings.github.authStatus === AuthStatus.TOKEN_EXPIRED && (
+            <EmptyState>
+              <EmptyStateIcon icon={ExclamationTriangleIcon} />
+              <TextContent>
+                <Text component={"h2"}>GitHub Token expired</Text>
+              </TextContent>
+              <EmptyStateBody>
+                <TextContent>Reset your token to sign in with GitHub again.</TextContent>
+              </EmptyStateBody>
+              <br />
+              <Button variant={ButtonVariant.secondary} onClick={onSignOutFromGitHub}>
+                Reset
+              </Button>
+            </EmptyState>
+          )}
+          {settings.github.authStatus === AuthStatus.LOADING && (
+            <EmptyState>
+              <EmptyStateIcon icon={GithubIcon} />
+              <TextContent>
+                <Text component={"h2"}>Signing in with GitHub</Text>
+              </TextContent>
+              <br />
+              <br />
+              <Spinner />
+            </EmptyState>
+          )}
+          {settings.github.authStatus === AuthStatus.SIGNED_IN && (
+            <EmptyState>
+              <EmptyStateIcon icon={CheckCircleIcon} color={"var(--pf-global--success-color--100)"} />
+              <TextContent>
+                <Text component={"h2"}>{"You're signed in with GitHub."}</Text>
+              </TextContent>
+              <EmptyStateBody>
+                Gists are <b>{settings.github.scopes?.includes(GitHubTokenScope.GIST) ? "enabled" : "disabled"}.</b>
+                <br />
+                Private repositories are{" "}
+                <b>{settings.github.scopes?.includes(GitHubTokenScope.REPO) ? "enabled" : "disabled"}.</b>
+                <br />
+                <b>Token: </b>
+                <i>{obfuscate(settings.github.token)}</i>
+                <br />
+                <b>User: </b>
+                <i>{settings.github.user?.login}</i>
+                <br />
+                <b>Scope: </b>
+                <i>{settings.github.scopes?.join(", ") || "(none)"}</i>
+              </EmptyStateBody>
+              <br />
+              <Button variant={ButtonVariant.secondary} onClick={onSignOutFromGitHub}>
+                Sign out
+              </Button>
+            </EmptyState>
+          )}
+          {settings.github.authStatus === AuthStatus.SIGNED_OUT && (
+            <EmptyState>
+              <EmptyStateIcon icon={AddCircleOIcon} />
+              <TextContent>
+                <Text component={"h2"}>{"No access token"}</Text>
+              </TextContent>
+              <EmptyStateBody>
+                You currently have no tokens to display. Access tokens allow you for creating repositories containing
+                models you design, and syncing changes with GitHub.
+              </EmptyStateBody>
+              <Button variant={ButtonVariant.primary} onClick={handleModalToggle}>
+                Add access token
+              </Button>
+            </EmptyState>
+          )}
+        </PageSection>
+      </PageSection>
+
+      <Modal
+        title="Create new token"
+        isOpen={isModalOpen && settings.github.authStatus !== AuthStatus.LOADING}
+        onClose={handleModalToggle}
+        variant={ModalVariant.large}
+      >
+        <Form onSubmit={(e) => e.preventDefault()}>
+          <h3>
+            <a href={GITHUB_TOKENS_URL} target={"_blank"} rel="noopener noreferrer">
+              Create a new token&nbsp;&nbsp;
+              <ExternalLinkAltIcon />
+            </a>
+          </h3>
+          <FormGroup
+            isRequired={true}
+            helperTextInvalid={githubTokenHelperText}
+            validated={githubTokenValidated}
+            label={"Token"}
+            fieldId={"github-pat"}
+            helperText={"Your token must include the 'repo' scope."}
+          >
+            <InputGroup>
+              <TextInput
+                ref={tokenInput}
+                autoComplete={"off"}
+                id="token-input"
+                name="tokenInput"
+                aria-describedby="token-text-input-helper"
+                placeholder={"Paste your GitHub token here"}
+                maxLength={GITHUB_OAUTH_TOKEN_SIZE}
+                validated={githubTokenValidated}
+                value={githubTokenToDisplay}
+                onPaste={onPasteGitHubToken}
+                tabIndex={1}
+              />
+            </InputGroup>
+          </FormGroup>
+          <br />
+        </Form>
+      </Modal>
+    </Page>
+  );
+}
+
+export function obfuscate(token?: string) {
+  if (!token) {
+    return undefined;
+  }
+
+  if (token.length <= 8) {
+    return token;
+  }
+
+  const stars = new Array(token.length - 8).join("*");
+  const pieceToObfuscate = token.substring(4, token.length - 4);
+  return token.replace(pieceToObfuscate, stars);
+}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/github/Hooks.tsx b/packages/serverless-logic-web-tools/src/newSettings/github/Hooks.tsx
new file mode 100644
index 0000000000..f05fde5cd4
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/newSettings/github/Hooks.tsx
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2021 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { useMemo } from "react";
+import { AuthStatus, useSettings } from "../SettingsContext";
+
+export function useGitHubAuthInfo() {
+  const settings = useSettings();
+  return useMemo(() => {
+    if (settings.github.authStatus !== AuthStatus.SIGNED_IN) {
+      return undefined;
+    }
+
+    return {
+      name: settings.github.user!.name,
+      email: settings.github.user!.email,
+      username: settings.github.user!.login,
+      password: settings.github.token!,
+    };
+  }, [settings.github]);
+}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/kafka/ApacheKafkaSettings.tsx b/packages/serverless-logic-web-tools/src/newSettings/kafka/ApacheKafkaSettings.tsx
new file mode 100644
index 0000000000..7df8cb63dd
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/newSettings/kafka/ApacheKafkaSettings.tsx
@@ -0,0 +1,297 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { Modal, ModalVariant } from "@patternfly/react-core";
+import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
+import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
+import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
+import { ActionGroup, Form, FormAlert, FormGroup } from "@patternfly/react-core/dist/js/components/Form";
+import { InputGroup, InputGroupText } from "@patternfly/react-core/dist/js/components/InputGroup";
+import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
+import { Popover } from "@patternfly/react-core/dist/js/components/Popover";
+import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
+import { TextInput } from "@patternfly/react-core/dist/js/components/TextInput";
+import { AddCircleOIcon } from "@patternfly/react-icons";
+import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-circle-icon";
+import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
+import { TimesIcon } from "@patternfly/react-icons/dist/js/icons/times-icon";
+import * as React from "react";
+import { useCallback, useMemo, useState } from "react";
+import { Link } from "react-router-dom";
+import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
+import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
+import { routes } from "../../navigation/Routes";
+import { useSettings, useSettingsDispatch } from "../SettingsContext";
+import { EMPTY_CONFIG, isKafkaConfigValid, resetConfigCookie, saveConfigCookie } from "./KafkaSettingsConfig";
+
+export function ApacheKafkaSettings() {
+  const settings = useSettings();
+  const settingsDispatch = useSettingsDispatch();
+  const [config, setConfig] = useState(settings.apacheKafka.config);
+  const kieSandboxExtendedServices = useKieSandboxExtendedServices();
+  const [isModalOpen, setIsModalOpen] = useState(false);
+
+  const handleModalToggle = useCallback(() => {
+    setIsModalOpen((prevIsModalOpen) => !prevIsModalOpen);
+  }, []);
+
+  const isExtendedServicesRunning = useMemo(
+    () => kieSandboxExtendedServices.status === KieSandboxExtendedServicesStatus.RUNNING,
+    [kieSandboxExtendedServices.status]
+  );
+
+  const isStoredConfigValid = useMemo(
+    () => isExtendedServicesRunning && isKafkaConfigValid(settings.apacheKafka.config),
+    [isExtendedServicesRunning, settings.apacheKafka.config]
+  );
+
+  const isCurrentConfigValid = useMemo(
+    () => isExtendedServicesRunning && isKafkaConfigValid(config),
+    [isExtendedServicesRunning, config]
+  );
+
+  const onClearBootstraServer = useCallback(() => setConfig({ ...config, bootstrapServer: "" }), [config]);
+  const onClearTopic = useCallback(() => setConfig({ ...config, topic: "" }), [config]);
+
+  const onBootstrapServerChanged = useCallback(
+    (newValue: string) => setConfig({ ...config, bootstrapServer: newValue }),
+    [config]
+  );
+
+  const onTopicChanged = useCallback((newValue: string) => setConfig({ ...config, topic: newValue }), [config]);
+
+  const onReset = useCallback(() => {
+    setConfig(EMPTY_CONFIG);
+    settingsDispatch.apacheKafka.setConfig(EMPTY_CONFIG);
+    resetConfigCookie();
+  }, [settingsDispatch.apacheKafka]);
+
+  const onApply = useCallback(() => {
+    settingsDispatch.apacheKafka.setConfig(config);
+    saveConfigCookie(config);
+  }, [config, settingsDispatch.apacheKafka]);
+
+  return (
+    <Page>
+      <PageSection variant={"light"} isWidthLimited>
+        <TextContent>
+          <Text component={TextVariants.h1}>Streams for Apache Kafka</Text>
+          <Text component={TextVariants.p}>
+            Data you provide here is necessary for connecting serverless deployments with your Streams for Apache Kafka
+            instance through a KafkaSource.
+            <br /> All information is locally stored in your browser and never shared with anyone.
+          </Text>
+        </TextContent>
+      </PageSection>
+
+      <PageSection>
+        {!isExtendedServicesRunning && (
+          <>
+            <Alert
+              variant="danger"
+              title={
+                <Text>
+                  Connect to{" "}
+                  <Link to={routes.settings.kie_sandbox_extended_services.path({})}>KIE Sandbox Extended Services</Link>{" "}
+                  before configuring your Streams for Apache Kafka instance
+                </Text>
+              }
+              aria-live="polite"
+              isInline
+            >
+              KIE Sandbox Extended Services is necessary for connecting serverless deployments with your Streams for
+              Apache Kafka instance through a KafkaSource.
+            </Alert>
+            <br />
+          </>
+        )}
+        <PageSection variant={"light"}>
+          {isStoredConfigValid ? (
+            <EmptyState>
+              <EmptyStateIcon icon={CheckCircleIcon} color={"var(--pf-global--success-color--100)"} />
+              <TextContent>
+                <Text component={"h2"}>{"Your Streams for Apache Kafka information is set."}</Text>
+              </TextContent>
+              <EmptyStateBody>
+                Deploying models with a KafkaSource attached to the service is <b>enabled</b>.
+                <br />
+                <b>Bootstrap server: </b>
+                <i>{config.bootstrapServer}</i>
+                <br />
+                <b>Topic: </b>
+                <i>{config.topic}</i>
+                <br />
+                <br />
+                <Button variant={ButtonVariant.tertiary} onClick={onReset}>
+                  Reset
+                </Button>
+              </EmptyStateBody>
+            </EmptyState>
+          ) : (
+            <EmptyState>
+              <EmptyStateIcon icon={AddCircleOIcon} />
+              <TextContent>
+                <Text component={"h2"}>No Streams for Apache Kafka information yet</Text>
+              </TextContent>
+              <EmptyStateBody>
+                To get started, add a Streams for Apache Kafka information.
+                <br />
+                <br />
+                <Button variant={ButtonVariant.primary} onClick={handleModalToggle} data-testid="add-connection-button">
+                  Add Streams for Apache Kafka
+                </Button>
+              </EmptyStateBody>
+            </EmptyState>
+          )}
+        </PageSection>
+      </PageSection>
+
+      <Modal
+        title="Add Streams for Apache Kafka"
+        isOpen={
+          isModalOpen &&
+          kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.STOPPED &&
+          !isStoredConfigValid
+        }
+        onClose={handleModalToggle}
+        variant={ModalVariant.large}
+      >
+        <Form>
+          {!isExtendedServicesRunning && (
+            <FormAlert>
+              <Alert
+                variant="danger"
+                title={
+                  <Text>
+                    Connect to{" "}
+                    <Link to={routes.settings.kie_sandbox_extended_services.path({})}>
+                      KIE Sandbox Extended Services
+                    </Link>{" "}
+                    before configuring your Streams for Apache Kafka instance
+                  </Text>
+                }
+                aria-live="polite"
+                isInline
+              />
+            </FormAlert>
+          )}
+          <FormGroup
+            label={"Bootstrap Server"}
+            labelIcon={
+              <Popover bodyContent={"The bootstrap server associated with your Streams for Apache Kafka instance."}>
+                <button
+                  type="button"
+                  aria-label="More info for bootstrap server field"
+                  onClick={(e) => e.preventDefault()}
+                  aria-describedby="bootstrap-server-field"
+                  className="pf-c-form__group-label-help"
+                >
+                  <HelpIcon noVerticalAlign />
+                </button>
+              </Popover>
+            }
+            isRequired
+            fieldId="bootstrap-server-field"
+          >
+            <InputGroup className="pf-u-mt-sm">
+              <TextInput
+                autoComplete={"off"}
+                isRequired
+                type="text"
+                id="bootstrap-server-field"
+                name="bootstrap-server-field"
+                aria-label="Bootstrap server field"
+                aria-describedby="bootstrap-server-field-helper"
+                value={config.bootstrapServer}
+                onChange={onBootstrapServerChanged}
+                tabIndex={1}
+                data-testid="bootstrap-server-text-field"
+              />
+              <InputGroupText>
+                <Button
+                  isSmall
+                  variant="plain"
+                  aria-label="Clear bootstrap server button"
+                  onClick={onClearBootstraServer}
+                >
+                  <TimesIcon />
+                </Button>
+              </InputGroupText>
+            </InputGroup>
+          </FormGroup>
+          <FormGroup
+            label={"Topic"}
+            labelIcon={
+              <Popover bodyContent={"The topic that messages will flow in."}>
+                <button
+                  type="button"
+                  aria-label="More info for topic field"
+                  onClick={(e) => e.preventDefault()}
+                  aria-describedby="topic-field"
+                  className="pf-c-form__group-label-help"
+                >
+                  <HelpIcon noVerticalAlign />
+                </button>
+              </Popover>
+            }
+            isRequired
+            fieldId="topic-field"
+          >
+            <InputGroup className="pf-u-mt-sm">
+              <TextInput
+                autoComplete={"off"}
+                isRequired
+                type="text"
+                id="topic-field"
+                name="topic-field"
+                aria-label="Topic field"
+                aria-describedby="topic-field-helper"
+                value={config.topic}
+                onChange={onTopicChanged}
+                tabIndex={2}
+                data-testid="topic-text-field"
+              />
+              <InputGroupText>
+                <Button isSmall variant="plain" aria-label="Clear topic button" onClick={onClearTopic}>
+                  <TimesIcon />
+                </Button>
+              </InputGroupText>
+            </InputGroup>
+          </FormGroup>
+          <TextContent>
+            <Text component={TextVariants.p}>
+              <b>Note</b>: You must also provide{" "}
+              <Link to={routes.settings.service_account.path({})}>Service Account</Link> so the connection with your
+              Streams for Apache Kafka instance can be properly established.
+            </Text>
+          </TextContent>
+          <ActionGroup>
+            <Button
+              isDisabled={!isCurrentConfigValid}
+              id="apache-kafka-config-apply-button"
+              key="save"
+              variant="primary"
+              onClick={onApply}
+              data-testid="apply-config-button"
+            >
+              Apply
+            </Button>
+          </ActionGroup>
+        </Form>
+      </Modal>
+    </Page>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/kafka/KafkaSettingsConfig.tsx b/packages/serverless-logic-web-tools/src/newSettings/kafka/KafkaSettingsConfig.tsx
new file mode 100644
index 0000000000..dde86edea1
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/newSettings/kafka/KafkaSettingsConfig.tsx
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { makeCookieName, getCookie, setCookie } from "../../cookies";
+
+export const KAFKA_BOOTSTRAP_SERVER_COOKIE_NAME = makeCookieName("kafka", "bootstrap-server");
+export const KAFKA_TOPIC_COOKIE_NAME = makeCookieName("kafka", "topic");
+
+export interface KafkaSettingsConfig {
+  bootstrapServer: string;
+  topic: string;
+}
+
+export const EMPTY_CONFIG: KafkaSettingsConfig = {
+  bootstrapServer: "",
+  topic: "",
+};
+
+export function isKafkaConfigValid(config: KafkaSettingsConfig): boolean {
+  return isBootstrapServerValid(config.bootstrapServer) && isTopicValid(config.topic);
+}
+
+export function isBootstrapServerValid(bootstrapServer: string): boolean {
+  return bootstrapServer !== undefined && bootstrapServer.trim().length > 0;
+}
+
+export function isOAuthEndpointUriValid(oauthEndpointUri: string): boolean {
+  return oauthEndpointUri !== undefined && oauthEndpointUri.trim().length > 0;
+}
+
+export function isTopicValid(topic: string): boolean {
+  return topic !== undefined && topic.trim().length > 0;
+}
+
+export function readKafkaConfigCookie(): KafkaSettingsConfig {
+  return {
+    bootstrapServer: getCookie(KAFKA_BOOTSTRAP_SERVER_COOKIE_NAME) ?? "",
+    topic: getCookie(KAFKA_TOPIC_COOKIE_NAME) ?? "",
+  };
+}
+
+export function resetConfigCookie(): void {
+  saveConfigCookie(EMPTY_CONFIG);
+}
+
+export function saveBootstrapServerCookie(bootstrapServer: string): void {
+  setCookie(KAFKA_BOOTSTRAP_SERVER_COOKIE_NAME, bootstrapServer);
+}
+
+export function saveTopicCookie(topic: string): void {
+  setCookie(KAFKA_TOPIC_COOKIE_NAME, topic);
+}
+
+export function saveConfigCookie(config: KafkaSettingsConfig): void {
+  saveBootstrapServerCookie(config.bootstrapServer);
+  saveTopicCookie(config.topic);
+}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettings.tsx b/packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettings.tsx
new file mode 100644
index 0000000000..8454b667cd
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettings.tsx
@@ -0,0 +1,151 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { OpenShiftConnection } from "@kie-tools-core/openshift/dist/service/OpenShiftConnection";
+import { Modal, ModalVariant } from "@patternfly/react-core";
+import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
+import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
+import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
+import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
+import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
+import { AddCircleOIcon } from "@patternfly/react-icons";
+import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-circle-icon";
+import * as React from "react";
+import { useCallback, useState } from "react";
+import { Link } from "react-router-dom";
+import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
+import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
+import { routes } from "../../navigation/Routes";
+import { OpenShiftInstanceStatus } from "../../openshift/OpenShiftInstanceStatus";
+import { obfuscate } from "../github/GitHubSettings";
+import { useSettings, useSettingsDispatch } from "../SettingsContext";
+import { saveConfigCookie } from "./OpenShiftSettingsConfig";
+import { OpenShiftSettingsSimpleConfig } from "./OpenShiftSettingsSimpleConfig";
+
+export function OpenShiftSettings() {
+  const settings = useSettings();
+  const settingsDispatch = useSettingsDispatch();
+  const [isModalOpen, setIsModalOpen] = useState(false);
+  const kieSandboxExtendedServices = useKieSandboxExtendedServices();
+
+  const handleModalToggle = useCallback(() => {
+    setIsModalOpen((prevIsModalOpen) => !prevIsModalOpen);
+  }, []);
+
+  const onDisconnect = useCallback(() => {
+    settingsDispatch.openshift.setStatus(OpenShiftInstanceStatus.DISCONNECTED);
+    const newConfig: OpenShiftConnection = {
+      namespace: settings.openshift.config.namespace,
+      host: settings.openshift.config.host,
+      token: "",
+    };
+    settingsDispatch.openshift.setConfig(newConfig);
+    saveConfigCookie(newConfig);
+  }, [settings.openshift.config, settingsDispatch.openshift]);
+
+  return (
+    <Page>
+      <PageSection variant={"light"} isWidthLimited>
+        <TextContent>
+          <Text component={TextVariants.h1}>OpenShift</Text>
+          <Text component={TextVariants.p}>
+            Data you provide here is necessary for deploying models you design to your OpenShift instance.
+            <br />
+            All information is locally stored in your browser and never shared with anyone.
+          </Text>
+        </TextContent>
+      </PageSection>
+
+      <PageSection>
+        {kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.RUNNING && (
+          <>
+            <Alert
+              variant="danger"
+              title={
+                <Text>
+                  Connect to{" "}
+                  <Link to={routes.settings.kie_sandbox_extended_services.path({})}>KIE Sandbox Extended Services</Link>{" "}
+                  before configuring your OpenShift instance
+                </Text>
+              }
+              aria-live="polite"
+              isInline
+            >
+              KIE Sandbox Extended Services is necessary for proxying Serverless Logic Web Tools requests to OpenShift,
+              thus making it possible to deploy models.
+            </Alert>
+            <br />
+          </>
+        )}
+        <PageSection variant={"light"}>
+          {settings.openshift.status === OpenShiftInstanceStatus.CONNECTED ? (
+            <EmptyState>
+              <EmptyStateIcon icon={CheckCircleIcon} color={"var(--pf-global--success-color--100)"} />
+              <TextContent>
+                <Text component={"h2"}>{"You're connected to OpenShift."}</Text>
+              </TextContent>
+              <EmptyStateBody>
+                Deploying models is <b>enabled</b>.
+                <br />
+                <b>Token: </b>
+                <i>{obfuscate(settings.openshift.config.token)}</i>
+                <br />
+                <b>Host: </b>
+                <i>{settings.openshift.config.host}</i>
+                <br />
+                <b>Namespace (project): </b>
+                <i>{settings.openshift.config.namespace}</i>
+                <br />
+                <br />
+                <Button variant={ButtonVariant.tertiary} onClick={onDisconnect}>
+                  Disconnect
+                </Button>
+              </EmptyStateBody>
+            </EmptyState>
+          ) : (
+            <EmptyState>
+              <EmptyStateIcon icon={AddCircleOIcon} />
+              <TextContent>
+                <Text component={"h2"}>You are not connected to OpenShift.</Text>
+              </TextContent>
+              <EmptyStateBody>
+                You currently have no OpenShift connections. <br />
+                <br />
+                <Button variant={ButtonVariant.primary} onClick={handleModalToggle} data-testid="add-connection-button">
+                  Add connection
+                </Button>
+              </EmptyStateBody>
+            </EmptyState>
+          )}
+        </PageSection>
+      </PageSection>
+
+      <Modal
+        title="Add connection"
+        isOpen={
+          isModalOpen &&
+          kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.STOPPED &&
+          (settings.openshift.status === OpenShiftInstanceStatus.DISCONNECTED ||
+            settings.openshift.status === OpenShiftInstanceStatus.EXPIRED)
+        }
+        onClose={handleModalToggle}
+        variant={ModalVariant.large}
+      >
+        <OpenShiftSettingsSimpleConfig />
+      </Modal>
+    </Page>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettingsConfig.tsx b/packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettingsConfig.tsx
new file mode 100644
index 0000000000..26ffc405ea
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettingsConfig.tsx
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { OpenShiftConnection } from "@kie-tools-core/openshift/dist/service/OpenShiftConnection";
+import { makeCookieName, getCookie, setCookie } from "../../cookies";
+
+export const OPENSHIFT_NAMESPACE_COOKIE_NAME = makeCookieName("openshift", "namespace");
+export const OPENSHIFT_HOST_COOKIE_NAME = makeCookieName("openshift", "host");
+export const OPENSHIFT_TOKEN_COOKIE_NAME = makeCookieName("openshift", "token");
+
+export const EMPTY_CONFIG: OpenShiftConnection = {
+  namespace: "",
+  host: "",
+  token: "",
+};
+
+export function readOpenShiftConfigCookie(): OpenShiftConnection {
+  return {
+    namespace: getCookie(OPENSHIFT_NAMESPACE_COOKIE_NAME) ?? "",
+    host: getCookie(OPENSHIFT_HOST_COOKIE_NAME) ?? "",
+    token: getCookie(OPENSHIFT_TOKEN_COOKIE_NAME) ?? "",
+  };
+}
+
+export function resetConfigCookie(): void {
+  saveConfigCookie(EMPTY_CONFIG);
+}
+
+export function saveNamespaceCookie(namespace: string): void {
+  setCookie(OPENSHIFT_NAMESPACE_COOKIE_NAME, namespace);
+}
+
+export function saveHostCookie(host: string): void {
+  setCookie(OPENSHIFT_HOST_COOKIE_NAME, host);
+}
+
+export function saveTokenCookie(token: string): void {
+  setCookie(OPENSHIFT_TOKEN_COOKIE_NAME, token);
+}
+
+export function saveConfigCookie(config: OpenShiftConnection): void {
+  saveNamespaceCookie(config.namespace);
+  saveHostCookie(config.host);
+  saveTokenCookie(config.token);
+}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettingsSimpleConfig.tsx b/packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettingsSimpleConfig.tsx
new file mode 100644
index 0000000000..4069b01132
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/newSettings/openshift/OpenShiftSettingsSimpleConfig.tsx
@@ -0,0 +1,319 @@
+/*
+ * Copyright 2022 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {
+  isOpenShiftConnectionValid,
+  OpenShiftConnection,
+} from "@kie-tools-core/openshift/dist/service/OpenShiftConnection";
+import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
+import { Button } from "@patternfly/react-core/dist/js/components/Button";
+import { ActionGroup, Form, FormAlert, FormGroup } from "@patternfly/react-core/dist/js/components/Form";
+import { InputGroup, InputGroupText } from "@patternfly/react-core/dist/js/components/InputGroup";
+import { Popover } from "@patternfly/react-core/dist/js/components/Popover";
+import { Text } from "@patternfly/react-core/dist/js/components/Text";
+import { TextInput } from "@patternfly/react-core/dist/js/components/TextInput";
+import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
+import { TimesIcon } from "@patternfly/react-icons/dist/js/icons/times-icon";
+import * as React from "react";
+import { useCallback, useEffect, useState } from "react";
+import { Link } from "react-router-dom";
+import { useAppI18n } from "../../i18n";
+import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
+import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
+import { routes } from "../../navigation/Routes";
+import { OpenShiftInstanceStatus } from "../../openshift/OpenShiftInstanceStatus";
+import { useSettings, useSettingsDispatch } from "../SettingsContext";
+import { EMPTY_CONFIG, saveConfigCookie } from "./OpenShiftSettingsConfig";
+
+enum FormValiationOptions {
+  INITIAL = "INITIAL",
+  INVALID = "INVALID",
+  CONNECTION_ERROR = "CONNECTION_ERROR",
+  CONFIG_EXPIRED = "CONFIG_EXPIRED",
+}
+
+export function OpenShiftSettingsSimpleConfig() {
+  const { i18n } = useAppI18n();
+  const settings = useSettings();
+  const settingsDispatch = useSettingsDispatch();
+  const [config, setConfig] = useState(settings.openshift.config);
+  const [isConfigValidated, setConfigValidated] = useState(FormValiationOptions.INITIAL);
+  const [isConnecting, setConnecting] = useState(false);
+  const kieSandboxExtendedServices = useKieSandboxExtendedServices();
+
+  useEffect(() => {
+    setConfig(settings.openshift.config);
+    setConfigValidated(
+      settings.openshift.status === OpenShiftInstanceStatus.EXPIRED
+        ? FormValiationOptions.CONFIG_EXPIRED
+        : FormValiationOptions.INITIAL
+    );
+  }, [settings.openshift.config, settings.openshift.status]);
+
+  const resetConfig = useCallback(
+    (config: OpenShiftConnection) => {
+      setConfigValidated(
+        settings.openshift.status === OpenShiftInstanceStatus.EXPIRED && config !== EMPTY_CONFIG
+          ? FormValiationOptions.CONFIG_EXPIRED
+          : FormValiationOptions.INITIAL
+      );
+      setConnecting(false);
+      setConfig(config);
+    },
+    [settings.openshift.status]
+  );
+
+  const onConnect = useCallback(async () => {
+    if (isConnecting) {
+      return;
+    }
+
+    if (!isOpenShiftConnectionValid(config)) {
+      setConfigValidated(FormValiationOptions.INVALID);
+      return;
+    }
+
+    setConnecting(true);
+    const isConfigOk = await settingsDispatch.openshift.service.isConnectionEstablished(config);
+
+    setConnecting(false);
+
+    if (!isConfigOk) {
+      setConfigValidated(FormValiationOptions.CONNECTION_ERROR);
+      return;
+    }
+
+    saveConfigCookie(config);
+    settingsDispatch.openshift.setConfig(config);
+    resetConfig(config);
+    settingsDispatch.openshift.setStatus(OpenShiftInstanceStatus.CONNECTED);
+  }, [config, isConnecting, resetConfig, settingsDispatch.openshift]);
+
+  const onClearHost = useCallback(() => setConfig({ ...config, host: "" }), [config]);
+  const onClearNamespace = useCallback(() => setConfig({ ...config, namespace: "" }), [config]);
+  const onClearToken = useCallback(() => setConfig({ ...config, token: "" }), [config]);
+
+  const onHostChanged = useCallback(
+    (newValue: string) => {
+      setConfig({ ...config, host: newValue });
+    },
+    [config]
+  );
+
+  const onNamespaceChanged = useCallback(
+    (newValue: string) => {
+      setConfig({ ...config, namespace: newValue });
+    },
+    [config]
+  );
+
+  const onTokenChanged = useCallback(
+    (newValue: string) => {
+      setConfig({ ...config, token: newValue });
+    },
+    [config]
+  );
+
+  return (
+    <>
+      <Form>
+        {kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.RUNNING && (
+          <FormAlert>
+            <Alert
+              variant="danger"
+              title={
+                <Text>
+                  Connect to{" "}
+                  <Link to={routes.settings.kie_sandbox_extended_services.path({})}>KIE Sandbox Extended Services</Link>{" "}
+                  before configuring your OpenShift instance
+                </Text>
+              }
+              aria-live="polite"
+              isInline
+            />
+          </FormAlert>
+        )}
+        {isConfigValidated === FormValiationOptions.INVALID && (
+          <FormAlert>
+            <Alert
+              variant="danger"
+              title={i18n.openshift.configModal.validationError}
+              aria-live="polite"
+              isInline
+              data-testid="alert-validation-error"
+            />
+          </FormAlert>
+        )}
+        {isConfigValidated === FormValiationOptions.CONNECTION_ERROR && (
+          <FormAlert>
+            <Alert
+              variant="danger"
+              title={i18n.openshift.configModal.connectionError}
+              aria-live="polite"
+              isInline
+              data-testid="alert-connection-error"
+            />
+          </FormAlert>
+        )}
+        {isConfigValidated === FormValiationOptions.CONFIG_EXPIRED && (
+          <FormAlert>
+            <Alert
+              variant="warning"
+              title={i18n.openshift.configModal.configExpiredWarning}
+              aria-live="polite"
+              isInline
+              data-testid="alert-config-expired-warning"
+            />
+          </FormAlert>
+        )}
+        <FormGroup
+          label={i18n.terms.namespace}
+          labelIcon={
+            <Popover bodyContent={i18n.openshift.configModal.namespaceInfo}>
+              <button
+                type="button"
+                aria-label="More info for namespace field"
+                onClick={(e) => e.preventDefault()}
+                aria-describedby="namespace-field"
+                className="pf-c-form__group-label-help"
+              >
+                <HelpIcon noVerticalAlign />
+              </button>
+            </Popover>
+          }
+          isRequired
+          fieldId="namespace-field"
+        >
+          <InputGroup className="pf-u-mt-sm">
+            <TextInput
+              autoComplete={"off"}
+              isRequired
+              type="text"
+              id="namespace-field"
+              name="namespace-field"
+              aria-label="Namespace field"
+              aria-describedby="namespace-field-helper"
+              value={config.namespace}
+              onChange={onNamespaceChanged}
+              isDisabled={isConnecting}
+              tabIndex={1}
+              data-testid="namespace-text-field"
+            />
+            <InputGroupText>
+              <Button isSmall variant="plain" aria-label="Clear namespace button" onClick={onClearNamespace}>
+                <TimesIcon />
+              </Button>
+            </InputGroupText>
+          </InputGroup>
+        </FormGroup>
+        <FormGroup
+          label={i18n.terms.host}
+          labelIcon={
+            <Popover bodyContent={i18n.openshift.configModal.hostInfo}>
+              <button
+                type="button"
+                aria-label="More info for host field"
+                onClick={(e) => e.preventDefault()}
+                aria-describedby="host-field"
+                className="pf-c-form__group-label-help"
+              >
+                <HelpIcon noVerticalAlign />
+              </button>
+            </Popover>
+          }
+          isRequired
+          fieldId="host-field"
+        >
+          <InputGroup className="pf-u-mt-sm">
+            <TextInput
+              autoComplete={"off"}
+              isRequired
+              type="text"
+              id="host-field"
+              name="host-field"
+              aria-label="Host field"
+              aria-describedby="host-field-helper"
+              value={config.host}
+              onChange={onHostChanged}
+              isDisabled={isConnecting}
+              tabIndex={2}
+              data-testid="host-text-field"
+            />
+            <InputGroupText>
+              <Button isSmall variant="plain" aria-label="Clear host button" onClick={onClearHost}>
+                <TimesIcon />
+              </Button>
+            </InputGroupText>
+          </InputGroup>
+        </FormGroup>
+        <FormGroup
+          label={i18n.terms.token}
+          labelIcon={
+            <Popover bodyContent={i18n.openshift.configModal.tokenInfo}>
+              <button
+                type="button"
+                aria-label="More info for token field"
+                onClick={(e) => e.preventDefault()}
+                aria-describedby="token-field"
+                className="pf-c-form__group-label-help"
+              >
+                <HelpIcon noVerticalAlign />
+              </button>
+            </Popover>
+          }
+          isRequired
+          fieldId="token-field"
+        >
+          <InputGroup className="pf-u-mt-sm">
+            <TextInput
+              autoComplete={"off"}
+              isRequired
+              type="text"
+              id="token-field"
+              name="token-field"
+              aria-label="Token field"
+              aria-describedby="token-field-helper"
+              value={config.token}
+              onChange={onTokenChanged}
+              isDisabled={isConnecting}
+              tabIndex={3}
+              data-testid="token-text-field"
+            />
+            <InputGroupText>
+              <Button isSmall variant="plain" aria-label="Clear token button" onClick={onClearToken}>
+                <TimesIcon />
+              </Button>
+            </InputGroupText>
+          </InputGroup>
+        </FormGroup>
+        <ActionGroup>
+          <Button
+            id="openshift-config-save-button"
+            key="save"
+            variant="primary"
+            onClick={onConnect}
+            data-testid="save-config-button"
+            isLoading={isConnecting}
+            isDisabled={kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.RUNNING}
+            spinnerAriaValueText={isConnecting ? "Loading" : undefined}
+          >
+            {isConnecting ? "Connecting" : "Connect"}
+          </Button>
+        </ActionGroup>
+      </Form>
+    </>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/routes/SettingsPageRoutes.tsx b/packages/serverless-logic-web-tools/src/newSettings/routes/SettingsPageRoutes.tsx
new file mode 100644
index 0000000000..56f678e3b0
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/newSettings/routes/SettingsPageRoutes.tsx
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from "react";
+import { Redirect, Switch } from "react-router";
+import { Route } from "react-router-dom";
+import { useRoutes } from "../../navigation/Hooks";
+import { GitHubSettings } from "../github/GitHubSettings";
+import { KieSandboxExtendedServicesSettings } from "../extendedServices/KieSandboxExtendedServicesSettings";
+import { FeaturePreviewSettings } from "../featurePreview/FeaturePreviewSettings";
+import { ApacheKafkaSettings } from "../kafka/ApacheKafkaSettings";
+import { OpenShiftSettings } from "../openshift/OpenShiftSettings";
+import { ServiceAccountSettings } from "../serviceAccount/ServiceAccountSettings";
+import { ServiceRegistrySettings } from "../serviceRegistry/ServiceRegistrySettings";
+
+export function SettingsPageRoutes() {
+  const routes = useRoutes();
+  return (
+    <Switch>
+      <Route path={routes.settings.github.path({})}>
+        <GitHubSettings />
+      </Route>
+      <Route path={routes.settings.kie_sandbox_extended_services.path({})}>
+        <KieSandboxExtendedServicesSettings />
+      </Route>
+      <Route path={routes.settings.openshift.path({})}>
+        <OpenShiftSettings />
+      </Route>
+      <Route path={routes.settings.service_account.path({})}>
+        <ServiceAccountSettings />
+      </Route>
+      <Route path={routes.settings.service_registry.path({})}>
+        <ServiceRegistrySettings />
+      </Route>
+      <Route path={routes.settings.kafka.path({})}>
+        <ApacheKafkaSettings />
+      </Route>
+      <Route path={routes.settings.feature_preview.path({})}>
+        <FeaturePreviewSettings />
+      </Route>
+      <Route>
+        <Redirect to={routes.settings.github.path({})} />
+      </Route>
+    </Switch>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/serviceAccount/ServiceAccountConfig.tsx b/packages/serverless-logic-web-tools/src/newSettings/serviceAccount/ServiceAccountConfig.tsx
new file mode 100644
index 0000000000..1b9bb2d77a
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/newSettings/serviceAccount/ServiceAccountConfig.tsx
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { makeCookieName, getCookie, setCookie } from "../../cookies";
+
+export const SERVICE_ACCOUNT_CLIENT_ID_COOKIE_NAME = makeCookieName("service-account", "client-id");
+export const SERVICE_ACCOUNT_CLIENT_SECRET_COOKIE_NAME = makeCookieName("service-account", "client-secret");
+
+export interface ServiceAccountSettingsConfig {
+  clientId: string;
+  clientSecret: string;
+}
+
+export const EMPTY_CONFIG: ServiceAccountSettingsConfig = {
+  clientId: "",
+  clientSecret: "",
+};
+
+export function isServiceAccountConfigValid(config: ServiceAccountSettingsConfig): boolean {
+  return isClientIdValid(config.clientId) && isClientSecretValid(config.clientSecret);
+}
+
+export function isClientIdValid(clientId: string): boolean {
+  return clientId !== undefined && clientId.trim().length > 0;
+}
+
+export function isClientSecretValid(clientSecret: string): boolean {
+  return clientSecret !== undefined && clientSecret.trim().length > 0;
+}
+
+export function readServiceAccountConfigCookie(): ServiceAccountSettingsConfig {
+  return {
+    clientId: getCookie(SERVICE_ACCOUNT_CLIENT_ID_COOKIE_NAME) ?? "",
+    clientSecret: getCookie(SERVICE_ACCOUNT_CLIENT_SECRET_COOKIE_NAME) ?? "",
+  };
+}
+
+export function resetConfigCookie(): void {
+  saveConfigCookie(EMPTY_CONFIG);
+}
+
+export function saveClientIdCookie(clientId: string): void {
+  setCookie(SERVICE_ACCOUNT_CLIENT_ID_COOKIE_NAME, clientId);
+}
+
+export function saveClientSecretCookie(clientSecret: string): void {
+  setCookie(SERVICE_ACCOUNT_CLIENT_SECRET_COOKIE_NAME, clientSecret);
+}
+
+export function saveConfigCookie(config: ServiceAccountSettingsConfig): void {
+  saveClientIdCookie(config.clientId);
+  saveClientSecretCookie(config.clientSecret);
+}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/serviceAccount/ServiceAccountSettings.tsx b/packages/serverless-logic-web-tools/src/newSettings/serviceAccount/ServiceAccountSettings.tsx
new file mode 100644
index 0000000000..5b7ebde91e
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/newSettings/serviceAccount/ServiceAccountSettings.tsx
@@ -0,0 +1,307 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { Modal, ModalVariant } from "@patternfly/react-core";
+import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
+import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
+import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
+import { ActionGroup, Form, FormAlert, FormGroup } from "@patternfly/react-core/dist/js/components/Form";
+import { InputGroup, InputGroupText } from "@patternfly/react-core/dist/js/components/InputGroup";
+import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
+import { Popover } from "@patternfly/react-core/dist/js/components/Popover";
+import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
+import { TextInput } from "@patternfly/react-core/dist/js/components/TextInput";
+import { AddCircleOIcon } from "@patternfly/react-icons";
+import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-circle-icon";
+import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
+import { TimesIcon } from "@patternfly/react-icons/dist/js/icons/times-icon";
+import * as React from "react";
+import { useCallback, useMemo, useState } from "react";
+import { Link } from "react-router-dom";
+import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
+import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
+import { routes } from "../../navigation/Routes";
+import { useSettings, useSettingsDispatch } from "../SettingsContext";
+import { EMPTY_CONFIG, isServiceAccountConfigValid, resetConfigCookie, saveConfigCookie } from "./ServiceAccountConfig";
+
+export function ServiceAccountSettings() {
+  const settings = useSettings();
+  const settingsDispatch = useSettingsDispatch();
+  const [config, setConfig] = useState(settings.serviceAccount.config);
+  const kieSandboxExtendedServices = useKieSandboxExtendedServices();
+  const [isModalOpen, setIsModalOpen] = useState(false);
+
+  const handleModalToggle = useCallback(() => {
+    setIsModalOpen((prevIsModalOpen) => !prevIsModalOpen);
+  }, []);
+
+  const isExtendedServicesRunning = useMemo(
+    () => kieSandboxExtendedServices.status === KieSandboxExtendedServicesStatus.RUNNING,
+    [kieSandboxExtendedServices.status]
+  );
+
+  const isStoredConfigValid = useMemo(
+    () => isExtendedServicesRunning && isServiceAccountConfigValid(settings.serviceAccount.config),
+    [isExtendedServicesRunning, settings.serviceAccount.config]
+  );
+
+  const isCurrentConfigValid = useMemo(
+    () => isExtendedServicesRunning && isServiceAccountConfigValid(config),
+    [config, isExtendedServicesRunning]
+  );
+
+  const onClearClientId = useCallback(() => setConfig({ ...config, clientId: "" }), [config]);
+  const onClearClientSecret = useCallback(() => setConfig({ ...config, clientSecret: "" }), [config]);
+
+  const onClientIdChanged = useCallback(
+    (newValue: string) => {
+      setConfig({ ...config, clientId: newValue });
+    },
+    [config]
+  );
+
+  const onClientSecretChanged = useCallback(
+    (newValue: string) => {
+      setConfig({ ...config, clientSecret: newValue });
+    },
+    [config]
+  );
+
+  const onReset = useCallback(() => {
+    setConfig(EMPTY_CONFIG);
+    settingsDispatch.serviceAccount.setConfig(EMPTY_CONFIG);
+    resetConfigCookie();
+  }, [settingsDispatch.serviceAccount]);
+
+  const onApply = useCallback(() => {
+    settingsDispatch.serviceAccount.setConfig(config);
+    saveConfigCookie(config);
+  }, [config, settingsDispatch.serviceAccount]);
+
+  return (
+    <Page>
+      <PageSection variant={"light"} isWidthLimited>
+        <TextContent>
+          <Text component={TextVariants.h1}>Service Account</Text>
+          <Text component={TextVariants.p}>
+            Data you provide here is necessary for uploading Open API specs associated with models you design to your
+            Service Registry instance and also connecting deployments with your Streams for Apache Kafka instance.
+            <br /> All information is locally stored in your browser and never shared with anyone.
+          </Text>
+        </TextContent>
+      </PageSection>
+
+      <PageSection>
+        {kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.RUNNING && (
+          <>
+            <Alert
+              variant="danger"
+              title={
+                <Text>
+                  Connect to{" "}
+                  <Link to={routes.settings.kie_sandbox_extended_services.path({})}>KIE Sandbox Extended Services</Link>{" "}
+                  before configuring your Service Account instance
+                </Text>
+              }
+              aria-live="polite"
+              isInline
+            >
+              KIE Sandbox Extended Services is necessary for uploading Open API specs associated with models you design
+              to your Service Registry instance and also connecting deployments with your Streams for Apache Kafka
+              instance.
+            </Alert>
+            <br />
+          </>
+        )}
+        <PageSection variant={"light"}>
+          {isStoredConfigValid ? (
+            <EmptyState>
+              <EmptyStateIcon icon={CheckCircleIcon} color={"var(--pf-global--success-color--100)"} />
+              <TextContent>
+                <Text component={"h2"}>{"Your Service Account information is set."}</Text>
+              </TextContent>
+              <EmptyStateBody>
+                Accessing your Service Registry and Streams for Apache Kafka is <b>enabled</b>.
+                <br />
+                <b>Client ID: </b>
+                <i>{config.clientId}</i>
+                <br />
+                <b>Client secret: </b>
+                <i>{obfuscate(config.clientSecret)}</i>
+                <br />
+                <br />
+                <Button variant={ButtonVariant.tertiary} onClick={onReset}>
+                  Reset
+                </Button>
+              </EmptyStateBody>
+            </EmptyState>
+          ) : (
+            <EmptyState>
+              <EmptyStateIcon icon={AddCircleOIcon} />
+              <TextContent>
+                <Text component={"h2"}>No Service Accounts yet</Text>
+              </TextContent>
+              <EmptyStateBody>
+                To get started, add a service account.
+                <br />
+                <br />
+                <Button variant={ButtonVariant.primary} onClick={handleModalToggle} data-testid="add-connection-button">
+                  Add service account
+                </Button>
+              </EmptyStateBody>
+            </EmptyState>
+          )}
+        </PageSection>
+      </PageSection>
+
+      <Modal
+        title="Add Service Account"
+        isOpen={
+          isModalOpen &&
+          kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.STOPPED &&
+          !isStoredConfigValid
+        }
+        onClose={handleModalToggle}
+        variant={ModalVariant.large}
+      >
+        <Form>
+          {!isExtendedServicesRunning && (
+            <FormAlert>
+              <Alert
+                variant="danger"
+                title={
+                  <Text>
+                    Connect to{" "}
+                    <Link to={routes.settings.kie_sandbox_extended_services.path({})}>
+                      KIE Sandbox Extended Services
+                    </Link>{" "}
+                    before configuring your Service Account
+                  </Text>
+                }
+                aria-live="polite"
+                isInline
+              />
+            </FormAlert>
+          )}
+          <FormGroup
+            label={"Client ID"}
+            labelIcon={
+              <Popover bodyContent={"Client ID"}>
+                <button
+                  type="button"
+                  aria-label="More info for client id field"
+                  onClick={(e) => e.preventDefault()}
+                  aria-describedby="client-id-field"
+                  className="pf-c-form__group-label-help"
+                >
+                  <HelpIcon noVerticalAlign />
+                </button>
+              </Popover>
+            }
+            isRequired
+            fieldId="client-id-field"
+          >
+            <InputGroup className="pf-u-mt-sm">
+              <TextInput
+                autoComplete={"off"}
+                isRequired
+                type="text"
+                id="client-id-field"
+                name="client-id-field"
+                aria-label="Client ID field"
+                aria-describedby="client-id-field-helper"
+                value={config.clientId}
+                onChange={onClientIdChanged}
+                tabIndex={1}
+                data-testid="client-id-text-field"
+              />
+              <InputGroupText>
+                <Button isSmall variant="plain" aria-label="Clear client id button" onClick={onClearClientId}>
+                  <TimesIcon />
+                </Button>
+              </InputGroupText>
+            </InputGroup>
+          </FormGroup>
+          <FormGroup
+            label={"Client Secret"}
+            labelIcon={
+              <Popover bodyContent={"Client Secret"}>
+                <button
+                  type="button"
+                  aria-label="More info for client secret field"
+                  onClick={(e) => e.preventDefault()}
+                  aria-describedby="client-secret-field"
+                  className="pf-c-form__group-label-help"
+                >
+                  <HelpIcon noVerticalAlign />
+                </button>
+              </Popover>
+            }
+            isRequired
+            fieldId="client-secret-field"
+          >
+            <InputGroup className="pf-u-mt-sm">
+              <TextInput
+                autoComplete={"off"}
+                isRequired
+                type="text"
+                id="client-secret-field"
+                name="client-secret-field"
+                aria-label="Client secret field"
+                aria-describedby="client-secret-field-helper"
+                value={config.clientSecret}
+                onChange={onClientSecretChanged}
+                tabIndex={2}
+                data-testid="client-secret-text-field"
+              />
+              <InputGroupText>
+                <Button isSmall variant="plain" aria-label="Clear client secret button" onClick={onClearClientSecret}>
+                  <TimesIcon />
+                </Button>
+              </InputGroupText>
+            </InputGroup>
+          </FormGroup>
+          <ActionGroup>
+            <Button
+              isDisabled={!isCurrentConfigValid}
+              id="service-account-config-apply-button"
+              key="save"
+              variant="primary"
+              onClick={onApply}
+              data-testid="apply-config-button"
+            >
+              Apply
+            </Button>
+          </ActionGroup>
+        </Form>
+      </Modal>
+    </Page>
+  );
+}
+
+export function obfuscate(token?: string) {
+  if (!token) {
+    return undefined;
+  }
+
+  if (token.length <= 10) {
+    return new Array(10).join("*");
+  }
+
+  const stars = new Array(token.length - 4).join("*");
+  const pieceToObfuscate = token.substring(0, token.length - 4);
+  return token.replace(pieceToObfuscate, stars);
+}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/serviceRegistry/ServiceRegistryConfig.tsx b/packages/serverless-logic-web-tools/src/newSettings/serviceRegistry/ServiceRegistryConfig.tsx
new file mode 100644
index 0000000000..49dad4fe02
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/newSettings/serviceRegistry/ServiceRegistryConfig.tsx
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { getCookie, makeCookieName, setCookie } from "../../cookies";
+
+export const SERVICE_REGISTRY_NAME_COOKIE_NAME = makeCookieName("service-registry", "name");
+export const SERVICE_REGISTRY_CORE_REGISTRY_API_COOKIE_NAME = makeCookieName("service-registry", "core-registry-api");
+
+export interface ServiceRegistrySettingsConfig {
+  name: string;
+  coreRegistryApi: string;
+}
+
+export const EMPTY_CONFIG: ServiceRegistrySettingsConfig = {
+  name: "",
+  coreRegistryApi: "",
+};
+
+export function isServiceRegistryConfigValid(config: ServiceRegistrySettingsConfig): boolean {
+  return isNameValid(config.name) && isCoreRegistryApiValid(config.coreRegistryApi);
+}
+
+export function isNameValid(name: string): boolean {
+  return name !== undefined && name.trim().length > 0;
+}
+
+export function isCoreRegistryApiValid(coreRegistryApi: string): boolean {
+  return coreRegistryApi !== undefined && coreRegistryApi.trim().length > 0;
+}
+
+export function readServiceRegistryConfigCookie(): ServiceRegistrySettingsConfig {
+  return {
+    name: getCookie(SERVICE_REGISTRY_NAME_COOKIE_NAME) ?? "",
+    coreRegistryApi: getCookie(SERVICE_REGISTRY_CORE_REGISTRY_API_COOKIE_NAME) ?? "",
+  };
+}
+
+export function resetConfigCookie(): void {
+  saveConfigCookie(EMPTY_CONFIG);
+}
+
+export function saveNameCookie(name: string): void {
+  setCookie(SERVICE_REGISTRY_NAME_COOKIE_NAME, name);
+}
+
+export function saveCoreRegistryApiCookie(coreRegistryApi: string): void {
+  setCookie(SERVICE_REGISTRY_CORE_REGISTRY_API_COOKIE_NAME, coreRegistryApi);
+}
+
+export function saveConfigCookie(config: ServiceRegistrySettingsConfig): void {
+  saveNameCookie(config.name);
+  saveCoreRegistryApiCookie(config.coreRegistryApi);
+}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/serviceRegistry/ServiceRegistrySettings.tsx b/packages/serverless-logic-web-tools/src/newSettings/serviceRegistry/ServiceRegistrySettings.tsx
new file mode 100644
index 0000000000..2a4f4e5bfc
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/newSettings/serviceRegistry/ServiceRegistrySettings.tsx
@@ -0,0 +1,305 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { Modal, ModalVariant } from "@patternfly/react-core";
+import { Alert } from "@patternfly/react-core/dist/js/components/Alert";
+import { Button, ButtonVariant } from "@patternfly/react-core/dist/js/components/Button";
+import { EmptyState, EmptyStateBody, EmptyStateIcon } from "@patternfly/react-core/dist/js/components/EmptyState";
+import { ActionGroup, Form, FormAlert, FormGroup } from "@patternfly/react-core/dist/js/components/Form";
+import { InputGroup, InputGroupText } from "@patternfly/react-core/dist/js/components/InputGroup";
+import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
+import { Popover } from "@patternfly/react-core/dist/js/components/Popover";
+import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
+import { TextInput } from "@patternfly/react-core/dist/js/components/TextInput";
+import { AddCircleOIcon } from "@patternfly/react-icons";
+import { CheckCircleIcon } from "@patternfly/react-icons/dist/js/icons/check-circle-icon";
+import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
+import { TimesIcon } from "@patternfly/react-icons/dist/js/icons/times-icon";
+import * as React from "react";
+import { useCallback, useMemo, useState } from "react";
+import { Link } from "react-router-dom";
+import { useKieSandboxExtendedServices } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesContext";
+import { KieSandboxExtendedServicesStatus } from "../../kieSandboxExtendedServices/KieSandboxExtendedServicesStatus";
+import { routes } from "../../navigation/Routes";
+import { useSettings, useSettingsDispatch } from "../SettingsContext";
+import {
+  EMPTY_CONFIG,
+  isServiceRegistryConfigValid,
+  resetConfigCookie,
+  saveConfigCookie,
+} from "./ServiceRegistryConfig";
+
+export function ServiceRegistrySettings() {
+  const settings = useSettings();
+  const settingsDispatch = useSettingsDispatch();
+  const [config, setConfig] = useState(settings.serviceRegistry.config);
+  const kieSandboxExtendedServices = useKieSandboxExtendedServices();
+  const [isModalOpen, setIsModalOpen] = useState(false);
+
+  const handleModalToggle = useCallback(() => {
+    setIsModalOpen((prevIsModalOpen) => !prevIsModalOpen);
+  }, []);
+
+  const isExtendedServicesRunning = useMemo(
+    () => kieSandboxExtendedServices.status === KieSandboxExtendedServicesStatus.RUNNING,
+    [kieSandboxExtendedServices.status]
+  );
+
+  const isStoredConfigValid = useMemo(
+    () => isExtendedServicesRunning && isServiceRegistryConfigValid(settings.serviceRegistry.config),
+    [isExtendedServicesRunning, settings.serviceRegistry.config]
+  );
+
+  const isCurrentConfigValid = useMemo(
+    () => isExtendedServicesRunning && isServiceRegistryConfigValid(config),
+    [isExtendedServicesRunning, config]
+  );
+
+  const onClearName = useCallback(() => setConfig({ ...config, name: "" }), [config]);
+
+  const onClearCoreRegistryApi = useCallback(() => setConfig({ ...config, coreRegistryApi: "" }), [config]);
+
+  const onNameChanged = useCallback((newValue: string) => setConfig({ ...config, name: newValue }), [config]);
+
+  const onCoreRegistryApiChanged = useCallback(
+    (newValue: string) => setConfig({ ...config, coreRegistryApi: newValue }),
+    [config]
+  );
+
+  const onReset = useCallback(() => {
+    setConfig(EMPTY_CONFIG);
+    settingsDispatch.serviceRegistry.setConfig(EMPTY_CONFIG);
+    resetConfigCookie();
+  }, [settingsDispatch.serviceRegistry]);
+
+  const onApply = useCallback(() => {
+    settingsDispatch.serviceRegistry.setConfig(config);
+    saveConfigCookie(config);
+  }, [config, settingsDispatch.serviceRegistry]);
+
+  return (
+    <Page>
+      <PageSection variant={"light"} isWidthLimited>
+        <TextContent>
+          <Text component={TextVariants.h1}>Service Registry</Text>
+          <Text component={TextVariants.p}>
+            Data you provide here is necessary for uploading Open API specs associated with models you design to your
+            Service Registry instance.
+            <br /> All information is locally stored in your browser and never shared with anyone.
+          </Text>
+        </TextContent>
+      </PageSection>
+
+      <PageSection>
+        {!isExtendedServicesRunning && (
+          <>
+            <Alert
+              variant="danger"
+              title={
+                <Text>
+                  Connect to{" "}
+                  <Link to={routes.settings.kie_sandbox_extended_services.path({})}>KIE Sandbox Extended Services</Link>{" "}
+                  before configuring your Service Registry instance
+                </Text>
+              }
+              aria-live="polite"
+              isInline
+            >
+              KIE Sandbox Extended Services is necessary for uploading Open API specs associated with models you design
+              to your Service Registry instance.
+            </Alert>
+            <br />
+          </>
+        )}
+        <PageSection variant={"light"}>
+          {isStoredConfigValid ? (
+            <EmptyState>
+              <EmptyStateIcon icon={CheckCircleIcon} color={"var(--pf-global--success-color--100)"} />
+              <TextContent>
+                <Text component={"h2"}>{"Your Service Registry information is set."}</Text>
+              </TextContent>
+              <EmptyStateBody>
+                Uploading OpenAPI specs when deploying models is <b>enabled</b>.
+                <br />
+                <b>Service Registry Name: </b>
+                <i>{config.name}</i>
+                <br />
+                <b>Core Registry Api: </b>
+                <i>{config.coreRegistryApi}</i>
+                <br />
+                <br />
+                <Button variant={ButtonVariant.tertiary} onClick={onReset}>
+                  Reset
+                </Button>
+              </EmptyStateBody>
+            </EmptyState>
+          ) : (
+            <EmptyState>
+              <EmptyStateIcon icon={AddCircleOIcon} />
+              <TextContent>
+                <Text component={"h2"}>No Service Registry yet</Text>
+              </TextContent>
+              <EmptyStateBody>
+                To get started, add a service registry.
+                <br />
+                <br />
+                <Button variant={ButtonVariant.primary} onClick={handleModalToggle} data-testid="add-connection-button">
+                  Add service registry
+                </Button>
+              </EmptyStateBody>
+            </EmptyState>
+          )}
+        </PageSection>
+      </PageSection>
+
+      <Modal
+        title="Add Service Registry"
+        isOpen={
+          isModalOpen &&
+          kieSandboxExtendedServices.status !== KieSandboxExtendedServicesStatus.STOPPED &&
+          !isStoredConfigValid
+        }
+        onClose={handleModalToggle}
+        variant={ModalVariant.large}
+      >
+        <Form>
+          {!isExtendedServicesRunning && (
+            <FormAlert>
+              <Alert
+                variant="danger"
+                title={
+                  <Text>
+                    Connect to{" "}
+                    <Link to={routes.settings.kie_sandbox_extended_services.path({})}>
+                      KIE Sandbox Extended Services
+                    </Link>{" "}
+                    before configuring your Service Registry instance
+                  </Text>
+                }
+                aria-live="polite"
+                isInline
+              />
+            </FormAlert>
+          )}
+          <FormGroup
+            label={"Name"}
+            labelIcon={
+              <Popover
+                bodyContent={"Name to identify your Service Registry instance across the Serverless Logic Web Tools."}
+              >
+                <button
+                  type="button"
+                  aria-label="More info for name field"
+                  onClick={(e) => e.preventDefault()}
+                  aria-describedby="name-field"
+                  className="pf-c-form__group-label-help"
+                >
+                  <HelpIcon noVerticalAlign />
+                </button>
+              </Popover>
+            }
+            isRequired
+            fieldId="name-field"
+          >
+            <InputGroup className="pf-u-mt-sm">
+              <TextInput
+                autoComplete={"off"}
+                isRequired
+                type="text"
+                id="name-field"
+                name="name-field"
+                aria-label="Name field"
+                aria-describedby="name-field-helper"
+                value={config.name}
+                onChange={onNameChanged}
+                tabIndex={1}
+                data-testid="name-text-field"
+              />
+              <InputGroupText>
+                <Button isSmall variant="plain" aria-label="Clear name button" onClick={onClearName}>
+                  <TimesIcon />
+                </Button>
+              </InputGroupText>
+            </InputGroup>
+          </FormGroup>
+          <FormGroup
+            label={"Core Registry API"}
+            labelIcon={
+              <Popover bodyContent={"Core Registry API URL associated with your Service Registry instance."}>
+                <button
+                  type="button"
+                  aria-label="More info for core registry api field"
+                  onClick={(e) => e.preventDefault()}
+                  aria-describedby="core-registry-api-field"
+                  className="pf-c-form__group-label-help"
+                >
+                  <HelpIcon noVerticalAlign />
+                </button>
+              </Popover>
+            }
+            isRequired
+            fieldId="core-registry-api-field"
+          >
+            <InputGroup className="pf-u-mt-sm">
+              <TextInput
+                autoComplete={"off"}
+                isRequired
+                type="text"
+                id="core-registry-api-field"
+                name="core-registry-api-field"
+                aria-label="Core Registry API field"
+                aria-describedby="core-registry-api-field-helper"
+                value={config.coreRegistryApi}
+                onChange={onCoreRegistryApiChanged}
+                tabIndex={2}
+                data-testid="core-registry-api-text-field"
+              />
+              <InputGroupText>
+                <Button
+                  isSmall
+                  variant="plain"
+                  aria-label="Clear core registry api button"
+                  onClick={onClearCoreRegistryApi}
+                >
+                  <TimesIcon />
+                </Button>
+              </InputGroupText>
+            </InputGroup>
+          </FormGroup>
+          <TextContent>
+            <Text component={TextVariants.p}>
+              <b>Note</b>: You must also provide{" "}
+              <Link to={routes.settings.service_account.path({})}>Service Account</Link> so the connection with your
+              Service Registry instance can be properly established.
+            </Text>
+          </TextContent>
+          <ActionGroup>
+            <Button
+              isDisabled={!isCurrentConfigValid}
+              id="service-registry-config-apply-button"
+              key="save"
+              variant="primary"
+              onClick={onApply}
+              data-testid="apply-config-button"
+            >
+              Apply
+            </Button>
+          </ActionGroup>
+        </Form>
+      </Modal>
+    </Page>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/newSettings/uiNav/SettingsPageNav.tsx b/packages/serverless-logic-web-tools/src/newSettings/uiNav/SettingsPageNav.tsx
new file mode 100644
index 0000000000..2d0ef44cdd
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/newSettings/uiNav/SettingsPageNav.tsx
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { Nav, NavItem, NavList } from "@patternfly/react-core";
+import * as React from "react";
+import { Link } from "react-router-dom";
+import { useRoutes } from "../../navigation/Hooks";
+
+export function SettingsPageNav(props: { pathname: string }) {
+  const routes = useRoutes();
+
+  return (
+    <>
+      <div className="chr-c-app-title">Settings</div>
+      <Nav aria-label="Global NAV" theme="dark">
+        <NavList>
+          <NavItem itemId={0} key={`Settings-github-nav`} isActive={props.pathname === routes.settings.github.path({})}>
+            <Link to={routes.settings.github.path({})}>GitHub</Link>
+          </NavItem>
+          <NavItem
+            itemId={0}
+            key={`Settings-kie_sandbox_extended_services-nav`}
+            isActive={props.pathname === routes.settings.kie_sandbox_extended_services.path({})}
+          >
+            <Link to={routes.settings.kie_sandbox_extended_services.path({})}>KIE Sandbox Extended Services</Link>
+          </NavItem>
+          <NavItem
+            itemId={0}
+            key={`Settings-openshift-nav`}
+            isActive={props.pathname === routes.settings.openshift.path({})}
+          >
+            <Link to={routes.settings.openshift.path({})}>OpenShift</Link>
+          </NavItem>
+          <NavItem
+            itemId={0}
+            key={`Settings-service_account-nav`}
+            isActive={props.pathname === routes.settings.service_account.path({})}
+          >
+            <Link to={routes.settings.service_account.path({})}>Service Account</Link>
+          </NavItem>
+          <NavItem
+            itemId={0}
+            key={`Settings-service_registry-nav`}
+            isActive={props.pathname === routes.settings.service_registry.path({})}
+          >
+            <Link to={routes.settings.service_registry.path({})}>Service Registry</Link>
+          </NavItem>
+          <NavItem itemId={0} key={`Settings-kafka-nav`} isActive={props.pathname === routes.settings.kafka.path({})}>
+            <Link to={routes.settings.kafka.path({})}>Streams for Apache Kafka</Link>
+          </NavItem>
+          <NavItem
+            itemId={0}
+            key={`Settings-feature_preview-nav`}
+            isActive={props.pathname === routes.settings.feature_preview.path({})}
+          >
+            <Link to={routes.settings.feature_preview.path({})}>Feature Preview</Link>
+          </NavItem>
+        </NavList>
+      </Nav>
+    </>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx b/packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx
index 242e71c961..2abccb1650 100644
--- a/packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/SettingsContext.tsx
@@ -25,8 +25,8 @@ import { readOpenShiftConfigCookie } from "./openshift/OpenShiftSettingsConfig";
 import { OpenShiftConnection } from "@kie-tools-core/openshift/dist/service/OpenShiftConnection";
 import { OpenShiftInstanceStatus } from "../openshift/OpenShiftInstanceStatus";
 import { OpenShiftService } from "@kie-tools-core/openshift/dist/service/OpenShiftService";
-import { useHistory } from "react-router";
-import { QueryParams } from "../navigation/Routes";
+import { useHistory, useRouteMatch } from "react-router";
+import { QueryParams, routes } from "../navigation/Routes";
 import { GITHUB_AUTH_TOKEN_COOKIE_NAME } from "./github/GitHubSettingsTab";
 import { KafkaSettingsConfig, readKafkaConfigCookie } from "./kafka/KafkaSettingsConfig";
 import { readServiceAccountConfigCookie, ServiceAccountSettingsConfig } from "./serviceAccount/ServiceAccountConfig";
@@ -136,6 +136,7 @@ export function SettingsContextProvider(props: any) {
   const history = useHistory();
   const [isOpen, setOpen] = useState(false);
   const [activeTab, setActiveTab] = useState(SettingsTabs.GITHUB);
+  const isRouteInSettingsSection = useRouteMatch(routes.settings.home.path({}));
 
   useEffect(() => {
     setOpen(queryParams.has(QueryParams.SETTINGS));
@@ -343,8 +344,13 @@ export function SettingsContextProvider(props: any) {
   return (
     <SettingsContext.Provider value={value}>
       <SettingsDispatchContext.Provider value={dispatch}>
-        {githubAuthStatus !== AuthStatus.LOADING && <>{props.children}</>}
-        <Modal title="Settings" isOpen={isOpen} onClose={close} variant={ModalVariant.large}>
+        {(isRouteInSettingsSection || githubAuthStatus !== AuthStatus.LOADING) && <>{props.children}</>}
+        <Modal
+          title="Settings"
+          isOpen={!isRouteInSettingsSection && isOpen}
+          onClose={close}
+          variant={ModalVariant.large}
+        >
           <div style={{ height: "calc(100vh * 0.5)" }} className={"kie-tools--settings-modal-content"}>
             <SettingsModalBody />
           </div>
diff --git a/packages/serverless-logic-web-tools/static/resources/style.css b/packages/serverless-logic-web-tools/static/resources/style.css
index f6ecff2555..b54a7c8b6e 100644
--- a/packages/serverless-logic-web-tools/static/resources/style.css
+++ b/packages/serverless-logic-web-tools/static/resources/style.css
@@ -652,3 +652,15 @@ section.kie-tools--settings-tab {
 .pf-c-masthead__main::before {
   display: none;
 }
+
+.chr-c-app-title {
+  color: #fff;
+  padding: var(--pf-global--spacer--md) var(--pf-global--spacer--sm) var(--pf-global--spacer--md)
+    var(--pf-global--spacer--lg);
+  width: 100%;
+  border-bottom: var(--pf-global--spacer--xs) solid var(--pf-global--Color--300);
+  font-weight: var(--pf-global--FontWeight--semi-bold);
+  white-space: normal;
+  text-align: left;
+  font-size: 17px;
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 25/27: KOGITO-8475: Adapt existing integration tests with new UI (#1661)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit 1e1e5ebb9a31be388be78dd94a32426cf1214bdf
Author: Fabrizio Antonangeli <fa...@gmail.com>
AuthorDate: Tue May 23 21:51:41 2023 +0200

    KOGITO-8475: Adapt existing integration tests with new UI (#1661)
---
 .../it-tests/e2e/CreateNewFile.cy.ts               |  2 +-
 .../it-tests/e2e/RecentModel.cy.ts                 | 27 ++++++++--------------
 .../it-tests/support/commands.ts                   | 16 +++++++++++++
 .../it-tests/support/e2e.ts                        |  9 ++++++++
 packages/serverless-logic-web-tools/package.json   |  3 +--
 .../src/homepage/overView/NewModelCard.tsx         |  2 +-
 .../src/homepage/overView/Overview.tsx             |  2 +-
 .../src/homepage/pageTemplate/OnlineEditorPage.tsx |  4 +++-
 .../src/homepage/uiNav/HomePageNav.tsx             | 15 ++++++++++--
 9 files changed, 55 insertions(+), 25 deletions(-)

diff --git a/packages/serverless-logic-web-tools/it-tests/e2e/CreateNewFile.cy.ts b/packages/serverless-logic-web-tools/it-tests/e2e/CreateNewFile.cy.ts
index 69906ae52f..fc0202a150 100644
--- a/packages/serverless-logic-web-tools/it-tests/e2e/CreateNewFile.cy.ts
+++ b/packages/serverless-logic-web-tools/it-tests/e2e/CreateNewFile.cy.ts
@@ -28,7 +28,7 @@ describe("Serverless Logic Web Tools - Create and edit test", () => {
     cy.ouia({ ouiaId: "new-yard.yaml-button" }).should("have.text", "YAML");
 
     cy.ouia({ ouiaId: "Dashboard-card" }).find("button").should("have.length", 1);
-    cy.ouia({ ouiaId: "new-dash.yaml-button" }).should("have.text", "New Dashboard");
+    cy.ouia({ ouiaId: "new-dash.yaml-button" }).should("have.text", "YAML");
   });
 
   it("should create a new JSON serverless workflow", () => {
diff --git a/packages/serverless-logic-web-tools/it-tests/e2e/RecentModel.cy.ts b/packages/serverless-logic-web-tools/it-tests/e2e/RecentModel.cy.ts
index 828904b575..55e6302268 100644
--- a/packages/serverless-logic-web-tools/it-tests/e2e/RecentModel.cy.ts
+++ b/packages/serverless-logic-web-tools/it-tests/e2e/RecentModel.cy.ts
@@ -13,8 +13,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+import { deleteAllIndexedDBs } from "../support/e2e";
+
 describe("Serverless Logic Web Tools - Recent model test", () => {
   beforeEach(() => {
+    deleteAllIndexedDBs();
     cy.visit("/");
   });
 
@@ -39,8 +42,10 @@ describe("Serverless Logic Web Tools - Recent model test", () => {
 
     // open again from main page
     cy.ouia({ ouiaId: "app-title" }).click();
-    cy.ouia({ ouiaId: "recent-models-section" })
-      .find("article h3")
+    cy.goToSidebarLink({ ouiaId: "recent-models-nav" });
+
+    cy.ouia({ ouiaId: "OUIA-Generated-TableRow-2" })
+      .find("[data-label='Name'] > a")
       .eq(0)
       .should(($item) => expect($item.text().trim()).equal("testJsonFile"))
       .click();
@@ -56,20 +61,8 @@ describe("Serverless Logic Web Tools - Recent model test", () => {
     cy.ouia({ ouiaId: "kebab-sm" }).click();
     cy.ouia({ ouiaId: "delete-file-button" }).click();
 
-    // check the file is deleted (recent section is emtpy or the first item is not the file)
-    // cypress currently does not allow to clean browser db
-    cy.ouia({ ouiaId: "recent-models-section-body" })
-      .children()
-      .then(($div) => {
-        if ($div.hasClass("pf-l-bullseye")) {
-          cy.ouia({ ouiaId: "empty-recent-models-title" }).should("have.text", "Nothing here");
-        } else {
-          cy.ouia({ ouiaId: "recent-models-section" })
-            .find("article h3")
-            .eq(0)
-            .should(($item) => expect($item.text().trim()).not.equal("testJsonFile"))
-            .click();
-        }
-      });
+    // check the file is deleted (recent section is emtpy)
+    cy.goToSidebarLink({ ouiaId: "recent-models-nav" });
+    cy.get(".pf-l-bullseye").should("contain.text", "Nothing here");
   });
 });
diff --git a/packages/serverless-logic-web-tools/it-tests/support/commands.ts b/packages/serverless-logic-web-tools/it-tests/support/commands.ts
index fce89fa5be..9010d4aa90 100644
--- a/packages/serverless-logic-web-tools/it-tests/support/commands.ts
+++ b/packages/serverless-logic-web-tools/it-tests/support/commands.ts
@@ -39,6 +39,12 @@ declare namespace Cypress {
      * @param opts optional - config object
      */
     ouia<S = any>(locator: { ouiaType?: string; ouiaId?: string }, opts?: Record<string, any>): Chainable<S>;
+
+    /**
+     * Go to a link in the sidebar menu
+     * @param locator component id according to OUIA specification
+     */
+    goToSidebarLink(locator: { ouiaId: string }): void;
   }
 }
 
@@ -85,3 +91,13 @@ Cypress.Commands.add("ouia", { prevSubject: "optional" }, (subject, locator, opt
     cy.get(selector, options);
   }
 });
+
+Cypress.Commands.add("goToSidebarLink", { prevSubject: false }, (locator) => {
+  cy.get("#page-sidebar").then((pageSidebar) => {
+    if (!pageSidebar.is(":visible")) {
+      cy.get("#nav-toggle").click();
+    }
+    cy.ouia({ ouiaId: locator.ouiaId }).click();
+    cy.get("#nav-toggle").click();
+  });
+});
diff --git a/packages/serverless-logic-web-tools/it-tests/support/e2e.ts b/packages/serverless-logic-web-tools/it-tests/support/e2e.ts
index 7ae78aa6e8..a96aa28cc6 100644
--- a/packages/serverless-logic-web-tools/it-tests/support/e2e.ts
+++ b/packages/serverless-logic-web-tools/it-tests/support/e2e.ts
@@ -23,3 +23,12 @@ Cypress.on("uncaught:exception", (err, runnable) => {
   // failing the test
   return false;
 });
+
+/**
+ * Delete all indexed DBs
+ */
+export const deleteAllIndexedDBs = async () => {
+  Promise.all(
+    (await indexedDB.databases()).filter((db) => db.name).map(async (db) => indexedDB.deleteDatabase(db.name!))
+  );
+};
diff --git a/packages/serverless-logic-web-tools/package.json b/packages/serverless-logic-web-tools/package.json
index a37ebbafa6..b80490fa23 100644
--- a/packages/serverless-logic-web-tools/package.json
+++ b/packages/serverless-logic-web-tools/package.json
@@ -16,10 +16,9 @@
   "main": "dist/index.js",
   "scripts": {
     "build:dev": "rimraf dist && webpack --env dev",
-    "build:prod": "pnpm lint && pnpm test && rimraf dist && webpack",
+    "build:prod": "pnpm lint && pnpm test && rimraf dist && webpack && pnpm test:it",
     "cy:open": "cypress open --project it-tests --config baseUrl=$(build-env serverlessLogicWebTools.dev.cypressUrl)",
     "cy:run": "cypress run --headed -b chrome --project it-tests --config baseUrl=$(build-env serverlessLogicWebTools.dev.cypressUrl)",
-    "format": "prettier --write  './src/**/*.{tsx,ts,js}'",
     "lint": "run-script-if --bool \"$(build-env linters.run)\" --then \"kie-tools--eslint ./src\"",
     "postreport": "jrm ./dist-it-tests/junit-transformed.xml \"./dist-it-tests/junit-report*.xml\"",
     "start": "webpack serve --host 0.0.0.0 --env dev",
diff --git a/packages/serverless-logic-web-tools/src/homepage/overView/NewModelCard.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/NewModelCard.tsx
index a9ac11041a..6fb9833fd5 100644
--- a/packages/serverless-logic-web-tools/src/homepage/overView/NewModelCard.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/overView/NewModelCard.tsx
@@ -40,7 +40,7 @@ export function NewModelCard(props: {
 
   return (
     <GridItem sm={12} md={4}>
-      <Card isFullHeight={true} isPlain={true} isCompact={true}>
+      <Card isFullHeight={true} isPlain={true} isCompact={true} ouiaId={`${props.title}-card`}>
         <CardTitle>
           <FileLabel style={{ fontSize: "0.6em" }} extension={(jsonExtension || yamlExtension)!} />
         </CardTitle>
diff --git a/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx b/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx
index 62f2bc857e..b7f2758749 100644
--- a/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/overView/Overview.tsx
@@ -149,7 +149,7 @@ export function Overview(props: { isNavOpen: boolean }) {
                   />
                   <NewModelCard
                     title={"Dashboard"}
-                    yamlExtension={FileTypes.DASH_YML}
+                    yamlExtension={FileTypes.DASH_YAML}
                     description={"Define data visualization from data extracted from applications."}
                   />
                 </Grid>
diff --git a/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx b/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
index 733cf4dd84..e4b162b10b 100644
--- a/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
@@ -125,7 +125,9 @@ export function OnlineEditorPage(props: OnlineEditorPageProps) {
           style={{ textDecoration: "none" }}
         >
           <Brand className="kogito-tools-common--brand" src="favicon.svg" alt="Kie logo"></Brand>
-          <div className="brand-name">{APP_NAME}</div>
+          <div className="brand-name" data-ouia-component-id="app-title">
+            {APP_NAME}
+          </div>
         </MastheadBrand>
       </MastheadMain>
       <MastheadContent>{headerToolbar}</MastheadContent>
diff --git a/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx b/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx
index dca5bfeac4..f5c665beb0 100644
--- a/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/uiNav/HomePageNav.tsx
@@ -26,7 +26,12 @@ export function HomePageNav(props: { pathname: string }) {
     <>
       <Nav aria-label="Global NAV" theme="dark">
         <NavList>
-          <NavItem itemId={0} key={"Overview-nav"} isActive={props.pathname === routes.home.path({})}>
+          <NavItem
+            itemId={0}
+            key={"Overview-nav"}
+            isActive={props.pathname === routes.home.path({})}
+            ouiaId="overview-nav"
+          >
             <Link to={routes.home.path({})}>Overview</Link>
           </NavItem>
 
@@ -38,11 +43,17 @@ export function HomePageNav(props: { pathname: string }) {
               matchPath(props.pathname, { path: routes.workspaceWithFiles.path({ workspaceId: ":workspaceId" }) })
                 ?.isExact
             }
+            ouiaId="recent-models-nav"
           >
             <Link to={routes.recentModels.path({})}>Recent Models</Link>
           </NavItem>
 
-          <NavItem itemId={2} key={"SampleCatalog-nav"} isActive={props.pathname === routes.sampleCatalog.path({})}>
+          <NavItem
+            itemId={2}
+            key={"SampleCatalog-nav"}
+            isActive={props.pathname === routes.sampleCatalog.path({})}
+            ouiaId="samples-catalog-nav"
+          >
             <Link to={routes.sampleCatalog.path({})}>Sample Catalog</Link>
           </NavItem>
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 23/27: NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1653)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit 62a67f8097212eb05a0d4b851e86f2b5bd0e2206
Merge: 67ce3c7568 823500e4a2
Author: Guilherme Caponetto <63...@users.noreply.github.com>
AuthorDate: Fri May 19 07:08:36 2023 -0300

    NO-ISSUE: merge main into KOGITO-8015-feature-preview (#1653)

 .github/workflows/release_build.yml                |    2 +-
 RELEASE_PROCESS.md                                 |    7 +
 .../base64png-editor-chrome-extension/package.json |    2 +-
 .../base64png-editor-vscode-extension/package.json |    2 +-
 examples/base64png-editor/package.json             |    2 +-
 examples/commit-message-validation-service/go.mod  |   23 +-
 examples/commit-message-validation-service/go.sum  |   49 +-
 examples/ping-pong-view-angular/package.json       |   26 +-
 examples/ping-pong-view-react/package.json         |    2 +-
 examples/ping-pong-view/package.json               |    2 +-
 .../todo-list-view-vscode-extension/package.json   |    2 +-
 examples/todo-list-view/package.json               |    2 +-
 examples/uniforms-patternfly/package.json          |    2 +-
 examples/webapp/package.json                       |    2 +-
 packages/backend/package.json                      |    2 +-
 packages/boxed-expression-component/package.json   |    2 +-
 .../src/resizing/WidthConstants.ts                 |    8 +-
 .../src/selection/BeeTableSelectionContext.tsx     |   43 +-
 .../src/table/BeeTable/BeeTableTd.tsx              |   30 +-
 .../src/table/BeeTable/BeeTableThResizable.tsx     |   81 +-
 .../package.json                                   |    2 +-
 .../package.json                                   |    2 +-
 packages/chrome-extension/package.json             |    2 +-
 packages/dashbuilder-component-api/package.json    |    2 +-
 packages/dashbuilder-component-dev/package.json    |    2 +-
 .../package.json                                   |    2 +-
 .../dashbuilder-component-echarts/package.json     |    2 +-
 packages/dashbuilder-component-map/package.json    |    2 +-
 .../dashbuilder-component-svg-heatmap/package.json |    2 +-
 packages/dashbuilder-component-table/package.json  |    2 +-
 .../dashbuilder-component-timeseries/package.json  |    2 +-
 .../dashbuilder-component-uniforms/package.json    |    2 +-
 .../package.json                                   |    2 +-
 packages/dashbuilder-editor/package.json           |    2 +-
 packages/dashbuilder-language-service/package.json |    2 +-
 .../package.json                                   |    2 +-
 packages/dashbuilder-viewer/package.json           |    2 +-
 .../dashbuilder/appformer/uberfire-commons/pom.xml |   58 -
 .../uberfire-layout-editor-client/pom.xml          |   21 -
 .../uberfire-runtime-plugins-client/pom.xml        |  109 +-
 .../layout/editor/MarkdownLayoutDragComponent.java |   49 +
 .../perspective/editor/layout/editor/Marked.java}  |   26 +-
 ...{WebAppResource.java => ResourcesInjector.java} |   34 +-
 .../plugin/client/resources/WebAppResource.java    |    9 +-
 .../appformer/uberfire-testing-utils/pom.xml       |    9 -
 .../pom.xml                                        |   13 -
 .../uberfire-workbench-client/pom.xml              |    5 -
 .../dashbuilder-common-client/pom.xml              |   38 -
 .../dashbuilder-dataset-client/pom.xml             |   32 -
 .../dashbuilder-displayer-client/pom.xml           |   37 +-
 .../dashbuilder-displayer-editor/pom.xml           |   25 -
 .../dashbuilder-navigation-client/pom.xml          |   21 -
 .../dashbuilder-renderer-c3/pom.xml                |   12 +-
 .../dashbuilder-renderer-default/pom.xml           |   27 +-
 .../dashbuilder-renderer-echarts/pom.xml           |   44 -
 .../dashbuilder-runtime-client/pom.xml             |   45 -
 .../marshalling/LayoutTemplateJSONMarshaller.java  |   56 +-
 .../LayoutTemplateJSONMarshallerTest.java          |   18 +-
 .../dashbuilder-navigation-api/pom.xml             |    5 -
 .../dashbuilder-services-api/pom.xml               |   15 -
 .../kie-soup-dataset/kie-soup-dataset-core/pom.xml |    7 -
 packages/dashbuilder/pom.xml                       |   22 +-
 .../dmn-dev-deployment-base-image/Containerfile    |   12 +-
 .../dmn-dev-deployment-form-webapp/package.json    |    2 +-
 packages/dmn-language-service/package.json         |    2 +-
 .../{form/src/index.ts => dmn-runner/env/index.js} |   19 +-
 .../jest.config.js}                                |   26 +-
 packages/{envelope => dmn-runner}/package.json     |   17 +-
 .../{form => dmn-runner}/src/ErrorBoundary.tsx     |    0
 .../src/constants.ts}                              |   16 +-
 .../src/uniforms/DmnAutoFieldProvider.tsx          |    8 +-
 .../src/uniforms/DmnFeelContextField.tsx           |   19 +-
 .../{form/src => dmn-runner/src/uniforms}/index.ts |   13 +-
 packages/dmn-runner/tsconfig.json                  |   12 +
 packages/editor/package.json                       |    2 +-
 packages/envelope-bus/package.json                 |    2 +-
 .../src/common/EnvelopeBusMessageManager.ts        |    4 +-
 packages/envelope/package.json                     |    2 +-
 packages/extended-services-api/package.json        |    2 +-
 packages/extended-services-api/src/dmnResult.ts    |    9 +-
 packages/feel-input-component/package.json         |    2 +-
 packages/form-dmn/package.json                     |    3 +-
 packages/form-dmn/src/DmnForm.tsx                  |    4 +-
 packages/form-dmn/src/DmnFormResult.tsx            |   82 +-
 packages/form-dmn/src/DmnValidator.ts              |   17 +-
 packages/form-dmn/src/i18n/DmnFormI18n.ts          |    4 +-
 .../src/uniforms/DmnFormJsonSchemaBridge.ts        |    6 +-
 packages/form-generation-tool/package.json         |    2 +-
 packages/form/package.json                         |    3 +-
 packages/form/src/FormBase.tsx                     |    2 +-
 packages/form/src/FormHook.tsx                     |    2 +-
 packages/form/src/index.ts                         |    1 -
 packages/i18n-common-dictionary/package.json       |    2 +-
 packages/i18n/package.json                         |    2 +-
 packages/i18n/src/core/immutableDeepMerge.ts       |    4 +-
 packages/image-env-to-json/package.json            |    2 +-
 .../import-java-classes-component/package.json     |    2 +-
 packages/json-yaml-language-service/package.json   |    2 +-
 packages/keyboard-shortcuts/package.json           |    2 +-
 packages/kie-bc-editors/package.json               |    2 +-
 .../it-tests/extension-editors-bpmn.test.ts        |   61 +-
 .../it-tests/extension-editors-dmn.test.ts         |   29 +-
 .../it-tests/extension-editors-scesim.test.ts      |   16 +-
 .../it-tests/extension-editors-smoke.test.ts       |   33 +-
 .../it-tests/helpers/CommonAsserts.ts              |   54 -
 .../it-tests/helpers/CommonLocators.ts             |   10 +-
 .../it-tests/helpers/PmmlEditorTestHelper.ts       |   18 +-
 .../it-tests/helpers/ScesimEditorTestHelper.ts     |   14 +-
 .../it-tests/helpers/VSCodeTestHelper.ts           |  303 --
 .../it-tests/helpers/bpmn/BpmnEditorTestHelper.ts  |   19 +-
 .../it-tests/helpers/bpmn/DiagramExplorerHelper.ts |    4 +-
 .../helpers/bpmn/ProcessVariablesWidgetHelper.ts   |    4 +-
 .../it-tests/helpers/bpmn/PropertiesPanelHelper.ts |    4 +-
 .../helpers/dmn/DecisionNavigatorHelper.ts         |    4 +-
 .../it-tests/helpers/dmn/DmnEditorTestHelper.ts    |   10 +-
 .../it-tests/helpers/dmn/ExpressionEditorHelper.ts |    4 +-
 .../kie-editors-dev-vscode-extension/package.json  |    5 +-
 packages/kie-editors-standalone/package.json       |    2 +-
 packages/kie-sandbox-fs/package.json               |    2 +-
 packages/kie-sandbox-image/Containerfile           |    2 +-
 packages/kie-sandbox-image/package.json            |    6 +-
 packages/kubernetes-bridge/package.json            |    2 +-
 packages/monaco-editor/package.json                |    2 +-
 packages/notifications/package.json                |    2 +-
 packages/online-editor/package.json                |    2 +-
 .../src/__tests__/jsonSchema/dereference.test.ts   |  180 +
 .../src/dmnRunner/DmnRunnerContextProvider.tsx     |    8 +-
 .../src/dmnRunner/DmnRunnerErrorBoundary.tsx       |   10 +-
 .../online-editor/src/dmnRunner/DmnRunnerTable.tsx |   30 +-
 .../src/editor/Toolbar/EditorToolbar.tsx           |    6 +-
 .../Toolbar/EditorToolbarContextProvider.tsx       |    8 +-
 .../src/editor/Toolbar/Share/EmbedModal.tsx        |   11 +
 packages/online-editor/src/i18n/OnlineI18n.ts      |    1 +
 packages/online-editor/src/i18n/locales/en.ts      |    1 +
 .../online-editor/src/jsonSchema/dereference.ts    |   73 +-
 packages/operating-system/package.json             |    2 +-
 packages/pmml-editor-marshaller/package.json       |    2 +-
 packages/pmml-editor/package.json                  |    2 +-
 packages/react-hooks/package.json                  |    2 +-
 packages/react-hooks/src/PromiseState.tsx          |    6 +-
 .../package.json                                   |    2 +-
 packages/serverless-logic-web-tools/package.json   |    2 +-
 .../package.json                                   |    2 +-
 .../package.json                                   |    2 +-
 .../stunner/core/graph/util/GraphUtilsTest.java    |    3 +-
 .../common/stunner/sw/definition/ForEachState.java |   30 +
 .../stunner/sw/definition/ParallelState.java       |   11 +-
 .../custom/NumCompletedJsonTypeSerializer.java     |   34 -
 .../BatchSizeJsonTypeSerializer.java}              |   23 +-
 .../NumCompletedJsonTypeSerializer.java}           |   20 +-
 ...er.java => StringNumberYamlTypeSerializer.java} |    4 +-
 .../stunner/sw/resources/i18n/SWConstants.java     |    9 +
 .../sw/resources/i18n/SWConstants.properties       |    7 +-
 .../sw/client/shapes/ForEachStateShape.java        |   20 +-
 .../stunner/sw/client/shapes/HasCollections.java   |   51 +
 .../shapes/HasConditionsAndHasDataFilter.java      |    2 +-
 .../stunner/sw/client/shapes/HasDataFilter.java    |   10 +-
 .../sw/client/shapes/HasEventAndDataFilter.java    |    4 +-
 .../stunner/sw/client/shapes/icons/IconPath.java   |    1 +
 .../sw/client/shapes/icons/IconPosition.java       |    1 +
 .../sw/client/shapes/HasCollectionsTest.java       |  138 +
 .../package.json                                   |    2 +-
 .../package.json                                   |    2 +-
 .../package.json                                   |    2 +-
 .../package.json                                   |    2 +-
 .../package.json                                   |    2 +-
 .../serverless-workflow-text-editor/package.json   |    2 +-
 .../CHANGELOG.md                                   |    4 +
 .../it-tests/helpers/CommonAsserts.ts              |   54 -
 .../it-tests/helpers/swf/SwfEditorTestHelper.ts    |   18 +-
 ...orkflow-editor-extension-autocompletion.test.ts |    6 +-
 ...kflow-editor-extension-basic-operations.test.ts |    6 +-
 ...low-editor-extension-diagram-navigation.test.ts |    4 +-
 ...ss-workflow-editor-extension-expression.test.ts |    4 +-
 ...ess-workflow-editor-extension-functions.test.ts |    4 +-
 ...verless-workflow-editor-extension-smoke.test.ts |    6 +-
 ...kflow-editor-extension-syntax-highlight.test.ts |    6 +-
 .../package.json                                   |    7 +-
 .../src/extension/extension.ts                     |    2 +-
 packages/stunner-editors-dmn-loader/package.json   |    2 +-
 packages/stunner-editors-dmn-loader/src/index.tsx  |    4 +-
 .../expressions/ExpressionEditorViewImpl.java      |    3 +
 .../jsinterop/util/ExpressionModelFiller.java      |  109 +-
 .../expressions/types/context/ContextGrid.java     |    2 +-
 .../types/dtable/DecisionTableGrid.java            |    6 +-
 .../types/invocation/InvocationGrid.java           |    2 +-
 .../editors/expressions/types/list/ListGrid.java   |    2 +-
 .../types/literal/LiteralExpressionGrid.java       |    2 +-
 .../expressions/types/relation/RelationGrid.java   |    2 +-
 .../constraint/DataTypeConstraintModal.java        |    8 +-
 .../constraint/DataTypeConstraintModalView.java    |    8 +-
 .../jsinterop/util/ExpressionModelFillerTest.java  |   14 +-
 .../DataTypeConstraintModalViewTest.java           |   15 +-
 .../stunner/core/graph/util/GraphUtilsTest.java    |    3 +-
 packages/text-editor/package.json                  |    2 +-
 packages/uniforms-bootstrap4-codegen/package.json  |    2 +-
 packages/uniforms-patternfly-codegen/package.json  |    2 +-
 packages/uniforms-patternfly/package.json          |    2 +-
 packages/uniforms-patternfly/src/cjs               |    1 -
 packages/uniforms-patternfly/src/esm               |    1 -
 packages/unitables-dmn/package.json                |    5 +-
 packages/unitables-dmn/src/DmnRunnerOutputs.tsx    |  175 +-
 .../unitables-dmn/src/DmnRunnerOutputsTable.tsx    |  241 +-
 .../unitables-dmn/src/DmnUnitablesValidator.ts     |   14 +-
 .../src/uniforms/DmnUnitablesJsonSchemaBridge.ts   |   13 +-
 packages/unitables/package.json                    |    4 +-
 packages/unitables/src/UnitablesRow.tsx            |    5 +-
 packages/unitables/src/UnitablesWrapper.tsx        |    2 +-
 packages/unitables/src/bee/UnitablesBeeTable.tsx   |   42 +-
 .../src/uniforms/UnitablesJsonSchemaBridge.tsx     |   28 +-
 .../vscode-extension-common-test-helpers/README.md |    3 +
 .../package.json                                   |   44 +
 .../src}/CommonAsserts.ts                          |    2 +-
 .../src/CommonLocators.ts                          |   56 +
 .../src/EditorTestHelper.ts                        |   36 +
 .../src/KieFileExtensions.ts                       |   84 +
 .../src}/VSCodeTestHelper.ts                       |  216 +-
 .../src/index.ts                                   |   14 +-
 .../tsconfig.json                                  |    8 +
 .../dashbuilder-editor-extension-smoke.test.ts     |    4 +-
 .../it-tests/helpers/VSCodeTestHelper.ts           |  251 -
 .../dashbuilder/DashbuilderEditorTestHelper.ts     |   23 +-
 .../package.json                                   |    5 +-
 .../vscode-extension-kogito-bundle/CHANGELOG.md    |    4 +
 .../vscode-extension-kogito-bundle/package.json    |    2 +-
 .../CHANGELOG.md                                   |    4 +
 .../README.md                                      |    2 +-
 .../it-tests/helpers/VSCodeTestHelper.ts           |  328 --
 .../it-tests/helpers/swf/SwfEditorTestHelper.ts    |   18 +-
 ...orkflow-editor-extension-autocompletion.test.ts |    6 +-
 ...kflow-editor-extension-basic-operations.test.ts |    6 +-
 ...low-editor-extension-diagram-navigation.test.ts |    4 +-
 ...ss-workflow-editor-extension-expression.test.ts |    4 +-
 ...ess-workflow-editor-extension-functions.test.ts |    4 +-
 ...verless-workflow-editor-extension-smoke.test.ts |    6 +-
 ...kflow-editor-extension-syntax-highlight.test.ts |    6 +-
 .../package.json                                   |    5 +-
 .../src/extension/setupDeprecationNotification.ts  |    2 +-
 packages/vscode-extension/package.json             |    2 +-
 .../pom.xml                                        |    7 +-
 packages/vscode-java-code-completion/package.json  |    2 +-
 .../multi-package-live-reload-loader.js            |    1 +
 packages/workspace/package.json                    |    2 +-
 packages/workspaces-git-fs/package.json            |    2 +-
 packages/yaml-language-server/package.json         |    2 +-
 packages/yard-editor/package.json                  |    2 +-
 .../it-tests/helpers/CommonAsserts.ts              |   54 -
 .../it-tests/helpers/VSCodeTestHelper.ts           |  272 -
 .../it-tests/helpers/yard/YardEditorTestHelper.ts  |   19 +-
 .../helpers/yard/YardTextEditorTestHelper.ts       |   14 +-
 .../it-tests/yard-editor.test.ts                   |   17 +-
 packages/yard-vscode-extension/package.json        |    5 +-
 pnpm-lock.yaml                                     | 5573 ++++++++++++++------
 repo/graph.dot                                     |   37 +-
 repo/graph.json                                    |   61 +-
 scripts/build-env/package.json                     |    2 +-
 256 files changed, 6275 insertions(+), 4505 deletions(-)


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org


[incubator-kie-tools-temporary-rnd-do-not-use] 24/27: KOGITO-8966: Ability to completely erase stored data on browser (#1656)

Posted by po...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

porcelli pushed a commit to branch KOGITO-8015-feature-preview
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools-temporary-rnd-do-not-use.git

commit 9335ac938501e5b7e980216f9fa504739afe953c
Author: Fabrizio Antonangeli <fa...@gmail.com>
AuthorDate: Tue May 23 15:25:21 2023 +0200

    KOGITO-8966: Ability to completely erase stored data on browser (#1656)
    
    Co-authored-by: Guilherme Caponetto <63...@users.noreply.github.com>
---
 .../src/cookies/index.ts                           |   9 +
 .../src/home/sample/SamplesCatalog.tsx             |  14 +-
 .../src/homepage/pageTemplate/OnlineEditorPage.tsx |   6 +-
 .../src/navigation/Routes.ts                       |   1 +
 .../src/settings/routes/SettingsPageRoutes.tsx     |   4 +
 .../src/settings/storage/StorageSettings.tsx       | 199 +++++++++++++++++++++
 .../src/settings/uiNav/SettingsPageNav.tsx         |  15 +-
 .../workspace/startupBlockers/SupportedBrowsers.ts |   8 +
 8 files changed, 247 insertions(+), 9 deletions(-)

diff --git a/packages/serverless-logic-web-tools/src/cookies/index.ts b/packages/serverless-logic-web-tools/src/cookies/index.ts
index 73c7f62f1f..3776e20e81 100644
--- a/packages/serverless-logic-web-tools/src/cookies/index.ts
+++ b/packages/serverless-logic-web-tools/src/cookies/index.ts
@@ -32,3 +32,12 @@ export function setCookie(name: string, value: string) {
 }
 
 export const makeCookieName = (group: string, name: string) => `KIE-TOOLS__serverless-logic-sandbox__${group}--${name}`;
+
+/**
+ * Delete all cookies
+ */
+export const deleteAllCookies = () => {
+  document.cookie.split(";").forEach(function (c) {
+    document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/");
+  });
+};
diff --git a/packages/serverless-logic-web-tools/src/home/sample/SamplesCatalog.tsx b/packages/serverless-logic-web-tools/src/home/sample/SamplesCatalog.tsx
index cac108bc89..76258ddfb2 100644
--- a/packages/serverless-logic-web-tools/src/home/sample/SamplesCatalog.tsx
+++ b/packages/serverless-logic-web-tools/src/home/sample/SamplesCatalog.tsx
@@ -75,7 +75,7 @@ export function SamplesCatalog() {
   const [sampleCovers, setSampleCovers] = useState<SampleCoversHashtable>({});
   const [sampleLoadingError, setSampleLoadingError] = useState("");
   const [searchFilter, setSearchFilter] = useState("");
-  const [searchParams, setSearchParams] = useState<SearchParams>({ searchValue: "", category: undefined });
+  const [searchParams, setSearchParams] = useState<SearchParams | undefined>(undefined);
   const [page, setPage] = React.useState(1);
   const [isCategoryFilterDropdownOpen, setCategoryFilterDropdownOpen] = useState(false);
   const history = useHistory();
@@ -121,12 +121,13 @@ export function SamplesCatalog() {
 
   const onSearch = useCallback(
     async (args: SearchParams) => {
-      if (args.searchValue === searchParams.searchValue && args.category === searchParams.category) {
+      if (searchParams && args.searchValue === searchParams.searchValue && args.category === searchParams.category) {
         return;
       }
       setSearchFilter(args.searchValue);
       setCategoryFilter(args.category);
       setSearchParams(args);
+      setPage(1);
       setSamples(await sampleDispatch.getSamples({ searchFilter: args.searchValue, categoryFilter: args.category }));
     },
     [sampleDispatch, setCategoryFilter, searchParams]
@@ -142,8 +143,13 @@ export function SamplesCatalog() {
   }, [categoryFilter, onSearch, searchFilter, setCategoryFilter]);
 
   useEffect(() => {
+    if (searchParams && searchFilter === searchParams.searchValue && categoryFilter === searchParams.category) {
+      return;
+    }
+    setSearchParams({ searchValue: searchFilter, category: categoryFilter });
+
     sampleDispatch
-      .getSamples({})
+      .getSamples({ categoryFilter })
       .then((data) => {
         const sortedSamples = data.sort(
           (a: Sample, b: Sample) => SAMPLE_PRIORITY[a.definition.category] - SAMPLE_PRIORITY[b.definition.category]
@@ -156,7 +162,7 @@ export function SamplesCatalog() {
       .finally(() => {
         setLoading(false);
       });
-  }, [sampleDispatch]);
+  }, [sampleDispatch, categoryFilter, searchFilter, searchParams]);
 
   useEffect(() => {
     sampleDispatch.getSampleCovers({ samples: visibleSamples, prevState: sampleCovers }).then(setSampleCovers);
diff --git a/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx b/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
index e37a20feb0..733cf4dd84 100644
--- a/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
+++ b/packages/serverless-logic-web-tools/src/homepage/pageTemplate/OnlineEditorPage.tsx
@@ -45,6 +45,7 @@ import {
 import { SettingsButton } from "../../settings/SettingsButton";
 import { HomePageNav } from "../uiNav/HomePageNav";
 import { APP_NAME } from "../../AppConstants";
+import { isBrowserChromiumBased } from "../../workspace/startupBlockers/SupportedBrowsers";
 
 export type OnlineEditorPageProps = {
   children?: React.ReactNode;
@@ -69,10 +70,7 @@ export function OnlineEditorPage(props: OnlineEditorPageProps) {
     useQueryParams: false,
   };
 
-  const isChromiumBased = useMemo(() => {
-    const agent = window.navigator.userAgent.toLowerCase();
-    return agent.indexOf("edg") > -1 || agent.indexOf("chrome") > -1;
-  }, []);
+  const isChromiumBased = useMemo(isBrowserChromiumBased, []);
 
   const headerToolbar = (
     <Toolbar id="toolbar" isFullHeight isStatic>
diff --git a/packages/serverless-logic-web-tools/src/navigation/Routes.ts b/packages/serverless-logic-web-tools/src/navigation/Routes.ts
index e2e485fdf4..fb783a26a3 100644
--- a/packages/serverless-logic-web-tools/src/navigation/Routes.ts
+++ b/packages/serverless-logic-web-tools/src/navigation/Routes.ts
@@ -148,6 +148,7 @@ export const routes = {
     service_account: new Route<{}>(() => `${SETTINGS_ROUTE}/service-account`),
     service_registry: new Route<{}>(() => `${SETTINGS_ROUTE}/service-registry`),
     feature_preview: new Route<{}>(() => `${SETTINGS_ROUTE}/feature-preview`),
+    storage: new Route<{}>(() => `${SETTINGS_ROUTE}/storage`),
   },
 
   static: {
diff --git a/packages/serverless-logic-web-tools/src/settings/routes/SettingsPageRoutes.tsx b/packages/serverless-logic-web-tools/src/settings/routes/SettingsPageRoutes.tsx
index ed3da455c8..78b029faea 100644
--- a/packages/serverless-logic-web-tools/src/settings/routes/SettingsPageRoutes.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/routes/SettingsPageRoutes.tsx
@@ -25,6 +25,7 @@ import { OpenShiftSettings } from "../openshift/OpenShiftSettings";
 import { ServiceAccountSettings } from "../serviceAccount/ServiceAccountSettings";
 import { ServiceRegistrySettings } from "../serviceRegistry/ServiceRegistrySettings";
 import { SettingsPageProps } from "../types";
+import { StorageSettings } from "../storage/StorageSettings";
 
 export function SettingsPageRoutes(props: {} & SettingsPageProps) {
   const routes = useRoutes();
@@ -52,6 +53,9 @@ export function SettingsPageRoutes(props: {} & SettingsPageProps) {
       <Route path={routes.settings.feature_preview.path({})}>
         <FeaturePreviewSettings />
       </Route>
+      <Route path={routes.settings.storage.path({})}>
+        <StorageSettings />
+      </Route>
       <Route>
         <Redirect to={routes.settings.github.path({})} />
       </Route>
diff --git a/packages/serverless-logic-web-tools/src/settings/storage/StorageSettings.tsx b/packages/serverless-logic-web-tools/src/settings/storage/StorageSettings.tsx
new file mode 100644
index 0000000000..ccba6c851f
--- /dev/null
+++ b/packages/serverless-logic-web-tools/src/settings/storage/StorageSettings.tsx
@@ -0,0 +1,199 @@
+/*
+ * Copyright 2023 Red Hat, Inc. and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from "react";
+import { useController } from "@kie-tools-core/react-hooks/dist/useController";
+import { Alert, AlertActionCloseButton, Button } from "@patternfly/react-core/dist/js";
+import { Checkbox } from "@patternfly/react-core/dist/js/components/Checkbox";
+import { Form } from "@patternfly/react-core/dist/js/components/Form";
+import { Page, PageSection } from "@patternfly/react-core/dist/js/components/Page";
+import { Text, TextContent, TextVariants } from "@patternfly/react-core/dist/js/components/Text";
+import { useCallback, useEffect, useState } from "react";
+import { Alerts, AlertsController, useAlert } from "../../alerts/Alerts";
+import { APP_NAME } from "../../AppConstants";
+import { routes } from "../../navigation/Routes";
+import { setPageTitle } from "../../PageTitle";
+import { ConfirmDeleteModal } from "../../table/ConfirmDeleteModal";
+import { SETTINGS_PAGE_SECTION_TITLE } from "../SettingsContext";
+import { deleteAllCookies } from "../../cookies";
+import { isBrowserChromiumBased } from "../../workspace/startupBlockers/SupportedBrowsers";
+import { useHistory } from "react-router";
+
+const PAGE_TITLE = "Storage";
+/**
+ * delete alert delay in seconds before reloading the app.
+ */
+const DELETE_ALERT_DELAY = 5;
+
+/**
+ * Delete all indexed DBs
+ */
+const deleteAllIndexedDBs = async () => {
+  Promise.all(
+    (await indexedDB.databases()).filter((db) => db.name).map(async (db) => indexedDB.deleteDatabase(db.name!))
+  );
+};
+
+function Timer(props: { delay: number }) {
+  const [delay, setDelay] = useState(props.delay);
+
+  useEffect(() => {
+    const timer = setInterval(() => {
+      setDelay((prevDelay) => prevDelay - 1);
+    }, 1000);
+
+    return () => {
+      clearInterval(timer);
+    };
+  }, []);
+
+  return <>{delay}</>;
+}
+
+export function StorageSettings() {
+  const [isDeleteCookiesChecked, setIsDeleteCookiesChecked] = useState(false);
+  const [isDeleteLocalStorageChecked, setIsDeleteLocalStorageChecked] = useState(false);
+  const [isConfirmDeleteModalOpen, setIsConfirmDeleteModalOpen] = useState(false);
+  const [alerts, alertsRef] = useController<AlertsController>();
+  const history = useHistory();
+
+  const toggleConfirmModal = useCallback(() => {
+    setIsConfirmDeleteModalOpen((isOpen) => !isOpen);
+  }, []);
+
+  const deleteSuccessAlert = useAlert(
+    alerts,
+    useCallback(({ close }) => {
+      setTimeout(() => {
+        window.location.href = window.location.origin + window.location.pathname;
+      }, DELETE_ALERT_DELAY * 1000);
+      return (
+        <Alert
+          variant="success"
+          title={
+            <>
+              Data deleted successfully. <br />
+              You will be redirected to the home page in <Timer delay={DELETE_ALERT_DELAY} /> seconds
+            </>
+          }
+        />
+      );
+    }, [])
+  );
+
+  const deleteErrorAlert = useAlert(
+    alerts,
+    useCallback(({ close }) => {
+      return (
+        <Alert
+          variant="danger"
+          title={`Oops, something went wrong while trying to delete the selected data. Please refresh the page and try again. If the problem persists, you can try deleting site data for this application in your browser's settings.`}
+          actionClose={<AlertActionCloseButton onClose={close} />}
+        />
+      );
+    }, [])
+  );
+
+  const onConfirmDeleteModalDelete = useCallback(async () => {
+    toggleConfirmModal();
+
+    try {
+      await deleteAllIndexedDBs();
+      if (isDeleteLocalStorageChecked) {
+        localStorage.clear();
+      }
+      if (isDeleteCookiesChecked) {
+        deleteAllCookies();
+      }
+      deleteSuccessAlert.show();
+    } catch (e) {
+      deleteErrorAlert.show();
+    }
+  }, [toggleConfirmModal, deleteSuccessAlert, isDeleteLocalStorageChecked, deleteErrorAlert, isDeleteCookiesChecked]);
+
+  useEffect(() => {
+    if (!isBrowserChromiumBased()) {
+      history.replace(routes.settings.home.path({}));
+    }
+    setPageTitle([SETTINGS_PAGE_SECTION_TITLE, PAGE_TITLE]);
+  }, [history]);
+
+  return (
+    <>
+      <Alerts ref={alertsRef} width={"500px"} />
+      <Page>
+        <PageSection variant={"light"} isWidthLimited>
+          <TextContent>
+            <Text component={TextVariants.h1}>{PAGE_TITLE}</Text>
+            <Text component={TextVariants.p}>
+              Here, you have the ability to completely erase all stored data in your browser.
+              <br />
+              Safely delete your cookies, modules, settings and all information locally stored in your browser, giving a
+              fresh start to {APP_NAME}.
+            </Text>
+          </TextContent>
+        </PageSection>
+
+        <PageSection>
+          <PageSection variant={"light"}>
+            <Form>
+              <Checkbox
+                id="delete-indexedDB"
+                label="Storage"
+                description={"Delete all databases. You will lose all your modules and workspaces."}
+                isChecked
+                isDisabled
+              />
+              <Alert
+                variant="warning"
+                isInline
+                title="By selecting the cookies and local storage, all your saved settings will be permanently erased."
+              >
+                <br />
+                <Checkbox
+                  id="delete-cookies"
+                  label="Cookies"
+                  description={"Delete all cookies."}
+                  isChecked={isDeleteCookiesChecked}
+                  onChange={setIsDeleteCookiesChecked}
+                />
+                <br />
+                <Checkbox
+                  id="delete-localStorage"
+                  label="LocalStorage"
+                  description={"Delete all localStorage information."}
+                  isChecked={isDeleteLocalStorageChecked}
+                  onChange={setIsDeleteLocalStorageChecked}
+                />
+              </Alert>
+            </Form>
+            <br />
+            <Button variant="danger" onClick={toggleConfirmModal}>
+              Delete data
+            </Button>
+          </PageSection>
+        </PageSection>
+        <ConfirmDeleteModal
+          isOpen={isConfirmDeleteModalOpen}
+          onClose={toggleConfirmModal}
+          onDelete={onConfirmDeleteModalDelete}
+          elementsTypeName="data"
+          deleteMessage="By deleting this data will permanently erase your stored information."
+        />
+      </Page>
+    </>
+  );
+}
diff --git a/packages/serverless-logic-web-tools/src/settings/uiNav/SettingsPageNav.tsx b/packages/serverless-logic-web-tools/src/settings/uiNav/SettingsPageNav.tsx
index 021cc91557..1673ea94b2 100644
--- a/packages/serverless-logic-web-tools/src/settings/uiNav/SettingsPageNav.tsx
+++ b/packages/serverless-logic-web-tools/src/settings/uiNav/SettingsPageNav.tsx
@@ -14,14 +14,18 @@
  * limitations under the License.
  */
 
+import React from "react";
 import { Nav, NavItem, NavList } from "@patternfly/react-core/dist/js/components/Nav";
-import * as React from "react";
+import { useMemo } from "react";
 import { Link } from "react-router-dom";
 import { useRoutes } from "../../navigation/Hooks";
+import { isBrowserChromiumBased } from "../../workspace/startupBlockers/SupportedBrowsers";
 
 export function SettingsPageNav(props: { pathname: string }) {
   const routes = useRoutes();
 
+  const isChromiumBased = useMemo(isBrowserChromiumBased, []);
+
   return (
     <>
       <div className="chr-c-app-title">Settings</div>
@@ -65,6 +69,15 @@ export function SettingsPageNav(props: { pathname: string }) {
           >
             <Link to={routes.settings.feature_preview.path({})}>Feature Preview</Link>
           </NavItem>
+          {isChromiumBased && (
+            <NavItem
+              itemId={0}
+              key={`Settings-storage-nav`}
+              isActive={props.pathname === routes.settings.storage.path({})}
+            >
+              <Link to={routes.settings.storage.path({})}>Storage</Link>
+            </NavItem>
+          )}
         </NavList>
       </Nav>
     </>
diff --git a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/SupportedBrowsers.ts b/packages/serverless-logic-web-tools/src/workspace/startupBlockers/SupportedBrowsers.ts
index d264f58180..2fadacadf8 100644
--- a/packages/serverless-logic-web-tools/src/workspace/startupBlockers/SupportedBrowsers.ts
+++ b/packages/serverless-logic-web-tools/src/workspace/startupBlockers/SupportedBrowsers.ts
@@ -52,6 +52,14 @@ export const mapSupportedVersionsToBowser = (...features: MinVersionForFeature[]
   );
 };
 
+/**
+ * Checks if the browser is Chromium based
+ */
+export const isBrowserChromiumBased = (): boolean => {
+  const agent = window.navigator.userAgent.toLowerCase();
+  return agent.indexOf("edg") > -1 || agent.indexOf("chrome") > -1;
+};
+
 export const SUPPORTED_BROWSERS = mapSupportedVersionsToBowser(SharedWebWorkersFeature, BroadcastChannelFeature);
 
 const IS_SUPPORTED = Bowser.getParser(window.navigator.userAgent).satisfies(SUPPORTED_BROWSERS);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@kie.apache.org
For additional commands, e-mail: commits-help@kie.apache.org