diff --git a/ejb/ejb-session-beans/pom.xml b/ejb/ejb-session-beans/pom.xml
new file mode 100644
index 0000000000..a9b667baac
--- /dev/null
+++ b/ejb/ejb-session-beans/pom.xml
@@ -0,0 +1,106 @@
+
+ 4.0.0
+
+ com.baeldung.ejb
+ ejb
+ 1.0-SNAPSHOT
+
+ ejb-session-beans
+
+
+ UTF-8
+ 1.1.12.Final
+ 2.2.6
+ 1.1.12.Final
+ 1.0.0.Final
+ 4.12
+ 7.0
+
+
+
+
+
+ org.jboss.arquillian
+ arquillian-bom
+ 1.1.13.Final
+ import
+ pom
+
+
+
+
+
+
+
+ javax
+ javaee-api
+ ${javaee-api.version}
+ provided
+
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+
+
+ org.jboss.arquillian.junit
+ arquillian-junit-container
+ test
+
+
+
+
+
+
+ arquillian-glassfish-embedded
+
+ true
+
+
+
+ org.jboss.arquillian.container
+ arquillian-glassfish-embedded-3.1
+ 1.0.0.CR4
+ test
+
+
+ org.glassfish.main.extras
+ glassfish-embedded-all
+ 3.1.2
+ test
+
+
+
+
+
+
+
+
+ maven-compiler-plugin
+ 3.1
+
+ 1.8
+ 1.8
+
+
+
+ maven-war-plugin
+ 2.4
+
+ false
+
+
+
+ maven-surefire-plugin
+ 2.17
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateful/EJBClient1.java b/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateful/EJBClient1.java
new file mode 100644
index 0000000000..0387beeb3c
--- /dev/null
+++ b/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateful/EJBClient1.java
@@ -0,0 +1,11 @@
+package com.baeldung.ejb.stateful;
+
+import javax.ejb.EJB;
+
+public class EJBClient1 {
+
+ @EJB
+ public StatefulEJB statefulEJB;
+
+
+}
\ No newline at end of file
diff --git a/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateful/EJBClient2.java b/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateful/EJBClient2.java
new file mode 100644
index 0000000000..54f88a993d
--- /dev/null
+++ b/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateful/EJBClient2.java
@@ -0,0 +1,11 @@
+package com.baeldung.ejb.stateful;
+
+import javax.ejb.EJB;
+
+public class EJBClient2 {
+
+ @EJB
+ public StatefulEJB statefulEJB;
+
+
+}
\ No newline at end of file
diff --git a/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateful/StatefulEJB.java b/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateful/StatefulEJB.java
new file mode 100644
index 0000000000..17bb08491a
--- /dev/null
+++ b/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateful/StatefulEJB.java
@@ -0,0 +1,10 @@
+package com.baeldung.ejb.stateful;
+
+import javax.ejb.Stateful;
+
+@Stateful
+public class StatefulEJB {
+
+ public String name;
+
+}
\ No newline at end of file
diff --git a/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateless/EJBClient1.java b/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateless/EJBClient1.java
new file mode 100644
index 0000000000..0d6f06449b
--- /dev/null
+++ b/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateless/EJBClient1.java
@@ -0,0 +1,10 @@
+package com.baeldung.ejb.stateless;
+
+import javax.ejb.EJB;
+
+public class EJBClient1 {
+
+ @EJB
+ public StatelessEJB statelessEJB;
+
+}
\ No newline at end of file
diff --git a/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateless/EJBClient2.java b/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateless/EJBClient2.java
new file mode 100644
index 0000000000..a7fe650b1b
--- /dev/null
+++ b/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateless/EJBClient2.java
@@ -0,0 +1,11 @@
+package com.baeldung.ejb.stateless;
+
+import javax.ejb.EJB;
+
+public class EJBClient2 {
+
+ @EJB
+ public StatelessEJB statelessEJB;
+
+
+}
\ No newline at end of file
diff --git a/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateless/StatelessEJB.java b/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateless/StatelessEJB.java
new file mode 100644
index 0000000000..d4e9749252
--- /dev/null
+++ b/ejb/ejb-session-beans/src/main/java/com/baeldung/ejb/stateless/StatelessEJB.java
@@ -0,0 +1,11 @@
+package com.baeldung.ejb.stateless;
+
+import javax.ejb.Stateless;
+
+
+@Stateless
+public class StatelessEJB {
+
+ public String name;
+
+}
\ No newline at end of file
diff --git a/ejb/ejb-session-beans/src/test/java/com/baeldung/ejb/test/stateful/StatefulEJBTest.java b/ejb/ejb-session-beans/src/test/java/com/baeldung/ejb/test/stateful/StatefulEJBTest.java
new file mode 100644
index 0000000000..2f3e45a769
--- /dev/null
+++ b/ejb/ejb-session-beans/src/test/java/com/baeldung/ejb/test/stateful/StatefulEJBTest.java
@@ -0,0 +1,51 @@
+package com.baeldung.ejb.test.stateful;
+
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import com.baeldung.ejb.stateful.EJBClient1;
+import com.baeldung.ejb.stateful.EJBClient2;
+import com.baeldung.ejb.stateful.StatefulEJB;
+
+import javax.inject.Inject;
+
+
+@RunWith(Arquillian.class)
+public class StatefulEJBTest {
+
+ @Inject
+ private EJBClient1 ejbClient1;
+
+ @Inject
+ private EJBClient2 ejbClient2;
+
+ @Test
+ public void givenOneStatefulBean_whenTwoClientsSetValueOnBean_thenClientStateIsMaintained() {
+
+ // act
+ ejbClient1.statefulEJB.name = "Client 1";
+ ejbClient2.statefulEJB.name = "Client 2";
+
+ // assert
+ Assert.assertNotEquals(ejbClient1.statefulEJB.name, ejbClient2.statefulEJB.name);
+ Assert.assertEquals("Client 1", ejbClient1.statefulEJB.name);
+ Assert.assertEquals("Client 2", ejbClient2.statefulEJB.name);
+
+ }
+
+ @Deployment
+ public static JavaArchive createDeployment() {
+ return ShrinkWrap.create(JavaArchive.class)
+ .addClass(StatefulEJB.class)
+ .addClass(EJBClient1.class)
+ .addClass(EJBClient2.class)
+ .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+ }
+
+}
diff --git a/ejb/ejb-session-beans/src/test/java/com/baeldung/ejb/test/stateless/StatelessEJBTest.java b/ejb/ejb-session-beans/src/test/java/com/baeldung/ejb/test/stateless/StatelessEJBTest.java
new file mode 100644
index 0000000000..9f88d478b7
--- /dev/null
+++ b/ejb/ejb-session-beans/src/test/java/com/baeldung/ejb/test/stateless/StatelessEJBTest.java
@@ -0,0 +1,62 @@
+package com.baeldung.ejb.test.stateless;
+
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import com.baeldung.ejb.stateless.EJBClient1;
+import com.baeldung.ejb.stateless.EJBClient2;
+import com.baeldung.ejb.stateless.StatelessEJB;
+
+import javax.inject.Inject;
+
+
+@RunWith(Arquillian.class)
+public class StatelessEJBTest {
+
+ @Inject
+ private EJBClient1 ejbClient1;
+
+ @Inject
+ private EJBClient2 ejbClient2;
+
+ @Test
+ public void givenOneStatelessBean_whenStateIsSetInOneBean_secondBeanShouldHaveSameState() {
+
+ // act
+ ejbClient1.statelessEJB.name = "Client 1";
+
+ // assert
+ Assert.assertEquals("Client 1", ejbClient1.statelessEJB.name);
+ Assert.assertEquals("Client 1", ejbClient2.statelessEJB.name);
+
+ }
+
+
+ @Test
+ public void givenOneStatelessBean_whenStateIsSetInBothBeans_secondBeanShouldHaveSecondBeanState() {
+
+ // act
+ ejbClient1.statelessEJB.name = "Client 1";
+ ejbClient2.statelessEJB.name = "Client 2";
+
+ // assert
+ Assert.assertEquals("Client 2", ejbClient2.statelessEJB.name);
+
+ }
+
+ @Deployment
+ public static JavaArchive createDeployment() {
+ return ShrinkWrap.create(JavaArchive.class)
+ .addClass(StatelessEJB.class)
+ .addClass(EJBClient1.class)
+ .addClass(EJBClient2.class)
+ .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+ }
+
+}
diff --git a/ejb/pom.xml b/ejb/pom.xml
index 9495020266..b8aa32fab1 100755
--- a/ejb/pom.xml
+++ b/ejb/pom.xml
@@ -40,7 +40,12 @@
1.0-SNAPSHOT
ejb
-
+
+ com.baeldung.ejb
+ ejb-session-beans
+ 1.0-SNAPSHOT
+ ejb
+
javax
javaee-api
@@ -75,5 +80,7 @@
ejb-remote
ejb-client
+ ejb-session-beans
+ ejb-session-beans-client
\ No newline at end of file