diff --git a/CodeToXMI.sln.DotSettings.user b/CodeToXMI.sln.DotSettings.user
index f74312a70119a758c55863fd7229eeafb0d33c38..e63276796f74fd719f9bdb12a5dd92323822f04c 100644
--- a/CodeToXMI.sln.DotSettings.user
+++ b/CodeToXMI.sln.DotSettings.user
@@ -2,9 +2,44 @@
 	<s:String x:Key="/Default/Environment/Hierarchy/Build/BuildTool/CustomBuildToolPath/@EntryValue">/usr/local/share/dotnet/sdk/7.0.404/MSBuild.dll</s:String>
 	<s:Int64 x:Key="/Default/Environment/Hierarchy/Build/BuildTool/MsbuildVersion/@EntryValue">1114112</s:Int64>
 	<s:String x:Key="/Default/Environment/Highlighting/HighlightingSourceSnapshotLocation/@EntryValue">/Users/jakubkonvicka/Library/Caches/JetBrains/Rider2023.3/resharper-host/temp/Rider/vAny/CoverageData/_CodeToXMI.401400098/Snapshot/snapshot.utdcvr</s:String>
-	<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=ea6b864b_002D2fca_002D4192_002D9701_002D8b0ec6a1f0b5/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" IsActive="True" Name="ClassDiagramTests" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
+	<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=1172169d_002D8cd5_002D4c97_002D94b5_002D78b35c14dd26/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" Name="BuildActivityDiagramWithDecisionsAndActions #2" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
+  &lt;TestAncestor&gt;
+    &lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisionsAndActions&lt;/TestId&gt;
+  &lt;/TestAncestor&gt;
+&lt;/SessionState&gt;</s:String>
+	<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=33cb20c1_002D7095_002D4c53_002Daff8_002Dbc67f6869c16/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" Name="BuildActivityDiagramWithDecisionsAndActions" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
+  &lt;TestAncestor&gt;
+    &lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisionsAndActions&lt;/TestId&gt;
+  &lt;/TestAncestor&gt;
+&lt;/SessionState&gt;</s:String>
+	<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=447f0ad2_002D3982_002D4c13_002D8562_002D18748dcc27d7/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" Name="BuildActivityDiagramWithDecisionsAndActions #4" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
+  &lt;TestAncestor&gt;
+    &lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisionsAndActions&lt;/TestId&gt;
+  &lt;/TestAncestor&gt;
+&lt;/SessionState&gt;</s:String>
+	<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=89ec26b2_002Dc3eb_002D4d79_002D97c5_002D0b5722ace381/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" Name="BuildActivityDiagramWithDecisionsAndActions #3" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
+  &lt;TestAncestor&gt;
+    &lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisionsAndActions&lt;/TestId&gt;
+  &lt;/TestAncestor&gt;
+&lt;/SessionState&gt;</s:String>
+	<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=9cd5065d_002Da7a4_002D4689_002Db1fe_002Df606c9e9e91d/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" Name="BuildActivityDiagramWithDecisions" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
+  &lt;TestAncestor&gt;
+    &lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisions&lt;/TestId&gt;
+    &lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisionsAndActions&lt;/TestId&gt;
+  &lt;/TestAncestor&gt;
+&lt;/SessionState&gt;</s:String>
+	<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=d5334459_002D70ab_002D4733_002D874a_002D3629f29a0297/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" IsActive="True" Name="BuildActivityDiagramWithDecisionsAndActions #5" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
+  &lt;TestAncestor&gt;
+    &lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests&lt;/TestId&gt;
+    &lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ClassDiagramTests&lt;/TestId&gt;
+  &lt;/TestAncestor&gt;
+&lt;/SessionState&gt;</s:String>
+	<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=ea6b864b_002D2fca_002D4192_002D9701_002D8b0ec6a1f0b5/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" Name="ClassDiagramTests" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
   &lt;TestAncestor&gt;
     &lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ClassDiagramTests&lt;/TestId&gt;
+    &lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildEmptyActivityDiagram&lt;/TestId&gt;
+    &lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithNActivity&lt;/TestId&gt;
+    &lt;TestId&gt;NUnit3x::0F37435B-F6C5-40D0-8250-192C843D1465::net7.0::UnitTest.ActivityDiagramTests.BuildActivityDiagramWithDecisions&lt;/TestId&gt;
   &lt;/TestAncestor&gt;
 &lt;/SessionState&gt;</s:String>
 	
diff --git a/DiagramBuilder/Activity/Diagram/DecisionBuilder.cs b/DiagramBuilder/Activity/Diagram/DecisionBuilder.cs
index bca28cc537ba95915e72df7345b925febb3a0ec8..2bba65347fb1a50ce6c4fff8bd9d42a798e98bee 100644
--- a/DiagramBuilder/Activity/Diagram/DecisionBuilder.cs
+++ b/DiagramBuilder/Activity/Diagram/DecisionBuilder.cs
@@ -14,13 +14,14 @@ namespace DiagramBuilder.Activity.Diagram
         private List<Dictionary<BranchType, XmiElement>> _lastAddedEdge { get; set; } = new();
         private List<Dictionary<BranchType, XmiElement>> _loopElements { get; set; } = new();
         private List<Dictionary<BranchType, XmiElement>> _lastAddedNode { get; set; } = new();
-        
+
         IDiagramBuilder _diagramBuilder { get; set; }
         private List<BranchType> _lastBranchTypeForDecision { get; set; } = new();
-        
+
         private long _actualDecisionId { get; set; } = 0;
 
-        public DecisionBuilder(string? name, XmiActivityDiagramUmlBuilder xmiActivityDiagramUmlBuilder, XmiElement trueBranchEdge, XmiElement lastAddedNode, IDiagramBuilder _diagramBuilder)
+        public DecisionBuilder(string? name, XmiActivityDiagramUmlBuilder xmiActivityDiagramUmlBuilder,
+            XmiElement trueBranchEdge, XmiElement lastAddedNode, IDiagramBuilder _diagramBuilder)
         {
             this._diagramBuilder = _diagramBuilder;
             _xmiActivityDiagramUmlBuilder = xmiActivityDiagramUmlBuilder;
@@ -29,8 +30,8 @@ namespace DiagramBuilder.Activity.Diagram
 
             _lastBranchTypeForDecision.Add(BranchType.True);
             _lastAddedEdge[^1].Add(BranchType.True, trueBranchEdge);
-            _lastAddedEdge[^1].Add(BranchType.True, lastAddedNode);
-            _lastAddedEdge[^1].Add(BranchType.False, lastAddedNode);
+            _lastAddedNode[^1].Add(BranchType.True, lastAddedNode);
+            _lastAddedNode[^1].Add(BranchType.False, lastAddedNode);
         }
 
         public string? BuildDiagram()
@@ -47,35 +48,39 @@ namespace DiagramBuilder.Activity.Diagram
             {
                 node = _xmiActivityDiagramUmlBuilder.AddAction(
                     _xmiActivityDiagramUmlBuilder.ActivityDiagram, name, null, null, _lastAddedNode[^1][type]);
+
                 _lastAddedEdge[^1].Add(type, _xmiActivityDiagramUmlBuilder.LatestEdge);
             }
             else
             {
                 node = _xmiActivityDiagramUmlBuilder.AddAction(
-                    _xmiActivityDiagramUmlBuilder.ActivityDiagram, name, new List<XmiElement> { _lastAddedEdge[^1][type] }, null, _lastAddedNode[^1][type]);
+                    _xmiActivityDiagramUmlBuilder.ActivityDiagram, name,
+                    new List<XmiElement> { _lastAddedEdge[^1][type] }, null, _lastAddedNode[^1][type]);
             }
 
             _lastAddedNode[^1][type] = node;
             return this;
         }
 
-        public IDecisionBuilder AddMerge(string? name)
+        public (IDecisionBuilder, IDiagramBuilder) AddMerge(string? name)
         {
             var mergeNode = _xmiActivityDiagramUmlBuilder.AddMerge(
                 _xmiActivityDiagramUmlBuilder.ActivityDiagram, name,
                 _lastAddedNode[^1][BranchType.True], _lastAddedNode[^1][BranchType.False]);
-            _lastAddedEdge.Remove(_lastAddedEdge[^1]);
-            _lastAddedNode.Remove(_lastAddedNode[^1]);
-            
+            _lastAddedEdge.Remove(_lastAddedEdge.Last());
+            _lastAddedNode.Remove(_lastAddedNode.Last());
+
             this._diagramBuilder.LastActivity = mergeNode;
-            
+
             if (_lastAddedNode.Count == 0)
-                return this;
-            
-            _lastAddedNode[^1][_lastBranchTypeForDecision[^1]] = mergeNode;
-            _lastBranchTypeForDecision.RemoveAt(_lastBranchTypeForDecision.Count-1);
-            
-            return this;
+            {
+                return (null, this._diagramBuilder);
+            }
+
+            _lastAddedNode.Last()[_lastBranchTypeForDecision.Last()] = mergeNode;
+            _lastBranchTypeForDecision.RemoveAt(_lastBranchTypeForDecision.Count - 1);
+
+            return (this, null);
         }
 
         public IDecisionBuilder AddDecision(string name, string trueCondition, string falseCondition, BranchType type)
@@ -84,17 +89,31 @@ namespace DiagramBuilder.Activity.Diagram
             _lastAddedEdge.Add(new Dictionary<BranchType, XmiElement>());
             _lastAddedNode.Add(new Dictionary<BranchType, XmiElement>());
             XmiElement node;
-            if (!_lastAddedNode[_lastAddedNode.Count-2].TryGetValue(type, out _))
+
+            if (_lastAddedNode.Count < 2)
             {
                 node = _xmiActivityDiagramUmlBuilder.AddDecision(
-                    _xmiActivityDiagramUmlBuilder.ActivityDiagram, name, null, null, _lastAddedNode[_lastAddedNode.Count-2][type]);
-                _lastAddedEdge[^1][type] = _xmiActivityDiagramUmlBuilder.LatestEdge;
+                    _xmiActivityDiagramUmlBuilder.ActivityDiagram, name,
+                    new List<XmiElement> { this._xmiActivityDiagramUmlBuilder.LatestEdge }, null,
+                    this._diagramBuilder.LastActivity);
+
             }
             else
             {
-                node = _xmiActivityDiagramUmlBuilder.AddDecision(
-                    _xmiActivityDiagramUmlBuilder.ActivityDiagram, name,
-                    new List<XmiElement> { _lastAddedNode[_lastAddedNode.Count-2][type] }, null, _lastAddedNode[_lastAddedNode.Count-2][type]);
+                if (!_lastAddedNode[_lastAddedNode.Count - 2].TryGetValue(type, out _))
+                {
+                    node = _xmiActivityDiagramUmlBuilder.AddDecision(
+                        _xmiActivityDiagramUmlBuilder.ActivityDiagram, name, null, null,
+                        _lastAddedNode[_lastAddedNode.Count - 2][type]);
+                    _lastAddedEdge[^1][type] = _xmiActivityDiagramUmlBuilder.LatestEdge;
+                }
+                else
+                {
+                    node = _xmiActivityDiagramUmlBuilder.AddDecision(
+                        _xmiActivityDiagramUmlBuilder.ActivityDiagram, name,
+                        new List<XmiElement> { _lastAddedNode[_lastAddedNode.Count - 2][type] }, null,
+                        _lastAddedNode[_lastAddedNode.Count - 2][type]);
+                }
             }
             
             node.Type = XmiType.UmlDecisionNode;
@@ -104,8 +123,7 @@ namespace DiagramBuilder.Activity.Diagram
         }
 
         public IDecisionBuilder AddLoop(string name, string condition, BranchType type)
-        { 
-            
+        {
             if (!_lastAddedEdge[^1].TryGetValue(type, out var edge))
             {
                 _lastAddedNode[^1][type] = _xmiActivityDiagramUmlBuilder.AddDecision(
@@ -115,10 +133,11 @@ namespace DiagramBuilder.Activity.Diagram
             else
             {
                 _lastAddedNode[^1][type] = _xmiActivityDiagramUmlBuilder.AddDecision(
-                    _xmiActivityDiagramUmlBuilder.ActivityDiagram, name, new List<XmiElement> { _lastAddedEdge[^1][type] }, null, _lastAddedNode[^1][type]);
+                    _xmiActivityDiagramUmlBuilder.ActivityDiagram, name,
+                    new List<XmiElement> { _lastAddedEdge[^1][type] }, null, _lastAddedNode[^1][type]);
             }
-            
-            
+
+
             _loopElements.Add(new Dictionary<BranchType, XmiElement>());
             _loopElements[^1].Add(type, _lastAddedNode[^1][type]);
             return this;
@@ -126,7 +145,8 @@ namespace DiagramBuilder.Activity.Diagram
 
         public IDecisionBuilder CloseLoop(string name, BranchType type)
         {
-            _xmiActivityDiagramUmlBuilder.AddDirectedEdge(_xmiActivityDiagramUmlBuilder.ActivityDiagram, _lastAddedNode[^1][type],
+            _xmiActivityDiagramUmlBuilder.AddDirectedEdge(_xmiActivityDiagramUmlBuilder.ActivityDiagram,
+                _lastAddedNode[^1][type],
                 _loopElements[^1][type]);
             _lastAddedNode[^1][type] = _loopElements[^1][type];
             _loopElements.Remove(_loopElements[^1]);
@@ -139,4 +159,4 @@ namespace DiagramBuilder.Activity.Diagram
             return this._diagramBuilder;
         }
     }
-}
+}
\ No newline at end of file
diff --git a/DiagramBuilder/Activity/Interface/IDecisionBuilder.cs b/DiagramBuilder/Activity/Interface/IDecisionBuilder.cs
index 65786551c597b058805c01678284926f455ed919..fff56319657c56be4e6cf60abc6c97542d21753d 100644
--- a/DiagramBuilder/Activity/Interface/IDecisionBuilder.cs
+++ b/DiagramBuilder/Activity/Interface/IDecisionBuilder.cs
@@ -5,7 +5,7 @@ namespace DiagramBuilder.Activity.Interface;
 public interface IDecisionBuilder
 {
     public IDecisionBuilder AddAction(string name, BranchType type);
-    public IDecisionBuilder AddMerge(string? name);
+    public (IDecisionBuilder, IDiagramBuilder) AddMerge(string? name);
     public IDecisionBuilder AddDecision(string name, string trueCondition, string falseCondition, BranchType type);
     public IDecisionBuilder AddLoop(string name, string condition, BranchType type);
     public IDecisionBuilder CloseLoop(string name, BranchType type);
diff --git a/UnitTest/ActivityDiagramTests.cs b/UnitTest/ActivityDiagramTests.cs
new file mode 100644
index 0000000000000000000000000000000000000000..84d1292dce15ca57cac1591881444d43739ed850
--- /dev/null
+++ b/UnitTest/ActivityDiagramTests.cs
@@ -0,0 +1,297 @@
+using System.Text.RegularExpressions;
+using System.Xml;
+using System.Xml.Schema;
+using DiagramBuilder.Activity.Diagram.Enum;
+using DiagramBuilder.Activity.Interface;
+using DiagramBuilder.ConcreteCreator;
+
+namespace UnitTest;
+
+public class ActivityDiagramTests
+{
+    ActivityDiagramBuilderCreatorFactory ActivityDiagramBuilderCreatorFactory { get; set; }
+    IDiagramBuilder ActivityDiagramBuilder { get; set; }
+
+    private string generatedFileName { get; set; } = string.Empty;
+
+    static List<(string, string)> _errors = new List<(string, string)>();
+
+    [SetUp]
+    public void Setup()
+    {
+        RemoveGeneratedFile();
+        ActivityDiagramBuilderCreatorFactory = new ActivityDiagramBuilderCreatorFactory();
+        ActivityDiagramBuilder = ActivityDiagramBuilderCreatorFactory.FactoryMethod("Test");
+        generatedFileName = $"ActivityDiagram-{DateTime.UtcNow.ToString("yyyy-M-d_hh-mm-ss")}.xml";
+    }
+
+    private void RemoveGeneratedFile()
+    {
+        if (File.Exists(generatedFileName))
+        {
+            File.Delete(generatedFileName);
+        }
+    }
+
+    [Test]
+    public void BuildEmptyActivityDiagram()
+    {
+        string xmi = ActivityDiagramBuilder.BuildDiagram();
+        AssertCommonAssertions(xmi);
+        RemoveGeneratedFile();
+    }
+
+    [Test]
+    [TestCase(0)]
+    [TestCase(1)]
+    [TestCase(10)]
+    [TestCase(100)]
+    public void BuildActivityDiagramWithNActivity(int numberOfActivities)
+    {
+        for (int i = 0; i < numberOfActivities; i++)
+        {
+            ActivityDiagramBuilder = ActivityDiagramBuilder.AddAction($"Activity{i}");
+        }
+
+        string xmi = ActivityDiagramBuilder.BuildDiagram();
+        AssertCommonAssertions(xmi);
+        //test if number of activitises added to xmi <node name="Activity
+        XmlDocument xmlDoc = new XmlDocument();
+        xmlDoc.LoadXml(xmi);
+        XmlNodeList nodes = xmlDoc.SelectNodes("//node[contains(@name, 'Activity')]");
+        Assert.IsTrue(nodes.Count == numberOfActivities,
+            $"Number of activities added to XMI should be {numberOfActivities}");
+        RemoveGeneratedFile();
+    }
+
+    [Test]
+    [TestCase(0)]
+    [TestCase(1)]
+    [TestCase(10)]
+    [TestCase(100)]
+    public void BuildActivityDiagramWithDecisions(int decisionCount)
+    {
+        if (decisionCount > 0)
+        {
+            IDecisionBuilder decisionBuilder;
+            decisionBuilder = ActivityDiagramBuilder.AddDecision($"Decision{0}", "Yes", "No");
+            for (int i = 1; i < decisionCount; i++)
+            {
+                _ = decisionBuilder.AddDecision($"Decision{i}T", "Yes", "No", BranchType.True);
+                decisionBuilder = decisionBuilder.AddDecision($"Decision{i}F", "Yes", "No", BranchType.False);
+            }
+
+            string xmi = ActivityDiagramBuilder.BuildDiagram();
+            AssertCommonAssertions(xmi);
+            //test if number of decisions added to xmi <node name="Decision
+            XmlDocument xmlDoc = new XmlDocument();
+            xmlDoc.LoadXml(xmi);
+            XmlNodeList nodes = xmlDoc.SelectNodes("//node[contains(@name, 'Decision')]");
+            Assert.IsTrue(nodes.Count == decisionCount * 2 - 1,
+                $"Number of decisions added to XMI should be {decisionCount * 2 - 1}");
+            RemoveGeneratedFile();
+        }
+    }
+
+    [Test]
+    [TestCase(2, 1, true)]
+    [TestCase(10, 10, false)]
+    [TestCase(10, 10, true)]
+    [TestCase(0, 0, false)]
+    [TestCase(0, 0, true)]
+    [TestCase(0, 1, false)]
+    [TestCase(0, 1, true)]
+    [TestCase(1, 1, false)]
+    [TestCase(10, 10, false)]
+    [TestCase(10, 10, true)]
+    [TestCase(10, 0, false)]
+    [TestCase(10, 0, true)]
+    [TestCase(0, 10, false)]
+    [TestCase(0, 10, true)]
+    [TestCase(100, 100, false)]
+    [TestCase(100, 100, true)]
+    [TestCase(100, 0, false)]
+    [TestCase(100, 0, true)]
+    [TestCase(0, 100, false)]
+    [TestCase(0, 100, true)]
+    public void BuildActivityDiagramWithDecisionsAndActions(int decisionCount, int actionsCount, bool addMerge)
+    {
+        if (decisionCount > 0)
+        {
+            IDecisionBuilder decisionBuilder;
+            IDiagramBuilder diagramBuilder = null;
+            decisionBuilder = ActivityDiagramBuilder.AddDecision($"Decision{0}", "Yes", "No");
+            for (int i = 0; i < decisionCount; i++)
+            {
+                //add actions
+                for (int j = 0; j < actionsCount; j++)
+                {
+                    if (decisionBuilder != null)
+                    {
+                        var branchType = j % 2 == 0 ? BranchType.True : BranchType.False;
+                        decisionBuilder = decisionBuilder.AddAction($"Activity{i}T{j}", branchType);
+                    }
+                    else if(diagramBuilder != null)
+                    {
+                        diagramBuilder = diagramBuilder.AddAction($"Activity{i}B{j}");
+                    }
+                }
+                
+                if (addMerge && decisionBuilder != null)
+                {
+                    (decisionBuilder, diagramBuilder) = decisionBuilder.AddMerge($"Merge{i}");
+                }
+
+                if (i != 0)
+                {
+                    //add decision
+                    if (decisionBuilder != null)
+                    {
+                        var branchType = i % 2 == 0 ? BranchType.True : BranchType.False;
+                        decisionBuilder = decisionBuilder.AddDecision($"Decision{i}T", "Yes", "No", branchType);
+                    }
+                    else if (diagramBuilder != null)
+                    {
+                        decisionBuilder = diagramBuilder.AddDecision($"Decision{i}B", "Yes", "No");
+                    }
+                }
+                
+            }
+            
+
+            string xmi = ActivityDiagramBuilder.BuildDiagram();
+            AssertCommonAssertions(xmi);
+            //test if number of decisions added to xmi <node name="Decision
+            XmlDocument xmlDoc = new XmlDocument();
+            xmlDoc.LoadXml(xmi);
+            XmlNodeList nodes = xmlDoc.SelectNodes("//node[contains(@name, 'Decision')]");
+            Assert.IsTrue(nodes.Count == decisionCount, $"Number of decisions added to XMI should be {decisionCount}");
+            //test if number of activitises added to xmi <node name="Activity
+            nodes = xmlDoc.SelectNodes("//node[contains(@name, 'Activity')]");
+            Assert.IsTrue(nodes.Count == decisionCount * actionsCount,
+                $"Number of activities added to XMI should be {decisionCount * actionsCount}");
+            if (addMerge)
+            {
+                nodes = xmlDoc.SelectNodes("//node[contains(@name, 'Merge')]");
+                Assert.IsTrue(nodes.Count == decisionCount-1, $"Number of merges added to XMI should be {decisionCount}");
+            }
+
+            RemoveGeneratedFile();
+        }
+    }
+
+    [Test]
+    public void BuildLoops()
+    {
+        IDecisionBuilder decisionBuilder;
+        IDiagramBuilder diagramBuilder = null;
+        decisionBuilder = ActivityDiagramBuilder.AddDecision($"Decision{0}", "Yes", "No");
+        for (int i = 0; i < 10; i++)
+        {
+            //add actions
+            for (int j = 0; j < 10; j++)
+            {
+                if (decisionBuilder != null)
+                {
+                    var branchType = j % 2 == 0 ? BranchType.True : BranchType.False;
+                    decisionBuilder = decisionBuilder.AddAction($"Activity{i}T{j}", branchType);
+                }
+                else if(diagramBuilder != null)
+                {
+                    diagramBuilder = diagramBuilder.AddAction($"Activity{i}B{j}");
+                }
+            }
+            
+            if (decisionBuilder != null)
+            {
+                decisionBuilder = decisionBuilder.AddLoop($"Loop{i}", "Yes", BranchType.True);
+            }
+            else if (diagramBuilder != null)
+            {
+                diagramBuilder = diagramBuilder.AddLoop($"Loop{i}", "Yes");
+            }
+            
+            if (i != 0)
+            {
+                //add decision
+                if (decisionBuilder != null)
+                {
+                    var branchType = i % 2 == 0 ? BranchType.True : BranchType.False;
+                    decisionBuilder = decisionBuilder.AddDecision($"Decision{i}T", "Yes", "No", branchType);
+                }
+                else if (diagramBuilder != null)
+                {
+                    decisionBuilder = diagramBuilder.AddDecision($"Decision{i}B", "Yes", "No");
+                }
+            }
+            
+        }
+        
+        string xmi = ActivityDiagramBuilder.BuildDiagram();
+        AssertCommonAssertions(xmi);
+        //test if number of decisions added to xmi <node name="Decision
+        XmlDocument xmlDoc = new XmlDocument();
+        xmlDoc.LoadXml(xmi);
+        XmlNodeList nodes = xmlDoc.SelectNodes("//node[contains(@name, 'Decision')]");
+        Assert.IsTrue(nodes.Count == 10, $"Number of decisions added to XMI should be 10");
+        //test if number of activitises added to xmi <node name="Activity
+        nodes = xmlDoc.SelectNodes("//node[contains(@name, 'Activity')]");
+        Assert.IsTrue(nodes.Count == 100, $"Number of activities added to XMI should be 100");
+        nodes = xmlDoc.SelectNodes("//node[contains(@name, 'Loop')]");
+        Assert.IsTrue(nodes.Count == 10, $"Number of loops added to XMI should be 10");
+    }
+
+    void ValidateSchema()
+    {
+        // Path to your XSD file
+        string xsdFilePath = "../../../Schema/XMI.xsd";
+
+        // Create XmlReaderSettings
+        XmlReaderSettings settings = new XmlReaderSettings();
+        settings.ValidationType = ValidationType.Schema;
+
+        // Load XSD file and set it as the schema
+        XmlSchemaSet schemas = new XmlSchemaSet();
+        schemas.Add(null, xsdFilePath);
+        settings.Schemas = schemas;
+
+        // Set the validation event handler
+        settings.ValidationEventHandler += ValidationCallback;
+
+        // Create XmlReader with the XMI file and settings
+        using (XmlReader reader = XmlReader.Create(generatedFileName, settings))
+        {
+            // Read through the XML document
+            reader.Read();
+        }
+
+        // Assert that there are no errors
+        Assert.IsTrue(_errors.Count == 0, "There should be no errors in the XMI file");
+        foreach ((string severity, string message) in _errors)
+        {
+            Console.WriteLine($"{severity}: {message}");
+        }
+    }
+
+    static void ValidationCallback(object sender, ValidationEventArgs e)
+    {
+        if (e.Severity == XmlSeverityType.Error || e.Severity == XmlSeverityType.Warning)
+        {
+            _errors.Add((e.Severity.ToString(), e.Message));
+        }
+    }
+
+    private void AssertCommonAssertions(string xmi)
+    {
+        Assert.IsFalse(string.IsNullOrEmpty(xmi), "XMI should not be null or empty");
+        Assert.IsTrue(xmi.Contains("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"), "XMI should contain the XML header");
+        // Add more assertions based on the expected structure of your XMI
+
+        if (!string.IsNullOrEmpty(generatedFileName))
+        {
+            File.WriteAllText(generatedFileName, xmi);
+            ValidateSchema();
+            RemoveGeneratedFile();
+        }
+    }
+}
\ No newline at end of file
diff --git a/UnitTest/ClassDiagramTests.cs b/UnitTest/ClassDiagramTests.cs
index 4541dbf54ab8917496b6721216e1a0398ea4bc50..9a75601215b20fac4360f5fad6320c9497dc1439 100644
--- a/UnitTest/ClassDiagramTests.cs
+++ b/UnitTest/ClassDiagramTests.cs
@@ -445,7 +445,7 @@ public class ClassDiagramTests
 
 
 
-        void ValidateSchema()
+    void ValidateSchema()
     {
         // Path to your XSD file
         string xsdFilePath = "../../../Schema/XMI.xsd";