diff --git a/shallow-deep-copy/README.md b/shallow-deep-copy/README.md
new file mode 100644
index 0000000000..e1a426a138
--- /dev/null
+++ b/shallow-deep-copy/README.md
@@ -0,0 +1,7 @@
+## Shallow vs Deep Copy
+
+This module contains an article about shallow vs deep copy of Java objects
+
+### Relevant articles:
+
+- [Creating a deep vs shallow copy of an object in Java](https://drafts.baeldung.com/?p=172294&preview=true)
diff --git a/shallow-deep-copy/pom.xml b/shallow-deep-copy/pom.xml
new file mode 100644
index 0000000000..01c1430f28
--- /dev/null
+++ b/shallow-deep-copy/pom.xml
@@ -0,0 +1,16 @@
+
+
+ 4.0.0
+ shallow-deep-copy
+ shallow-deep-copy
+ jar
+
+
+ com.baeldung
+ parent-modules
+ 1.0.0-SNAPSHOT
+
+
+
\ No newline at end of file
diff --git a/shallow-deep-copy/src/main/java/com/baeldung/shallowdeepcopy/Dependency.java b/shallow-deep-copy/src/main/java/com/baeldung/shallowdeepcopy/Dependency.java
new file mode 100644
index 0000000000..a5da5fc163
--- /dev/null
+++ b/shallow-deep-copy/src/main/java/com/baeldung/shallowdeepcopy/Dependency.java
@@ -0,0 +1,23 @@
+package com.baeldung.shallowdeepcopy;
+
+public class Dependency implements Cloneable {
+ private int value = 13;
+
+ public Dependency(int value) {
+ super();
+ this.value = value;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ public void setValue(int value) {
+ this.value = value;
+ }
+
+ @Override
+ protected Object clone() throws CloneNotSupportedException {
+ return super.clone();
+ }
+}
diff --git a/shallow-deep-copy/src/main/java/com/baeldung/shallowdeepcopy/Main.java b/shallow-deep-copy/src/main/java/com/baeldung/shallowdeepcopy/Main.java
new file mode 100644
index 0000000000..fb24007162
--- /dev/null
+++ b/shallow-deep-copy/src/main/java/com/baeldung/shallowdeepcopy/Main.java
@@ -0,0 +1,31 @@
+package com.baeldung.shallowdeepcopy;
+
+public class Main implements Cloneable {
+ private Dependency dependency;
+
+ public Main(Dependency dependency) {
+ super();
+ this.dependency = dependency;
+ }
+
+ @Override
+ public Object clone() throws CloneNotSupportedException {
+ return super.clone();
+ }
+
+ public Object deepClone() throws CloneNotSupportedException {
+ Main dependentClone = (Main) super.clone();
+ Dependency dependencyClone = (Dependency) this.dependency.clone();
+ dependentClone.setDependency(dependencyClone);
+ return dependentClone;
+ }
+
+ public Dependency getDependency() {
+ return dependency;
+ }
+
+ public void setDependency(Dependency dependency) {
+ this.dependency = dependency;
+ }
+
+}
diff --git a/shallow-deep-copy/src/main/resources/logback.xml b/shallow-deep-copy/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/shallow-deep-copy/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/shallow-deep-copy/src/test/java/com/baeldung/shallowdeepcopy/ShallowDeepCopyUnitTest.java b/shallow-deep-copy/src/test/java/com/baeldung/shallowdeepcopy/ShallowDeepCopyUnitTest.java
new file mode 100644
index 0000000000..321c2df327
--- /dev/null
+++ b/shallow-deep-copy/src/test/java/com/baeldung/shallowdeepcopy/ShallowDeepCopyUnitTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.shallowdeepcopy;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+class ShallowDeepCopyUnitTest {
+
+ @Test
+ public void givenAnObjectAndADependency_whenShallowClonedAndDepencyChanges_ThenDepencyHasNewValue() throws Exception {
+ Dependency dependency = new Dependency(13);
+ Main main = new Main(dependency);
+ Main shallowClone = (Main) main.clone();
+ dependency.setValue(17);
+ assertEquals(17, shallowClone.getDependency().getValue());
+ }
+
+
+ @Test
+ public void givenAnObjectAndADependency_whenDeepClonedAndDepencyChanges_ThenDepencyKeepsOldValue() throws Exception {
+ Dependency dependency = new Dependency(13);
+ Main main = new Main(dependency);
+ Main deepClone = (Main) main.deepClone();
+ dependency.setValue(17);
+ assertEquals(13, deepClone.getDependency().getValue());
+ }
+}