Repository: eclipse-syson/syson
Pull request #1266: [1257] Add perform actions compartment in Parts
Author: login: jerome-obeo
Labels: name: pr: to review soon
name: priority: high
Created: 2025-04-30T07:52:47Z | Merged: 2025-05-12T13:30:41Z

Bug: https://github.com/eclipse-syson/syson/issues/1257

# PLEASE READ ALL ITEMS AND CHECK ONLY RELEVANT CHECKBOXES BELOW

## Project management

- [x] Has the pull request been added to the relevant milestone?
- [x] Have the `priority:` and `pr:` labels been added to the pull request? (In case of doubt, start with the labels `priority: low` and `pr: to review later`)
- [x] Have the relevant issues been added to the pull request?
- [x] Have the relevant labels been added to the issues? (`area:`, `type:`)
- [x] Have the relevant issues been added to the same project milestone as the pull request?

## Changelog and release notes

- [x] Has the `CHANGELOG.adoc` + `doc/content/modules/user-manual/pages/release-notes/YYYY.MM.0.adoc` been updated to reference the relevant issues?
- [ ] Have the relevant API breaks been described in the `CHANGELOG.adoc` + `doc/content/modules/user-manual/pages/release-notes/YYYY.MM.0.adoc`?
- [x] In case of a change with a visual impact, are there any screenshots in the `doc/content/modules/user-manual/pages/release-notes/YYYY.MM.0.adoc`?
- [ ] In case of a key change, has the change been added to `Key highlights` section in `doc/content/modules/user-manual/pages/release-notes/YYYY.MM.0.adoc`?
- [ ] Are the new / upgraded dependencies mentioned in the relevant section of the `CHANGELOG.adoc` + `doc/content/modules/user-manual/pages/release-notes/YYYY.MM.0.adoc`?

## Documentation

- [ ] Have you included an update of the [documentation](https://doc.mbse-syson.org) in your pull request? Please ask yourself if an update (installation manual, user manual, developer manual...) is needed and add one accordingly.

## Tests

- [x] Is the code properly tested? Any pull request (fix, enhancement or new feature) should come with a test (or several). It could be unit tests, integration tests or cypress tests depending on the context. Only doc and releng pull request do not need for tests.



Diff:
diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc
index 1c4c28ff5..99c8df3c4 100644
--- a/CHANGELOG.adoc
+++ b/CHANGELOG.adoc
@@ -33,8 +33,9 @@ When end-users click on _New Object_ on a semantic element, and select a `ViewUs
 - https://github.com/eclipse-syson/syson/issues/1252[#1252] [exort] Implement textual export of `TriggerInvocationExpression`.
 - https://github.com/eclipse-syson/syson/issues/1233[#1233] [general-view] Add a creation tool of State sub actions with referenced action inside State elements
 - https://github.com/eclipse-syson/syson/issues/1255[#1255] [general-view] Improve label of `TransitionUsage` to display the "AcceptParameterPart".
-- https://github.com/eclipse-syson/syson/issues/1210[#1210] general-view] Add the `parameters` compartment on `ActionDefinition` in the _General View_ diagram.
+- https://github.com/eclipse-syson/syson/issues/1210[#1210] [general-view] Add the `parameters` compartment on `ActionDefinition` in the _General View_ diagram.
 - https://github.com/eclipse-syson/syson/issues/1267[#1267] [general-view] Improve the New Perform tool selection dialog to display existing actions in a tree.
+- https://github.com/eclipse-syson/syson/issues/1257[#1257] [general-view] Add the `perform actions` compartment on `Part` in the _General View_ diagram.
 
 === New features
 
diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVAddNewFeatureTypingFromPartUsageTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVAddNewFeatureTypingFromPartUsageTests.java
index c3dc74f7f..cde32a3d6 100644
--- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVAddNewFeatureTypingFromPartUsageTests.java
+++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVAddNewFeatureTypingFromPartUsageTests.java
@@ -138,9 +138,9 @@ public void tearDown() {
 
     private static Stream<Arguments> partUsageNodeParameters() {
         return Stream.of(
-                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), "part1", 8),
-                Arguments.of(SysmlPackage.eINSTANCE.getAllocationUsage(), "allocation1", 2),
-                Arguments.of(SysmlPackage.eINSTANCE.getInterfaceUsage(), "interface1", 4));
+                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), "part1", 9),
+                Arguments.of(SysmlPackage.eINSTANCE.getAllocationUsage(), "allocation1", 3),
+                Arguments.of(SysmlPackage.eINSTANCE.getInterfaceUsage(), "interface1", 5));
     }
 
     @DisplayName("Given a SysML Project, when the New Feature Typing tool is requested on a PartUsage, then a new PartDefinition node and a FeatureTyping edge are created")
diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVAddNewSubsettingFromPartUsageTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVAddNewSubsettingFromPartUsageTests.java
index 57753e30e..9a7b843b5 100644
--- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVAddNewSubsettingFromPartUsageTests.java
+++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVAddNewSubsettingFromPartUsageTests.java
@@ -61,7 +61,7 @@
 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = { SysONTestsProperties.NO_DEFAULT_LIBRARIES_PROPERTY })
 public class GVAddNewSubsettingFromPartUsageTests extends AbstractIntegrationTests {
 
-    private static final int PART_USAGE_COMPARTMENT_COUNT = 8;
+    private static final int PART_USAGE_COMPARTMENT_COUNT = 9;
 
     @Autowired
     private IGivenInitialServerState givenInitialServerState;
diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVDropFromExplorerTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVDropFromExplorerTests.java
index 96ad00848..69b3b885f 100644
--- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVDropFromExplorerTests.java
+++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVDropFromExplorerTests.java
@@ -166,13 +166,13 @@ public void dropFromExplorerOnEmptyDiagram() {
                 .ifPresentOrElse(newDiagram -> {
                     new CheckDiagramElementCount(this.diagramComparator)
                             .hasNewEdgeCount(0)
-                            // 1 node for the PartUsage and 8 for its compartments
-                            .hasNewNodeCount(9)
+                            // 1 node for the PartUsage and 9 for its compartments
+                            .hasNewNodeCount(10)
                             .check(this.diagram.get(), newDiagram);
                     new CheckNodeOnDiagram(this.diagramDescriptionIdProvider, this.diagramComparator)
                             .hasNodeDescriptionName(this.descriptionNameGenerator.getNodeName(SysmlPackage.eINSTANCE.getPartUsage()))
                             .hasTargetObjectLabel("part1")
-                            .hasCompartmentCount(8)
+                            .hasCompartmentCount(9)
                             .check(this.diagram.get(), newDiagram);
                 }, () -> fail("Missing diagram"));
 
@@ -210,13 +210,13 @@ public void dropFromExplorerOnEmptyDiagramNode() {
                 .ifPresentOrElse(newDiagram -> {
                     new CheckDiagramElementCount(this.diagramComparator)
                             .hasNewEdgeCount(0)
-                            // 1 node for the PartUsage and 8 for its compartments
-                            .hasNewNodeCount(9)
+                            // 1 node for the PartUsage and 9 for its compartments
+                            .hasNewNodeCount(10)
                             .check(this.diagram.get(), newDiagram);
                     new CheckNodeOnDiagram(this.diagramDescriptionIdProvider, this.diagramComparator)
                             .hasNodeDescriptionName(this.descriptionNameGenerator.getNodeName(SysmlPackage.eINSTANCE.getPartUsage()))
                             .hasTargetObjectLabel("part1")
-                            .hasCompartmentCount(8)
+                            .hasCompartmentCount(9)
                             .check(this.diagram.get(), newDiagram);
                 }, () -> fail("Missing diagram"));
 
diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeActionFlowCreationTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeActionFlowCreationTests.java
index b12271074..9b47c602d 100644
--- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeActionFlowCreationTests.java
+++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeActionFlowCreationTests.java
@@ -148,7 +148,7 @@ private static Stream<Arguments> acceptActionUsagePayloadParameters() {
 
     private static Stream<Arguments> actionUsageSiblingNodeParameters() {
         return Stream.of(
-                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), 8),
+                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), 9),
                 Arguments.of(SysmlPackage.eINSTANCE.getAttributeUsage(), SysmlPackage.eINSTANCE.getUsage_NestedAttribute(), 3),
                 Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPort(), 3))
                 .map(TestNameGenerator::namedArguments);
diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeAnalysisCreationTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeAnalysisCreationTests.java
index bf444ab30..5df0f64ca 100644
--- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeAnalysisCreationTests.java
+++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeAnalysisCreationTests.java
@@ -135,7 +135,7 @@ private static Stream<Arguments> caseUsageSiblingNodeParameters() {
         return Stream.of(
                 Arguments.of(SysmlPackage.eINSTANCE.getAttributeUsage(), SysmlPackage.eINSTANCE.getUsage_NestedAttribute(), 3),
                 Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getUsage_NestedItem(), 3),
-                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), 8),
+                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), 9),
                 Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPort(), 3))
                 .map(TestNameGenerator::namedArguments);
     }
@@ -156,7 +156,7 @@ private static Stream<Arguments> useCaseUsageSiblingNodeParameters() {
         return Stream.of(
                 Arguments.of(SysmlPackage.eINSTANCE.getAttributeUsage(), SysmlPackage.eINSTANCE.getUsage_NestedAttribute(), 3),
                 Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getUsage_NestedItem(), 3),
-                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), 8),
+                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), 9),
                 Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPort(), 3))
                 .map(TestNameGenerator::namedArguments);
     }
diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeInterconnectionCreationTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeInterconnectionCreationTests.java
index 2d30a4a87..f43f01625 100644
--- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeInterconnectionCreationTests.java
+++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeInterconnectionCreationTests.java
@@ -117,7 +117,7 @@ public class GVSubNodeInterconnectionCreationTests extends AbstractIntegrationTe
     private static Stream<Arguments> allocationUsageSiblingNodeParameters() {
         return Stream.of(
                 Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getUsage_NestedItem(), 3),
-                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedUsage(), 8))
+                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedUsage(), 9))
                 .map(TestNameGenerator::namedArguments);
     }
 
@@ -131,7 +131,7 @@ private static Stream<Arguments> allocationUsageChildNodeParameters() {
     private static Stream<Arguments> allocationDefinitionSiblingNodeParameters() {
         return Stream.of(
                 Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedItem(), 3),
-                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedPart(), 8))
+                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedPart(), 9))
                 .map(TestNameGenerator::namedArguments);
     }
 
@@ -144,7 +144,7 @@ private static Stream<Arguments> allocationDefinitionChildNodeParameters() {
     private static Stream<Arguments> interfaceUsageSiblingNodeParameters() {
         return Stream.of(
                 Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getUsage_NestedItem(), 3),
-                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedUsage(), 8))
+                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedUsage(), 9))
                 .map(TestNameGenerator::namedArguments);
     }
 
@@ -168,7 +168,7 @@ private static Stream<Arguments> interfaceDefinitionChildNodeParameters() {
     private static Stream<Arguments> portUsageSiblingNodeParameters() {
         return Stream.of(
                 Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPort(), 3),
-                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), 8),
+                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), 9),
                 Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getUsage_NestedItem(), 3))
                 .map(TestNameGenerator::namedArguments);
     }
@@ -183,7 +183,7 @@ private static Stream<Arguments> portUsageChildNodeParameters() {
 
     private static Stream<Arguments> portDefinitionSiblingNodeParameters() {
         return Stream.of(
-                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedPart(), 8),
+                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedPart(), 9),
                 Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedItem(), 3))
                 .map(TestNameGenerator::namedArguments);
     }
diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeRequirementCreationTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeRequirementCreationTests.java
index 440220473..785049651 100644
--- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeRequirementCreationTests.java
+++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeRequirementCreationTests.java
@@ -135,7 +135,7 @@ public class GVSubNodeRequirementCreationTests extends AbstractIntegrationTests
     private static Stream<Arguments> concernUsageSiblingNodeParameters() {
         return Stream.of(
                 Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getUsage_NestedItem(), 3),
-                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), 8),
+                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), 9),
                 Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPort(), 3),
                 Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getUsage_NestedRequirement(), 7))
                 .map(TestNameGenerator::namedArguments);
@@ -164,7 +164,7 @@ private static Stream<Arguments> constraintUsageSiblingNodeParameters() {
         return Stream.of(
                 Arguments.of(SysmlPackage.eINSTANCE.getAttributeUsage(), SysmlPackage.eINSTANCE.getUsage_NestedAttribute(), 3),
                 Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getUsage_NestedItem(), 3),
-                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), 8),
+                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), 9),
                 Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPort(), 3))
                 .map(TestNameGenerator::namedArguments);
     }
@@ -178,7 +178,7 @@ private static Stream<Arguments> constraintUsageChildNodeParameters() {
 
     private static Stream<Arguments> constraintDefinitionSiblingNodeParameters() {
         return Stream.of(
-                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedUsage(), 8))
+                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedUsage(), 9))
                 .map(TestNameGenerator::namedArguments);
     }
 
@@ -192,7 +192,7 @@ private static Stream<Arguments> constraintDefinitionChildNodeParameters() {
     private static Stream<Arguments> requirementUsageSiblingNodeParameters() {
         return Stream.of(
                 Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getUsage_NestedItem(), 3),
-                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), 8),
+                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), 9),
                 Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPort(), 3),
                 Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getUsage_NestedRequirement(), 7))
                 .map(TestNameGenerator::namedArguments);
diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeStructureCreationTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeStructureCreationTests.java
index bad0253e3..2c54523df 100644
--- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeStructureCreationTests.java
+++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeStructureCreationTests.java
@@ -155,7 +155,7 @@ private static Stream<Arguments> itemDefinitionChildNodeParameters() {
     private static Stream<Arguments> itemUsageSiblingNodeParameters() {
         return Stream.of(
                 Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getUsage_NestedItem(), 3),
-                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), 8),
+                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), 9),
                 Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPort(), 3),
                 Arguments.of(SysmlPackage.eINSTANCE.getComment(), SysmlPackage.eINSTANCE.getElement_OwnedElement(), 0))
                 .map(TestNameGenerator::namedArguments);
@@ -179,12 +179,12 @@ private static Stream<Arguments> packageChildNodeParameters() {
                 Arguments.of(SysmlPackage.eINSTANCE.getItemDefinition(), ownedMember, 2),
                 // A package doesn't have a compartment: it is handled as a custom node
                 Arguments.of(SysmlPackage.eINSTANCE.getPackage(), ownedMember, 0),
-                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), ownedMember, 8),
-                Arguments.of(SysmlPackage.eINSTANCE.getPartDefinition(), ownedMember, 8),
-                Arguments.of(SysmlPackage.eINSTANCE.getAllocationUsage(), ownedMember, 2),
-                Arguments.of(SysmlPackage.eINSTANCE.getAllocationDefinition(), ownedMember, 2),
-                Arguments.of(SysmlPackage.eINSTANCE.getInterfaceUsage(), ownedMember, 3),
-                Arguments.of(SysmlPackage.eINSTANCE.getInterfaceDefinition(), ownedMember, 4),
+                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), ownedMember, 9),
+                Arguments.of(SysmlPackage.eINSTANCE.getPartDefinition(), ownedMember, 9),
+                Arguments.of(SysmlPackage.eINSTANCE.getAllocationUsage(), ownedMember, 3),
+                Arguments.of(SysmlPackage.eINSTANCE.getAllocationDefinition(), ownedMember, 3),
+                Arguments.of(SysmlPackage.eINSTANCE.getInterfaceUsage(), ownedMember, 4),
+                Arguments.of(SysmlPackage.eINSTANCE.getInterfaceDefinition(), ownedMember, 5),
                 Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), ownedMember, 3),
                 Arguments.of(SysmlPackage.eINSTANCE.getPortDefinition(), ownedMember, 4),
                 Arguments.of(SysmlPackage.eINSTANCE.getAcceptActionUsage(), ownedMember, 1),
@@ -220,7 +220,7 @@ private static Stream<Arguments> partDefinitionChildNodeParameters() {
     private static Stream<Arguments> partDefinitionSiblingNodeParameters() {
         return Stream.of(
                 Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedItem(), 3),
-                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedPart(), 8))
+                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedPart(), 9))
                 .map(TestNameGenerator::namedArguments);
     }
 
@@ -234,7 +234,7 @@ private static Stream<Arguments> partUsageChildNodeParameters() {
     private static Stream<Arguments> partUsageSiblingNodeParameters() {
         return Stream.of(
                 Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getUsage_NestedItem(), 3),
-                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedUsage(), 8))
+                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedUsage(), 9))
                 .map(TestNameGenerator::namedArguments);
     }
 
diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeTemporalCreationTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeTemporalCreationTests.java
index dba867d02..959081cbe 100644
--- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeTemporalCreationTests.java
+++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeTemporalCreationTests.java
@@ -127,7 +127,7 @@ private static Stream<Arguments> occurrenceUsageChildNodeParameters() {
 
     private static Stream<Arguments> occurrenceDefinitionSiblingNodeParameters() {
         return Stream.of(
-                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedPart(), 8))
+                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedPart(), 9))
                 .map(TestNameGenerator::namedArguments);
     }
 
diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVTopNodeCreationTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVTopNodeCreationTests.java
index 4517794c3..d5a0243f3 100644
--- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVTopNodeCreationTests.java
+++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVTopNodeCreationTests.java
@@ -153,12 +153,12 @@ private static Stream<Arguments> topNodeParameters() {
                 Arguments.of(SysmlPackage.eINSTANCE.getItemDefinition(), 2),
                 // A package doesn't have a compartment: it is handled as a custom node
                 Arguments.of(SysmlPackage.eINSTANCE.getPackage(), 0),
-                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), 8),
-                Arguments.of(SysmlPackage.eINSTANCE.getPartDefinition(), 8),
-                Arguments.of(SysmlPackage.eINSTANCE.getAllocationUsage(), 2),
-                Arguments.of(SysmlPackage.eINSTANCE.getAllocationDefinition(), 2),
-                Arguments.of(SysmlPackage.eINSTANCE.getInterfaceUsage(), 3),
-                Arguments.of(SysmlPackage.eINSTANCE.getInterfaceDefinition(), 4),
+                Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), 9),
+                Arguments.of(SysmlPackage.eINSTANCE.getPartDefinition(), 9),
+                Arguments.of(SysmlPackage.eINSTANCE.getAllocationUsage(), 3),
+                Arguments.of(SysmlPackage.eINSTANCE.getAllocationDefinition(), 3),
+                Arguments.of(SysmlPackage.eINSTANCE.getInterfaceUsage(), 4),
+                Arguments.of(SysmlPackage.eINSTANCE.getInterfaceDefinition(), 5),
                 Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), 3),
                 Arguments.of(SysmlPackage.eINSTANCE.getPortDefinition(), 4),
                 Arguments.of(SysmlPackage.eINSTANCE.getAcceptActionUsage(), 1),
@@ -169,7 +169,7 @@ private static Stream<Arguments> topNodeParameters() {
                 Arguments.of(SysmlPackage.eINSTANCE.getConcernDefinition(), 8),
                 Arguments.of(SysmlPackage.eINSTANCE.getConstraintUsage(), 2),
                 Arguments.of(SysmlPackage.eINSTANCE.getConstraintDefinition(), 2),
-                Arguments.of(SysmlPackage.eINSTANCE.getConnectionDefinition(), 0),
+                Arguments.of(SysmlPackage.eINSTANCE.getConnectionDefinition(), 1),
                 Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), 7),
                 Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), 8),
                 Arguments.of(SysmlPackage.eINSTANCE.getUseCaseUsage(), 4),
diff --git a/backend/services/syson-services/src/main/java/org/eclipse/syson/services/UtilService.java b/backend/services/syson-services/src/main/java/org/eclipse/syson/services/UtilService.java
index 6f58366fc..9ae32c3eb 100644
--- a/backend/services/syson-services/src/main/java/org/eclipse/syson/services/UtilService.java
+++ b/backend/services/syson-services/src/main/java/org/eclipse/syson/services/UtilService.java
@@ -51,6 +51,7 @@
 import org.eclipse.syson.sysml.Package;
 import org.eclipse.syson.sysml.PartDefinition;
 import org.eclipse.syson.sysml.PartUsage;
+import org.eclipse.syson.sysml.PerformActionUsage;
 import org.eclipse.syson.sysml.PortUsage;
 import org.eclipse.syson.sysml.Redefinition;
 import org.eclipse.syson.sysml.ReferenceUsage;
@@ -177,18 +178,18 @@ public Type getReceiverContainerDefinitionOrUsage(AcceptActionUsage aau) {
     }
 
     /**
-     * Retrieve all exhibited {@link StateUsage} directly accessible from an object.
+     * Retrieve all exhibited {@link StateUsage} directly accessible from an element.
      *
-     * @param eObject
+     * @param element
      *            The {@link Element} to start from
      * @return The list of exhibited {@link StateUsage}
      */
-    public List<StateUsage> getAllExhibitedStates(Element eObject) {
+    public List<StateUsage> getAllExhibitedStates(Element element) {
         List<StateUsage> result = new ArrayList<>();
         List<StateUsage> candidates = new ArrayList<>();
-        if (eObject instanceof Usage usage) {
+        if (element instanceof Usage usage) {
             candidates = usage.getNestedState();
-        } else if (eObject instanceof Definition def) {
+        } else if (element instanceof Definition def) {
             candidates = def.getOwnedState();
         }
         candidates.stream().filter(ExhibitStateUsage.class::isInstance)
@@ -200,18 +201,18 @@ public List<StateUsage> getAllExhibitedStates(Element eObject) {
 
     /**
      * Retrieve all {@link StateUsage} elements that are not {@link ExhibitStateUsage} directly accessible from an
-     * object.
+     * element.
      *
-     * @param eObject
+     * @param element
      *            The {@link Element} to start from
      * @return The list of all {@link StateUsage} elements that are not {@link ExhibitStateUsage}
      */
-    public List<StateUsage> getAllNonExhibitStates(Element eObject) {
+    public List<StateUsage> getAllNonExhibitStates(Element element) {
         List<StateUsage> result = new ArrayList<>();
         List<StateUsage> candidates = new ArrayList<>();
-        if (eObject instanceof Usage usage) {
+        if (element instanceof Usage usage) {
             candidates = usage.getNestedState();
-        } else if (eObject instanceof Definition def) {
+        } else if (element instanceof Definition def) {
             candidates = def.getOwnedState();
         }
         candidates.stream().filter(c -> !(c instanceof ExhibitStateUsage))
@@ -847,4 +848,24 @@ public boolean isInOutFeature(Feature feature) {
         return FeatureDirectionKind.INOUT.equals(feature.getDirection());
     }
 
+    /**
+     * Retrieve all {@link org.eclipse.syson.sysml.PerformActionUsage} elements that are directly accessible from an
+     * element.
+     *
+     * @param element
+     *            The {@link Element} to start from
+     * @return The list of all {@link PerformActionUsage} elements
+     */
+    public List<PerformActionUsage> getAllPerformActions(Element element) {
+        List<ActionUsage> candidates = new ArrayList<>();
+        if (element instanceof Usage usage) {
+            candidates = usage.getNestedAction();
+        } else if (element instanceof Definition def) {
+            candidates = def.getOwnedAction();
+        }
+        return candidates.stream().filter(PerformActionUsage.class::isInstance)
+                .map(PerformActionUsage.class::cast)
+                .filter(performActionUsage -> !(performActionUsage instanceof ExhibitStateUsage))
+                .toList();
+    }
 }
diff --git a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/GeneralViewDiagramDescriptionProvider.java b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/GeneralViewDiagramDescriptionProvider.java
index 8fc61e9fb..b5b44db30 100644
--- a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/GeneralViewDiagramDescriptionProvider.java
+++ b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/GeneralViewDiagramDescriptionProvider.java
@@ -17,6 +17,7 @@
 import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EReference;
@@ -91,6 +92,8 @@
 import org.eclipse.syson.diagram.general.view.nodes.GeneralViewEmptyDiagramNodeDescriptionProvider;
 import org.eclipse.syson.diagram.general.view.nodes.GeneralViewNodeDescriptionProviderSwitch;
 import org.eclipse.syson.diagram.general.view.nodes.ItemUsageBorderNodeDescriptionProvider;
+import org.eclipse.syson.diagram.general.view.nodes.PerformActionsCompartmentItemNodeDescriptionProvider;
+import org.eclipse.syson.diagram.general.view.nodes.PerformActionsCompartmentNodeDescriptionProvider;
 import org.eclipse.syson.diagram.general.view.nodes.PortUsageBorderNodeDescriptionProvider;
 import org.eclipse.syson.diagram.general.view.nodes.ReferencingPerformActionUsageNodeDescriptionProvider;
 import org.eclipse.syson.diagram.general.view.nodes.RequirementDefinitionActorsCompartmentNodeDescriptionProvider;
@@ -325,6 +328,7 @@ public RepresentationDescription create(IColorProvider colorProvider) {
         this.linkAllocationDefinitionEndsCompartment(cache);
         this.linkStatesCompartment(cache);
         this.linkActionDefinitionCompartments(cache);
+        this.linkPartPerformActionsCompartment(cache);
 
         var palette = this.createDiagramPalette(cache);
         diagramDescription.setPalette(palette);
@@ -448,6 +452,8 @@ private List<IDiagramElementDescriptionProvider<?>> createCompartmentsForListIte
                     compartmentNodeDescriptionProviders.add(new ActionItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator()));
                     compartmentNodeDescriptionProviders.add(new CompartmentNodeDescriptionProvider(eClass, eReference, colorProvider));
                     compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator()));
+                    compartmentNodeDescriptionProviders.add(new PerformActionsCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator()));
+                    compartmentNodeDescriptionProviders.add(new PerformActionsCompartmentNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator()));
                 } else if ((SysmlPackage.eINSTANCE.getPartUsage().equals(eClass) && SysmlPackage.eINSTANCE.getUsage_NestedState().equals(eReference))
                         || (SysmlPackage.eINSTANCE.getPartDefinition().equals(eClass) && SysmlPackage.eINSTANCE.getDefinition_OwnedState().equals(eReference))) {
                     compartmentNodeDescriptionProviders.add(new StatesCompartmentNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator(), true));
@@ -965,6 +971,36 @@ private void linkActionDefinitionCompartments(IViewDiagramElementFinder cache) {
                 });
     }
 
+    private void linkPartPerformActionsCompartment(IViewDiagramElementFinder cache) {
+        // perform actions compartment in PartUsages
+        cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentName(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedAction()) +
+                        PerformActionsCompartmentNodeDescriptionProvider.PERFORM_ACTIONS_COMPARTMENT_NAME)
+                .ifPresent(compartmentNodeDescription -> {
+                    USAGES.stream()
+                            .filter(eClass -> Objects.equals(eClass, SysmlPackage.eINSTANCE.getPartUsage()) || eClass.getEAllSuperTypes().contains(SysmlPackage.eINSTANCE.getPartUsage()))
+                            .forEach(partUsage -> {
+                                this.addCompartmentNodeDescriptionInNodeDescription(cache, compartmentNodeDescription, partUsage);
+                            });
+                });
+        // perform actions compartment in PartDefinitions
+        cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentName(SysmlPackage.eINSTANCE.getPartDefinition(), SysmlPackage.eINSTANCE.getDefinition_OwnedAction()) +
+                        PerformActionsCompartmentNodeDescriptionProvider.PERFORM_ACTIONS_COMPARTMENT_NAME)
+                .ifPresent(compartmentNodeDescription -> {
+                    DEFINITIONS.stream()
+                            .filter(eClass -> Objects.equals(eClass, SysmlPackage.eINSTANCE.getPartDefinition()) || eClass.getEAllSuperTypes().contains(SysmlPackage.eINSTANCE.getPartDefinition()))
+                            .forEach(partDefinition -> {
+                                this.addCompartmentNodeDescriptionInNodeDescription(cache, compartmentNodeDescription, partDefinition);
+                            });
+                });
+    }
+
+    private void addCompartmentNodeDescriptionInNodeDescription(IViewDiagramElementFinder cache, NodeDescription compartmentNodeDescription, EClass eClass) {
+        cache.getNodeDescription(this.getDescriptionNameGenerator().getNodeName(eClass))
+                .ifPresent(nodeDescription -> {
+                    nodeDescription.getReusedChildNodeDescriptions().add(compartmentNodeDescription);
+                });
+    }
+
     private DiagramPalette createDiagramPalette(IViewDiagramElementFinder cache) {
         return this.diagramBuilderHelper.newDiagramPalette()
                 .dropNodeTool(this.createDropFromDiagramTool(cache))
diff --git a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/nodes/FakeNodeDescriptionProvider.java b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/nodes/FakeNodeDescriptionProvider.java
index 75282f11c..7597161e6 100644
--- a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/nodes/FakeNodeDescriptionProvider.java
+++ b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/nodes/FakeNodeDescriptionProvider.java
@@ -163,6 +163,10 @@ private void addCustomCompartmentsForParts(IViewDiagramElementFinder cache, IDes
                 .ifPresent(childrenNodes::add);
         cache.getNodeDescription(nameGenerator.getFreeFormCompartmentName(SysmlPackage.eINSTANCE.getExhibitStateUsage(), SysmlPackage.eINSTANCE.getUsage_NestedState()))
                 .ifPresent(childrenNodes::add);
+        cache.getNodeDescription(nameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedAction()) + PerformActionsCompartmentNodeDescriptionProvider.PERFORM_ACTIONS_COMPARTMENT_NAME)
+                .ifPresent(childrenNodes::add);
+        cache.getNodeDescription(nameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getPartDefinition(), SysmlPackage.eINSTANCE.getDefinition_OwnedAction()) + PerformActionsCompartmentNodeDescriptionProvider.PERFORM_ACTIONS_COMPARTMENT_NAME)
+                .ifPresent(childrenNodes::add);
     }
 
     private void addReusableBorderedNode(IViewDiagramElementFinder cache, GVDescriptionNameGenerator nameGenerator, ArrayList<NodeDescription> childrenNodes) {
diff --git a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/nodes/PerformActionsCompartmentItemNodeDescriptionProvider.java b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/nodes/PerformActionsCompartmentItemNodeDescriptionProvider.java
new file mode 100644
index 000000000..64dde2415
--- /dev/null
+++ b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/nodes/PerformActionsCompartmentItemNodeDescriptionProvider.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2025 Obeo.
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Obeo - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.syson.diagram.general.view.nodes;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.sirius.components.view.builder.providers.IColorProvider;
+import org.eclipse.sirius.components.view.diagram.NodeDescription;
+import org.eclipse.syson.diagram.common.view.nodes.CompartmentItemNodeDescriptionProvider;
+import org.eclipse.syson.util.AQLUtils;
+import org.eclipse.syson.util.IDescriptionNameGenerator;
+
+/**
+ * Used to create an item node description of the perform actions compartment of Parts for general view diagram.
+ *
+ * @author Jerome Gout
+ */
+public class PerformActionsCompartmentItemNodeDescriptionProvider extends CompartmentItemNodeDescriptionProvider {
+
+    public PerformActionsCompartmentItemNodeDescriptionProvider(EClass eClass, EReference eReference, IColorProvider colorProvider, IDescriptionNameGenerator descriptionNameGenerator) {
+        super(eClass, eReference, colorProvider, descriptionNameGenerator);
+    }
+
+    @Override
+    public NodeDescription create() {
+        var nodeDescription = super.create();
+        nodeDescription.setName(this.getDescriptionNameGenerator().getCompartmentItemName(this.getEClass(), this.getEReference()) + PerformActionsCompartmentNodeDescriptionProvider.PERFORM_ACTIONS_COMPARTMENT_NAME);
+        return nodeDescription;
+    }
+
+    @Override
+    protected String getSemanticCandidateExpression() {
+        return AQLUtils.getSelfServiceCallExpression("getAllPerformActions");
+    }
+}
diff --git a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/nodes/PerformActionsCompartmentNodeDescriptionProvider.java b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/nodes/PerformActionsCompartmentNodeDescriptionProvider.java
new file mode 100644
index 000000000..94891f491
--- /dev/null
+++ b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/nodes/PerformActionsCompartmentNodeDescriptionProvider.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2025 Obeo.
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.syson.diagram.general.view.nodes;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder;
+import org.eclipse.sirius.components.view.builder.providers.IColorProvider;
+import org.eclipse.sirius.components.view.diagram.DiagramDescription;
+import org.eclipse.sirius.components.view.diagram.NodeDescription;
+import org.eclipse.sirius.components.view.diagram.NodePalette;
+import org.eclipse.sirius.components.view.diagram.NodeToolSection;
+import org.eclipse.syson.diagram.common.view.nodes.AbstractActionsCompartmentNodeDescriptionProvider;
+import org.eclipse.syson.diagram.common.view.nodes.AbstractCompartmentNodeDescriptionProvider;
+import org.eclipse.syson.diagram.common.view.services.description.ToolConstants;
+import org.eclipse.syson.diagram.common.view.tools.PerformActionNodeToolProvider;
+import org.eclipse.syson.diagram.common.view.tools.ReferencingPerformActionNodeToolProvider;
+import org.eclipse.syson.util.IDescriptionNameGenerator;
+
+/**
+ * Used to create the perform actions Compartment node description of Part usage and definition inside the General View diagram.
+ *
+ * @author Jerome Gout
+ */
+public class PerformActionsCompartmentNodeDescriptionProvider extends AbstractCompartmentNodeDescriptionProvider {
+
+    public static final String PERFORM_ACTIONS_COMPARTMENT_NAME = " perform " + AbstractActionsCompartmentNodeDescriptionProvider.ACTIONS_COMPARTMENT_LABEL;
+
+    public PerformActionsCompartmentNodeDescriptionProvider(EClass eClass, EReference eReference, IColorProvider colorProvider, IDescriptionNameGenerator descriptionNameGenerator) {
+        super(eClass, eReference, colorProvider, descriptionNameGenerator);
+    }
+
+    @Override
+    public NodeDescription create() {
+        NodeDescription nd = super.create();
+        nd.setName(this.getDescriptionNameGenerator().getCompartmentName(this.eClass, this.eReference) + PERFORM_ACTIONS_COMPARTMENT_NAME);
+        return nd;
+    }
+
+    @Override
+    protected String getCustomCompartmentLabel() {
+        return "perform actions";
+    }
+
+    @Override
+    protected List<NodeDescription> getDroppableNodes(IViewDiagramElementFinder cache) {
+        var acceptedNodeTypes = new ArrayList<NodeDescription>();
+        cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentItemName(this.eClass, this.eReference) + PERFORM_ACTIONS_COMPARTMENT_NAME).ifPresent(acceptedNodeTypes::add);
+        return acceptedNodeTypes;
+    }
+
+    @Override
+    public void link(DiagramDescription diagramDescription, IViewDiagramElementFinder cache) {
+        cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentName(this.eClass, this.eReference) + PERFORM_ACTIONS_COMPARTMENT_NAME).ifPresent(nd -> {
+            cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentItemName(this.eClass, this.eReference) + PERFORM_ACTIONS_COMPARTMENT_NAME).ifPresent(nd.getChildrenDescriptions()::add);
+            nd.setPalette(this.createCompartmentPalette(cache));
+        });
+    }
+
+    @Override
+    protected NodePalette createCompartmentPalette(IViewDiagramElementFinder cache) {
+        var palette = this.diagramBuilderHelper.newNodePalette().dropNodeTool(this.createCompartmentDropFromDiagramTool(cache));
+        var toolSections = this.toolDescriptionService.createDefaultNodeToolSections();
+        // in perform actions compartment only perform action tools are allowed
+        this.toolDescriptionService.addNodeTool(toolSections, ToolConstants.BEHAVIOR, new PerformActionNodeToolProvider(this.eClass, this.getDescriptionNameGenerator()).create(cache));
+        this.toolDescriptionService.addNodeTool(toolSections, ToolConstants.BEHAVIOR, new ReferencingPerformActionNodeToolProvider(this.eClass, this.getDescriptionNameGenerator()).create(cache));
+
+        toolSections.add(this.defaultToolsFactory.createDefaultHideRevealNodeToolSection());
+        this.toolDescriptionService.removeEmptyNodeToolSections(toolSections);
+
+        return palette.toolSections(toolSections.toArray(NodeToolSection[]::new)).build();
+    }
+}
diff --git a/doc/content/modules/user-manual/assets/images/gv-parts-perform-actions-compartment.png b/doc/content/modules/user-manual/assets/images/gv-parts-perform-actions-compartment.png
new file mode 100644
index 000000000..08c1743de
Binary files /dev/null and b/doc/content/modules/user-manual/assets/images/gv-parts-perform-actions-compartment.png differ
diff --git a/doc/content/modules/user-manual/pages/release-notes/2025.6.0.adoc b/doc/content/modules/user-manual/pages/release-notes/2025.6.0.adoc
index 7136ac6f6..753cacddb 100644
--- a/doc/content/modules/user-manual/pages/release-notes/2025.6.0.adoc
+++ b/doc/content/modules/user-manual/pages/release-notes/2025.6.0.adoc
@@ -20,7 +20,6 @@ Future contributions are planned to introduce enhanced capabilities for editing
 
 == Bug fixes
 
-
 - Fix an issue that made published libraries' dependencies always empty.
 Publishing a project with a dependency to a library now correctly produces a library with the same dependency.
 - In _General View_ diagram, fix an issue where _New Binding Connector As Usage (bind)_ tool accessible on `ItemUsage` bordered nodes was failing to create graphical edge between `ItemUsage` bordered nodes.
@@ -182,6 +181,10 @@ image::release-notes-GV-actionDefinition-parameters.png[Parameters compartment o
 
 - In the _General View_ diagram, the selection dialog to reference an existing `Action` when creating a new `Perform Action` has been improved to present those `Actions` in a hierarchical way.
 
+- Add a `perform actions` compartment `PartUsage` and `PartDefinition` to display `PerformActionUsage` in the _General View_ diagram.
+
+image::gv-parts-perform-actions-compartment.png[perform actions compartment in parts, width=70%, align="center"]
+
 == Dependency update
 
 


Reviews:
user: login: adaussy
body: Please install the compartement on :

* `PartUsage`, `PartDefinition`  and all inherited concepts
* `ActionUsage, `ActionDefinition`  and all inherited concepts
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-05T14:38:03Z
user: login: jerome-obeo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-07T12:27:31Z

Review comments:
diff_hunk: @@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2025 Obeo.
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.syson.diagram.general.view.nodes;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder;
+import org.eclipse.sirius.components.view.builder.providers.IColorProvider;
+import org.eclipse.sirius.components.view.diagram.DiagramDescription;
+import org.eclipse.sirius.components.view.diagram.NodeDescription;
+import org.eclipse.sirius.components.view.diagram.NodePalette;
+import org.eclipse.syson.diagram.common.view.nodes.AbstractActionsCompartmentNodeDescriptionProvider;
+import org.eclipse.syson.diagram.common.view.nodes.AbstractCompartmentNodeDescriptionProvider;
+import org.eclipse.syson.util.IDescriptionNameGenerator;
+
+/**
+ * Used to create the perform actions Compartment node description of Part usage and definition inside the General View diagram.
+ *
+ * @author Jerome Gout
+ */
+public class PerformActionsCompartmentNodeDescriptionProvider extends AbstractCompartmentNodeDescriptionProvider {
+
+    public static final String PERFORM_ACTIONS_NAME = " perform " + AbstractActionsCompartmentNodeDescriptionProvider.ACTIONS_COMPARTMENT_LABEL;
+
+    public PerformActionsCompartmentNodeDescriptionProvider(EClass eClass, EReference eReference, IColorProvider colorProvider, IDescriptionNameGenerator descriptionNameGenerator) {
+        super(eClass, eReference, colorProvider, descriptionNameGenerator);
+    }
+
+    @Override
+    public NodeDescription create() {
+        NodeDescription nd = super.create();
+        nd.setName(this.getDescriptionNameGenerator().getCompartmentName(this.eClass, this.eReference) + PERFORM_ACTIONS_NAME);
+        return nd;
+    }
+
+    @Override
+    protected String getCustomCompartmentLabel() {
+        return "perform actions";
+    }
+
+    @Override
+    protected List<NodeDescription> getDroppableNodes(IViewDiagramElementFinder cache) {
+        var acceptedNodeTypes = new ArrayList<NodeDescription>();
+        cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentItemName(this.eClass, this.eReference) + PERFORM_ACTIONS_NAME).ifPresent(acceptedNodeTypes::add);
+        return acceptedNodeTypes;
+    }
+
+    @Override
+    public void link(DiagramDescription diagramDescription, IViewDiagramElementFinder cache) {
+        cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentName(this.eClass, this.eReference) + PERFORM_ACTIONS_NAME).ifPresent(nd -> {
+            cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentItemName(this.eClass, this.eReference) + PERFORM_ACTIONS_NAME).ifPresent(nd.getChildrenDescriptions()::add);
+            nd.setPalette(this.createCompartmentPalette(cache));
+        });
+    }
+
+    @Override
+    protected NodePalette createCompartmentPalette(IViewDiagramElementFinder cache) {
+        var palette = this.diagramBuilderHelper.newNodePalette().dropNodeTool(this.createCompartmentDropFromDiagramTool(cache));
+
+//        // Do not use getItemCreationToolProvider because the compartment contains multiple creation tools.
path: backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/nodes/PerformActionsCompartmentNodeDescriptionProvider.java
user: login: adaussy
body: Please remove commented code.
created_at: 2025-05-05T14:37:13Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2025 Obeo.
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.syson.diagram.general.view.nodes;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder;
+import org.eclipse.sirius.components.view.builder.providers.IColorProvider;
+import org.eclipse.sirius.components.view.diagram.DiagramDescription;
+import org.eclipse.sirius.components.view.diagram.NodeDescription;
+import org.eclipse.sirius.components.view.diagram.NodePalette;
+import org.eclipse.syson.diagram.common.view.nodes.AbstractActionsCompartmentNodeDescriptionProvider;
+import org.eclipse.syson.diagram.common.view.nodes.AbstractCompartmentNodeDescriptionProvider;
+import org.eclipse.syson.util.IDescriptionNameGenerator;
+
+/**
+ * Used to create the perform actions Compartment node description of Part usage and definition inside the General View diagram.
+ *
+ * @author Jerome Gout
+ */
+public class PerformActionsCompartmentNodeDescriptionProvider extends AbstractCompartmentNodeDescriptionProvider {
+
+    public static final String PERFORM_ACTIONS_NAME = " perform " + AbstractActionsCompartmentNodeDescriptionProvider.ACTIONS_COMPARTMENT_LABEL;
+
+    public PerformActionsCompartmentNodeDescriptionProvider(EClass eClass, EReference eReference, IColorProvider colorProvider, IDescriptionNameGenerator descriptionNameGenerator) {
+        super(eClass, eReference, colorProvider, descriptionNameGenerator);
+    }
+
+    @Override
+    public NodeDescription create() {
+        NodeDescription nd = super.create();
+        nd.setName(this.getDescriptionNameGenerator().getCompartmentName(this.eClass, this.eReference) + PERFORM_ACTIONS_NAME);
+        return nd;
+    }
+
+    @Override
+    protected String getCustomCompartmentLabel() {
+        return "perform actions";
+    }
+
+    @Override
+    protected List<NodeDescription> getDroppableNodes(IViewDiagramElementFinder cache) {
+        var acceptedNodeTypes = new ArrayList<NodeDescription>();
+        cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentItemName(this.eClass, this.eReference) + PERFORM_ACTIONS_NAME).ifPresent(acceptedNodeTypes::add);
+        return acceptedNodeTypes;
+    }
+
+    @Override
+    public void link(DiagramDescription diagramDescription, IViewDiagramElementFinder cache) {
+        cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentName(this.eClass, this.eReference) + PERFORM_ACTIONS_NAME).ifPresent(nd -> {
+            cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentItemName(this.eClass, this.eReference) + PERFORM_ACTIONS_NAME).ifPresent(nd.getChildrenDescriptions()::add);
+            nd.setPalette(this.createCompartmentPalette(cache));
+        });
+    }
+
+    @Override
+    protected NodePalette createCompartmentPalette(IViewDiagramElementFinder cache) {
+        var palette = this.diagramBuilderHelper.newNodePalette().dropNodeTool(this.createCompartmentDropFromDiagramTool(cache));
+
+//        // Do not use getItemCreationToolProvider because the compartment contains multiple creation tools.
path: backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/nodes/PerformActionsCompartmentNodeDescriptionProvider.java
user: login: jerome-obeo
body: Done
created_at: 2025-05-07T12:27:31Z
author_association: CONTRIBUTOR

PR comments:
user: login: AxelRICHARD
created_at: 2025-05-06T07:47:08Z
body: > Please install the compartement on :
> 
> * `PartUsage`, `PartDefinition`  and all inherited concepts
> * `ActionUsage, `ActionDefinition`  and all inherited concepts

Please do that in separated PRs
author_association: MEMBER
user: login: jerome-obeo
created_at: 2025-05-07T09:33:24Z
body: A new issue has been filed https://github.com/eclipse-syson/syson/issues/1277 to track the installation of the `perform actions` compartment in Actions.
Therefore, this issue (and PR) will be focused on Parts.

author_association: CONTRIBUTOR
user: login: AxelRICHARD
created_at: 2025-05-07T11:26:57Z
body: > A new issue has been filed #1277 to track the installation of the `perform actions` compartment in Actions. Therefore, this issue (and PR) will be focused on Parts.

Ok thank you, please fix the build of this PR before starting a new contribution.
author_association: MEMBER