diff --git a/gateway-discovery-ambari/src/main/java/org/apache/hadoop/gateway/topology/discovery/ambari/AmbariClientCommon.java b/gateway-discovery-ambari/src/main/java/org/apache/hadoop/gateway/topology/discovery/ambari/AmbariClientCommon.java
index a2bf4ea..8e9dd26 100644
--- a/gateway-discovery-ambari/src/main/java/org/apache/hadoop/gateway/topology/discovery/ambari/AmbariClientCommon.java
+++ b/gateway-discovery-ambari/src/main/java/org/apache/hadoop/gateway/topology/discovery/ambari/AmbariClientCommon.java
@@ -53,10 +53,16 @@
 
     Map<String, Map<String, AmbariCluster.ServiceConfiguration>> getActiveServiceConfigurations(String clusterName,
                                                                                                 ServiceDiscoveryConfig config) {
-        return getActiveServiceConfigurations(config.getAddress(),
-                                              clusterName,
-                                              config.getUser(),
-                                              config.getPasswordAlias());
+        Map<String, Map<String, AmbariCluster.ServiceConfiguration>> activeConfigs = null;
+
+        if (config != null) {
+            activeConfigs = getActiveServiceConfigurations(config.getAddress(),
+                                                           clusterName,
+                                                           config.getUser(),
+                                                           config.getPasswordAlias());
+        }
+
+        return activeConfigs;
     }
 
 
diff --git a/gateway-discovery-ambari/src/main/java/org/apache/hadoop/gateway/topology/discovery/ambari/AmbariConfigurationMonitor.java b/gateway-discovery-ambari/src/main/java/org/apache/hadoop/gateway/topology/discovery/ambari/AmbariConfigurationMonitor.java
index e4b5e43..8a6d95b 100644
--- a/gateway-discovery-ambari/src/main/java/org/apache/hadoop/gateway/topology/discovery/ambari/AmbariConfigurationMonitor.java
+++ b/gateway-discovery-ambari/src/main/java/org/apache/hadoop/gateway/topology/discovery/ambari/AmbariConfigurationMonitor.java
@@ -115,8 +115,10 @@
             Collection<File> persistedConfigs = FileUtils.listFiles(persistenceDir, new String[]{"conf"}, false);
             for (File persisted : persistedConfigs) {
                 Properties props = new Properties();
+                FileInputStream in = null;
                 try {
-                    props.load(new FileInputStream(persisted));
+                    in = new FileInputStream(persisted);
+                    props.load(in);
 
                     addDiscoveryConfig(props.getProperty(PROP_CLUSTER_NAME), new ServiceDiscoveryConfig() {
                                                             public String getAddress() {
@@ -133,6 +135,14 @@
                                                         });
                 } catch (IOException e) {
                     log.failedToLoadClusterMonitorServiceDiscoveryConfig(getType(), e);
+                } finally {
+                    if (in != null) {
+                        try {
+                            in.close();
+                        } catch (IOException e) {
+                            //
+                        }
+                    }
                 }
             }
         }
@@ -145,11 +155,13 @@
     private void loadClusterVersionData() {
         File persistenceDir = getPersistenceDir();
         if (persistenceDir != null) {
-            Collection<File> persistedConfigs = FileUtils.listFiles(getPersistenceDir(), new String[]{"ver"}, false);
+            Collection<File> persistedConfigs = FileUtils.listFiles(persistenceDir, new String[]{"ver"}, false);
             for (File persisted : persistedConfigs) {
                 Properties props = new Properties();
+                FileInputStream in = null;
                 try {
-                    props.load(new FileInputStream(persisted));
+                    in = new FileInputStream(persisted);
+                    props.load(in);
 
                     String source = props.getProperty(PROP_CLUSTER_SOURCE);
                     String clusterName = props.getProperty(PROP_CLUSTER_NAME);
@@ -166,6 +178,14 @@
 
                 } catch (IOException e) {
                     log.failedToLoadClusterMonitorConfigVersions(getType(), e);
+                } finally {
+                    if (in != null) {
+                        try {
+                            in.close();
+                        } catch (IOException e) {
+                            //
+                        }
+                    }
                 }
             }
         }
@@ -207,10 +227,21 @@
     }
 
     private void persist(Properties props, File dest) {
+        FileOutputStream out = null;
         try {
-            props.store(new FileOutputStream(dest), PERSISTED_FILE_COMMENT);
+            out = new FileOutputStream(dest);
+            props.store(out, PERSISTED_FILE_COMMENT);
+            out.flush();
         } catch (Exception e) {
             log.failedToPersistClusterMonitorData(getType(), dest.getAbsolutePath(), e);
+        } finally {
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (IOException e) {
+                    //
+                }
+            }
         }
     }
 
@@ -433,12 +464,15 @@
     Map<String, String> getUpdatedConfigVersions(String address, String clusterName) {
         Map<String, String> configVersions = new HashMap<>();
 
-        Map<String, Map<String, AmbariCluster.ServiceConfiguration>> serviceConfigs =
-                    ambariClient.getActiveServiceConfigurations(clusterName, getDiscoveryConfig(address, clusterName));
+        ServiceDiscoveryConfig sdc = getDiscoveryConfig(address, clusterName);
+        if (sdc != null) {
+            Map<String, Map<String, AmbariCluster.ServiceConfiguration>> serviceConfigs =
+                                                       ambariClient.getActiveServiceConfigurations(clusterName, sdc);
 
-        for (Map<String, AmbariCluster.ServiceConfiguration> serviceConfig : serviceConfigs.values()) {
-            for (AmbariCluster.ServiceConfiguration config : serviceConfig.values()) {
-                configVersions.put(config.getType(), config.getVersion());
+            for (Map<String, AmbariCluster.ServiceConfiguration> serviceConfig : serviceConfigs.values()) {
+                for (AmbariCluster.ServiceConfiguration config : serviceConfig.values()) {
+                    configVersions.put(config.getType(), config.getVersion());
+                }
             }
         }
 
