diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml
index 373a12da9e..1fdab4213c 100644
--- a/spring-cloud/pom.xml
+++ b/spring-cloud/pom.xml
@@ -31,6 +31,7 @@
spring-cloud-zuul-eureka-integration
spring-cloud-contract
spring-cloud-kubernetes
+ spring-cloud-archaius
diff --git a/spring-cloud/spring-cloud-archaius/README.md b/spring-cloud/spring-cloud-archaius/README.md
new file mode 100644
index 0000000000..9de26352e1
--- /dev/null
+++ b/spring-cloud/spring-cloud-archaius/README.md
@@ -0,0 +1,14 @@
+# Spring Cloud Archaius
+
+#### Basic Config
+This service has the basic, out-of-the-box Spring Cloud Netflix Archaius configuration.
+
+#### Extra Configs
+This service customizes some properties supported by Archaius.
+
+These properties are set up on the main method, since Archaius uses System properties, but they could be added as command line arguments when launching the app.
+
+#### Additional Sources
+In this service we create a new AbstractConfiguration bean, setting up a new Configuration Properties source.
+
+These properties have precedence over all the other properties in the Archaius Composite Configuration.
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-archaius/additional-sources-simple/pom.xml b/spring-cloud/spring-cloud-archaius/additional-sources-simple/pom.xml
new file mode 100644
index 0000000000..1ae6d543fb
--- /dev/null
+++ b/spring-cloud/spring-cloud-archaius/additional-sources-simple/pom.xml
@@ -0,0 +1,24 @@
+
+
+ 4.0.0
+ additional-sources-simple
+ 1.0.0-SNAPSHOT
+ jar
+ additional-sources-simple
+
+
+ com.baeldung.spring.cloud
+ spring-cloud-archaius
+ 1.0.0-SNAPSHOT
+ ..
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
diff --git a/spring-cloud/spring-cloud-archaius/additional-sources-simple/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/AdditionalSourcesSimpleApplication.java b/spring-cloud/spring-cloud-archaius/additional-sources-simple/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/AdditionalSourcesSimpleApplication.java
new file mode 100644
index 0000000000..e1a1d106cf
--- /dev/null
+++ b/spring-cloud/spring-cloud-archaius/additional-sources-simple/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/AdditionalSourcesSimpleApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.spring.cloud.archaius.additionalsources;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class AdditionalSourcesSimpleApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(AdditionalSourcesSimpleApplication.class, args);
+ }
+
+}
diff --git a/spring-cloud/spring-cloud-archaius/additional-sources-simple/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/config/ApplicationPropertiesConfigurations.java b/spring-cloud/spring-cloud-archaius/additional-sources-simple/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/config/ApplicationPropertiesConfigurations.java
new file mode 100644
index 0000000000..f2d8ca2638
--- /dev/null
+++ b/spring-cloud/spring-cloud-archaius/additional-sources-simple/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/config/ApplicationPropertiesConfigurations.java
@@ -0,0 +1,21 @@
+package com.baeldung.spring.cloud.archaius.additionalsources.config;
+
+import org.apache.commons.configuration.AbstractConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.netflix.config.DynamicConfiguration;
+import com.netflix.config.FixedDelayPollingScheduler;
+import com.netflix.config.PolledConfigurationSource;
+import com.netflix.config.sources.URLConfigurationSource;
+
+@Configuration
+public class ApplicationPropertiesConfigurations {
+
+ @Bean
+ public AbstractConfiguration addApplicationPropertiesSource() {
+ PolledConfigurationSource source = new URLConfigurationSource("classpath:other-config.properties");
+ return new DynamicConfiguration(source, new FixedDelayPollingScheduler());
+ }
+
+}
diff --git a/spring-cloud/spring-cloud-archaius/additional-sources-simple/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/controller/ConfigPropertiesController.java b/spring-cloud/spring-cloud-archaius/additional-sources-simple/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/controller/ConfigPropertiesController.java
new file mode 100644
index 0000000000..304369a036
--- /dev/null
+++ b/spring-cloud/spring-cloud-archaius/additional-sources-simple/src/main/java/com/baeldung/spring/cloud/archaius/additionalsources/controller/ConfigPropertiesController.java
@@ -0,0 +1,37 @@
+package com.baeldung.spring.cloud.archaius.additionalsources.controller;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.netflix.config.DynamicPropertyFactory;
+import com.netflix.config.DynamicStringProperty;
+
+@RestController
+public class ConfigPropertiesController {
+
+ private DynamicStringProperty propertyOneWithDynamic = DynamicPropertyFactory.getInstance()
+ .getStringProperty("baeldung.archaius.properties.one", "not found!");
+
+ private DynamicStringProperty propertyTwoWithDynamic = DynamicPropertyFactory.getInstance()
+ .getStringProperty("baeldung.archaius.properties.two", "not found!");
+
+ private DynamicStringProperty propertyThreeWithDynamic = DynamicPropertyFactory.getInstance()
+ .getStringProperty("baeldung.archaius.properties.three", "not found!");
+
+ private DynamicStringProperty propertyFourWithDynamic = DynamicPropertyFactory.getInstance()
+ .getStringProperty("baeldung.archaius.properties.four", "not found!");
+
+ @GetMapping("/properties-from-dynamic")
+ public Map getPropertiesFromDynamic() {
+ Map properties = new HashMap<>();
+ properties.put(propertyOneWithDynamic.getName(), propertyOneWithDynamic.get());
+ properties.put(propertyTwoWithDynamic.getName(), propertyTwoWithDynamic.get());
+ properties.put(propertyThreeWithDynamic.getName(), propertyThreeWithDynamic.get());
+ properties.put(propertyFourWithDynamic.getName(), propertyFourWithDynamic.get());
+ return properties;
+ }
+}
diff --git a/spring-cloud/spring-cloud-archaius/additional-sources-simple/src/main/resources/application.properties b/spring-cloud/spring-cloud-archaius/additional-sources-simple/src/main/resources/application.properties
new file mode 100644
index 0000000000..bf55e89a27
--- /dev/null
+++ b/spring-cloud/spring-cloud-archaius/additional-sources-simple/src/main/resources/application.properties
@@ -0,0 +1,3 @@
+server.port=8082
+baeldung.archaius.properties.one=one FROM:application.properties
+baeldung.archaius.properties.two=two FROM:application.properties
diff --git a/spring-cloud/spring-cloud-archaius/additional-sources-simple/src/main/resources/config.properties b/spring-cloud/spring-cloud-archaius/additional-sources-simple/src/main/resources/config.properties
new file mode 100644
index 0000000000..b104c0c488
--- /dev/null
+++ b/spring-cloud/spring-cloud-archaius/additional-sources-simple/src/main/resources/config.properties
@@ -0,0 +1,2 @@
+baeldung.archaius.properties.one=one FROM:config.properties
+baeldung.archaius.properties.three=three FROM:config.properties
diff --git a/spring-cloud/spring-cloud-archaius/additional-sources-simple/src/main/resources/other-config.properties b/spring-cloud/spring-cloud-archaius/additional-sources-simple/src/main/resources/other-config.properties
new file mode 100644
index 0000000000..00fe8ff2aa
--- /dev/null
+++ b/spring-cloud/spring-cloud-archaius/additional-sources-simple/src/main/resources/other-config.properties
@@ -0,0 +1,2 @@
+baeldung.archaius.properties.one=one FROM:other-config.properties
+baeldung.archaius.properties.four=four FROM:other-config.properties
diff --git a/spring-cloud/spring-cloud-archaius/additional-sources-simple/src/test/java/com/baeldung/spring/cloud/archaius/additionalsources/ArchaiusAdditionalSourcesLiveTest.java b/spring-cloud/spring-cloud-archaius/additional-sources-simple/src/test/java/com/baeldung/spring/cloud/archaius/additionalsources/ArchaiusAdditionalSourcesLiveTest.java
new file mode 100644
index 0000000000..f3a345d869
--- /dev/null
+++ b/spring-cloud/spring-cloud-archaius/additional-sources-simple/src/test/java/com/baeldung/spring/cloud/archaius/additionalsources/ArchaiusAdditionalSourcesLiveTest.java
@@ -0,0 +1,54 @@
+package com.baeldung.spring.cloud.archaius.additionalsources;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.web.client.TestRestTemplate;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.HttpMethod;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class ArchaiusAdditionalSourcesLiveTest {
+
+ private static final String BASE_URL = "http://localhost:8082";
+
+ private static final String DYNAMIC_PROPERTIES_URL = "/properties-from-dynamic";
+ private static final Map EXPECTED_ARCHAIUS_PROPERTIES = createExpectedArchaiusProperties();
+
+ private static Map createExpectedArchaiusProperties() {
+ Map map = new HashMap<>();
+ map.put("baeldung.archaius.properties.one", "one FROM:other-config.properties");
+ map.put("baeldung.archaius.properties.two", "two FROM:application.properties");
+ map.put("baeldung.archaius.properties.three", "three FROM:config.properties");
+ map.put("baeldung.archaius.properties.four", "four FROM:other-config.properties");
+ return map;
+ }
+
+ @Autowired
+ ConfigurableApplicationContext context;
+
+ @Autowired
+ private TestRestTemplate template;
+
+ private Map exchangeAsMap(String uri, ParameterizedTypeReference