eventTransformations = loadEventTransformations();
     }
 
-    public void reloadProperties() {
+    /**
+     * Reload application settings.
+     */
+    public void reload() {
         try {
             properties.load(configurationFileLocation);
             properties.refresh();
 
 import java.nio.file.Paths;
 import java.time.Duration;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.locks.ReentrantLock;
 
 @SpringBootApplication(exclude = {GsonAutoConfiguration.class, SecurityAutoConfiguration.class})
 public class VesApplication {
     private static ConfigUpdater configUpdater;
     private static DMaaPEventPublisher eventPublisher;
     private static ApplicationConfigurationListener applicationConfigurationListener;
+    private static ReentrantLock applicationLock = new ReentrantLock();
 
     public static void main(String[] args) {
+        applicationLock.lock();
+        try {
+            startApplication(args);
+            startListeningForApplicationConfigurationStoredInConsul();
+        } finally {
+            applicationLock.unlock();
+        }
+    }
+
+    private static void startApplication(String[] args) {
         SpringApplication app = new SpringApplication(VesApplication.class);
         applicationSettings = new ApplicationSettings(args, CLIUtils::processCmdLine);
-        init();
-
-        applicationConfigurationListener = startListeningForApplicationConfigurationStoredInConsul();
-
+        configUpdater = ConfigUpdaterFactory.create(
+                applicationSettings.configurationFileLocation(),
+                Paths.get(applicationSettings.dMaaPConfigurationFileLocation()));
+        eventPublisher = new DMaaPEventPublisher(getDmaapConfig());
         app.setAddCommandLineProperties(true);
         context = app.run();
     }
 
     public static void restartApplication() {
         Thread thread = new Thread(() -> {
-            context.close();
-            applicationSettings.reloadProperties();
-            applicationConfigurationListener.reload(Duration.ofMinutes(applicationSettings.configurationUpdateFrequency()));
-            init();
-            context = SpringApplication.run(VesApplication.class);
+            try {
+                applicationLock.lock();
+                reloadApplicationResources();
+                reloadSpringContext();
+            } finally {
+                applicationLock.unlock();
+            }
         });
         thread.setDaemon(false);
         thread.start();
     }
 
-    private static void init() {
-        configUpdater = ConfigUpdaterFactory.create(
-                applicationSettings.configurationFileLocation(),
+    private static void reloadApplicationResources() {
+        applicationSettings.reload();
+        eventPublisher.reload(getDmaapConfig());
+        configUpdater.setPaths(applicationSettings.configurationFileLocation(),
                 Paths.get(applicationSettings.dMaaPConfigurationFileLocation()));
-        eventPublisher = new DMaaPEventPublisher(getDmaapConfig());
+        applicationConfigurationListener.reload(Duration.ofMinutes(applicationSettings.configurationUpdateFrequency()));
     }
 
-    private static ApplicationConfigurationListener startListeningForApplicationConfigurationStoredInConsul() {
+    private static void reloadSpringContext() {
+        context.close();
+        context = SpringApplication.run(VesApplication.class);
+    }
+
+    private static void startListeningForApplicationConfigurationStoredInConsul() {
         ConfigurationHandler cbsHandler = new ConfigurationHandler(new CbsClientConfigurationProvider(), configUpdater);
         ApplicationConfigurationListener applicationConfigProvider = new ApplicationConfigurationListener(Duration.ofMinutes(DEFAULT_CONFIGURATION_FETCH_PERIOD), cbsHandler);
 
         ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1);
         scheduledThreadPoolExecutor.execute(applicationConfigProvider);
-
-        return applicationConfigProvider;
+        applicationConfigurationListener = applicationConfigProvider;
     }
 
     private static Map<String, PublisherConfig> getDmaapConfig() {
 
 public class DMaaPEventPublisher {
     private static final int PENDING_MESSAGE_LOG_THRESHOLD = 100;
     private static final Logger log = LoggerFactory.getLogger(DMaaPEventPublisher.class);
-    private final DMaaPPublishersCache publishersCache;
+    private DMaaPPublishersCache publishersCache;
     private final Logger outputLogger = LoggerFactory.getLogger("org.onap.dcae.common.output");
 
     DMaaPEventPublisher(DMaaPPublishersCache publishersCache) {
         this(new DMaaPPublishersCache(dMaaPConfig));
     }
 
+    /**
+     * Reload Dmaap configuration
+     * @param dmaapConfiguration Dmaap configuration
+     */
+    public void reload(Map<String, PublisherConfig> dmaapConfiguration){
+        this.publishersCache = new DMaaPPublishersCache(dmaapConfiguration);
+    }
+
     public void sendEvent(VesEvent vesEvent, String dmaapId){
         clearVesUniqueIdFromEvent(vesEvent);
         publishersCache.getPublisher(dmaapId)
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-class ConfigFilesFacade {
+/**
+ * ConfigFilesFacade is used for reading and writing application properties and dmaap configuration.
+ */
+public class ConfigFilesFacade {
 
     private static final Logger log = LoggerFactory.getLogger(ConfigFilesFacade.class);
 
-    private final Path dMaaPConfigPath;
-    private final Path propertiesPath;
+    private Path dmaapConfigPath;
+    private Path propertiesPath;
 
     ConfigFilesFacade(Path propertiesPath, Path dMaaPConfigPath) {
         this.propertiesPath = propertiesPath;
-        this.dMaaPConfigPath = dMaaPConfigPath;
+        this.dmaapConfigPath = dMaaPConfigPath;
+    }
+
+    /**
+     * Set new paths
+     * @param propertiesFile application property file
+     * @param dmaapConfigFile dmaap configuration file
+     */
+    public void setPaths(Path propertiesFile, Path dmaapConfigFile) {
+        this.propertiesPath = propertiesFile;
+        this.dmaapConfigPath = dmaapConfigFile;
     }
 
     Try<Map<String, String>> readCollectorProperties() {
     }
 
     Try<JSONObject> readDMaaPConfiguration() {
-        log.info(f("Reading DMaaP configuration from file: '%s'", dMaaPConfigPath));
-        return readFile(dMaaPConfigPath)
+        log.info(f("Reading DMaaP configuration from file: '%s'", dmaapConfigPath));
+        return readFile(dmaapConfigPath)
             .recover(FileNotFoundException.class, __ -> "{}")
-            .mapFailure(enhanceError("Unable to read DMaaP configuration from file '%s'", dMaaPConfigPath))
+            .mapFailure(enhanceError("Unable to read DMaaP configuration from file '%s'", dmaapConfigPath))
             .flatMap(Conversions::toJson)
             .onFailure(logError(log))
             .peek(props -> log.info(f("Read following DMaaP properties: '%s'", props)));
     }
 
     Try<Void> writeDMaaPConfiguration(JSONObject dMaaPConfiguration) {
-        log.info(f("Writing DMaaP configuration '%s' into file '%s'", dMaaPConfiguration, dMaaPConfigPath));
-        return writeFile(dMaaPConfigPath, indentConfiguration(dMaaPConfiguration.toString()))
-            .mapFailure(enhanceError("Could not save new DMaaP configuration to path '%s'", dMaaPConfigPath))
+        log.info(f("Writing DMaaP configuration '%s' into file '%s'", dMaaPConfiguration, dmaapConfigPath));
+        return writeFile(dmaapConfigPath, indentConfiguration(dMaaPConfiguration.toString()))
+            .mapFailure(enhanceError("Could not save new DMaaP configuration to path '%s'", dmaapConfigPath))
             .onFailure(logError(log))
             .peek(__ -> log.info("Written successfully"));
     }
     private String indentConfiguration(String configuration) {
         return new JSONObject(configuration).toString(4);
     }
-}
\ No newline at end of file
+}
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.nio.file.Path;
+
 public class ConfigUpdater {
 
     private static final Logger log = LoggerFactory.getLogger(ConfigUpdater.class);
         this.isApplicationRestartNeeded = false;
     }
 
+    /**
+     * Set new paths
+     * @param propertiesFile application property file
+     * @param dmaapConfigFile dmaap configuration file
+     */
+    public void setPaths(Path propertiesFile, Path dmaapConfigFile){
+        this.configFilesFacade.setPaths(propertiesFile, dmaapConfigFile);
+
+    }
     public synchronized void updateConfig(Option<JSONObject> appConfig) {
         appConfig.peek(this::handleUpdate).onEmpty(logSkipMessage());
     }