diff --git a/immutables/pom.xml b/immutables/pom.xml
new file mode 100644
index 0000000000..2b4aba59b1
--- /dev/null
+++ b/immutables/pom.xml
@@ -0,0 +1,50 @@
+
+
+ 4.0.0
+
+ com.baeldung
+ immutables
+ 1.0.0-SNAPSHOT
+
+
+
+ org.immutables
+ value
+ 2.2.10
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.assertj
+ assertj-core
+ 3.5.2
+ test
+
+
+ org.mutabilitydetector
+ MutabilityDetector
+ 0.9.5
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.3
+
+
+ 1.8
+
+
+
+
+
\ No newline at end of file
diff --git a/immutables/src/main/java/com/baeldung/immutable/Address.java b/immutables/src/main/java/com/baeldung/immutable/Address.java
new file mode 100644
index 0000000000..93474dc043
--- /dev/null
+++ b/immutables/src/main/java/com/baeldung/immutable/Address.java
@@ -0,0 +1,9 @@
+package com.baeldung.immutable;
+
+import org.immutables.value.Value;
+
+@Value.Immutable
+public interface Address {
+ String getStreetName();
+ Integer getNumber();
+}
diff --git a/immutables/src/main/java/com/baeldung/immutable/Person.java b/immutables/src/main/java/com/baeldung/immutable/Person.java
new file mode 100644
index 0000000000..466daf42c2
--- /dev/null
+++ b/immutables/src/main/java/com/baeldung/immutable/Person.java
@@ -0,0 +1,9 @@
+package com.baeldung.immutable;
+
+import org.immutables.value.Value;
+
+@Value.Immutable
+public abstract class Person {
+ abstract String getName();
+ abstract Integer getAge();
+}
diff --git a/immutables/src/main/java/com/baeldung/immutable/auxiliary/Person.java b/immutables/src/main/java/com/baeldung/immutable/auxiliary/Person.java
new file mode 100644
index 0000000000..78fe28c50c
--- /dev/null
+++ b/immutables/src/main/java/com/baeldung/immutable/auxiliary/Person.java
@@ -0,0 +1,13 @@
+package com.baeldung.immutable.auxiliary;
+
+
+import org.immutables.value.Value;
+
+@Value.Immutable
+public abstract class Person {
+ abstract String getName();
+ abstract Integer getAge();
+
+ @Value.Auxiliary
+ abstract String getAuxiliaryField();
+}
\ No newline at end of file
diff --git a/immutables/src/main/java/com/baeldung/immutable/default_/Person.java b/immutables/src/main/java/com/baeldung/immutable/default_/Person.java
new file mode 100644
index 0000000000..bc48f11a38
--- /dev/null
+++ b/immutables/src/main/java/com/baeldung/immutable/default_/Person.java
@@ -0,0 +1,14 @@
+package com.baeldung.immutable.default_;
+
+import org.immutables.value.Value;
+
+@Value.Immutable(prehash = true)
+public abstract class Person {
+
+ abstract String getName();
+
+ @Value.Default
+ Integer getAge() {
+ return 42;
+ }
+}
diff --git a/immutables/src/main/java/com/baeldung/immutable/parameter/Person.java b/immutables/src/main/java/com/baeldung/immutable/parameter/Person.java
new file mode 100644
index 0000000000..4e8218f99c
--- /dev/null
+++ b/immutables/src/main/java/com/baeldung/immutable/parameter/Person.java
@@ -0,0 +1,14 @@
+package com.baeldung.immutable.parameter;
+
+
+import org.immutables.value.Value;
+
+@Value.Immutable
+public abstract class Person {
+
+ @Value.Parameter
+ abstract String getName();
+
+ @Value.Parameter
+ abstract Integer getAge();
+}
\ No newline at end of file
diff --git a/immutables/src/main/java/com/baeldung/immutable/prehash/Person.java b/immutables/src/main/java/com/baeldung/immutable/prehash/Person.java
new file mode 100644
index 0000000000..5e5dd4d9e9
--- /dev/null
+++ b/immutables/src/main/java/com/baeldung/immutable/prehash/Person.java
@@ -0,0 +1,9 @@
+package com.baeldung.immutable.prehash;
+
+import org.immutables.value.Value;
+
+@Value.Immutable(prehash = true)
+public abstract class Person {
+ abstract String getName();
+ abstract Integer getAge();
+}
diff --git a/immutables/src/test/java/com/baeldung/immutable/ImmutablePersonTest.java b/immutables/src/test/java/com/baeldung/immutable/ImmutablePersonTest.java
new file mode 100644
index 0000000000..bf075569db
--- /dev/null
+++ b/immutables/src/test/java/com/baeldung/immutable/ImmutablePersonTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.immutable;
+
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mutabilitydetector.unittesting.MutabilityAssert.assertImmutable;
+
+public class ImmutablePersonTest {
+
+ @Test
+ public void whenModifying_shouldCreateNewInstance() throws Exception {
+ final ImmutablePerson john = ImmutablePerson.builder()
+ .age(42)
+ .name("John")
+ .build();
+
+ final ImmutablePerson john43 = john.withAge(43);
+
+ assertThat(john)
+ .isNotSameAs(john43);
+
+ assertThat(john.getAge())
+ .isEqualTo(42);
+
+ assertImmutable(ImmutablePerson.class);
+ }
+}
\ No newline at end of file
diff --git a/immutables/src/test/java/com/baeldung/immutable/auxiliary/ImmutablePersonAuxiliaryTest.java b/immutables/src/test/java/com/baeldung/immutable/auxiliary/ImmutablePersonAuxiliaryTest.java
new file mode 100644
index 0000000000..83f9e51ed5
--- /dev/null
+++ b/immutables/src/test/java/com/baeldung/immutable/auxiliary/ImmutablePersonAuxiliaryTest.java
@@ -0,0 +1,33 @@
+package com.baeldung.immutable.auxiliary;
+
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ImmutablePersonAuxiliaryTest {
+
+ @Test
+ public void whenComparing_shouldIgnore() throws Exception {
+ final ImmutablePerson john1 = ImmutablePerson.builder()
+ .name("John")
+ .age(42)
+ .auxiliaryField("Value1")
+ .build();
+
+ final ImmutablePerson john2 = ImmutablePerson.builder()
+ .name("John")
+ .age(42)
+ .auxiliaryField("Value2")
+ .build();
+
+
+ assertThat(john1.equals(john2))
+ .isTrue();
+
+ assertThat(john1.toString())
+ .isEqualTo(john2.toString());
+
+ assertThat(john1.hashCode())
+ .isEqualTo(john2.hashCode());
+ }
+}
\ No newline at end of file
diff --git a/immutables/src/test/java/com/baeldung/immutable/default_/ImmutablePersonDefaultTest.java b/immutables/src/test/java/com/baeldung/immutable/default_/ImmutablePersonDefaultTest.java
new file mode 100644
index 0000000000..5cf4ac0cf7
--- /dev/null
+++ b/immutables/src/test/java/com/baeldung/immutable/default_/ImmutablePersonDefaultTest.java
@@ -0,0 +1,17 @@
+package com.baeldung.immutable.default_;
+
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ImmutablePersonDefaultTest {
+
+ @Test
+ public void whenInstantiating_shouldUseDefaultValue() throws Exception {
+
+ final ImmutablePerson john = ImmutablePerson.builder().name("John").build();
+
+ assertThat(john.getAge()).isEqualTo(42);
+
+ }
+}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index d2f5d83b46..419916de86 100644
--- a/pom.xml
+++ b/pom.xml
@@ -31,6 +31,7 @@
guava19
handling-spring-static-resources
httpclient
+ immutables
jackson
javaxval
jjwt