You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ab...@apache.org on 2015/08/03 11:30:35 UTC

[3/3] ambari git commit: AMBARI-12618 Service config pages load too slowly. (ababiichuk)

AMBARI-12618 Service config pages load too slowly. (ababiichuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/9582cc0a
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/9582cc0a
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/9582cc0a

Branch: refs/heads/branch-2.1
Commit: 9582cc0a7f5f527aa9f9dd2521c7ce8a48fc26ac
Parents: 1b3f6f7
Author: aBabiichuk <ab...@cybervisiontech.com>
Authored: Mon Aug 3 12:25:11 2015 +0300
Committer: aBabiichuk <ab...@cybervisiontech.com>
Committed: Mon Aug 3 12:25:11 2015 +0300

----------------------------------------------------------------------
 .../controllers/global/cluster_controller.js    |   4 +-
 .../main/admin/kerberos/step2_controller.js     |  14 +-
 .../main/admin/kerberos/wizard_controller.js    |  24 +-
 .../main/admin/serviceAccounts_controller.js    |  19 +-
 .../controllers/main/service/info/configs.js    | 287 +-----
 ambari-web/app/controllers/wizard.js            |  74 +-
 .../app/controllers/wizard/step7_controller.js  | 117 +--
 ambari-web/app/data/HDP2.3/site_properties.js   |   8 +-
 ambari-web/app/data/host_component_mapping.js   | 142 +++
 .../configs/stack_config_properties_mapper.js   |  42 +-
 ambari-web/app/mappers/configs/themes_mapper.js |   2 +-
 .../app/mixins/common/configs/configs_saver.js  |   2 +
 .../mixins/common/configs/enhanced_configs.js   |  10 +-
 .../main/service/configs/config_overridable.js  |  12 +-
 .../app/models/configs/stack_config_property.js |   9 +-
 ambari-web/app/routes/add_service_routes.js     |   1 -
 ambari-web/app/routes/installer.js              |   5 +-
 ambari-web/app/utils/ajax/ajax.js               |   5 +
 ambari-web/app/utils/config.js                  | 992 ++++++-------------
 .../app/views/common/configs/services_config.js |   4 +-
 ambari-web/app/views/common/controls_view.js    |   2 +-
 .../common/modal_popups/select_groups_popup.js  |   6 +-
 .../views/main/admin/serviceAccounts_view.js    |   5 +-
 .../main/service/info/config_test.js            |  93 +-
 .../test/controllers/wizard/step7_test.js       |  37 +-
 ambari-web/test/controllers/wizard_test.js      |  43 -
 ambari-web/test/utils/config_test.js            | 863 ++++++++--------
 27 files changed, 1071 insertions(+), 1751 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/controllers/global/cluster_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/global/cluster_controller.js b/ambari-web/app/controllers/global/cluster_controller.js
index e4a74c0..b9d9711 100644
--- a/ambari-web/app/controllers/global/cluster_controller.js
+++ b/ambari-web/app/controllers/global/cluster_controller.js
@@ -216,7 +216,9 @@ App.ClusterController = Em.Controller.extend({
       updater.updateServices(function () {
         self.updateLoadStatus('services');
         App.config.loadConfigsFromStack(App.Service.find().mapProperty('serviceName')).complete(function () {
-          self.set('isConfigsPropertiesLoaded', true);
+          App.config.loadClusterConfigsFromStack().complete(function() {
+            self.set('isConfigsPropertiesLoaded', true);
+          });
         });
         // service metrics loading doesn't affect overall progress
         updater.updateServiceMetric(function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/controllers/main/admin/kerberos/step2_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/kerberos/step2_controller.js b/ambari-web/app/controllers/main/admin/kerberos/step2_controller.js
index 332da6a..083e0c0 100644
--- a/ambari-web/app/controllers/main/admin/kerberos/step2_controller.js
+++ b/ambari-web/app/controllers/main/admin/kerberos/step2_controller.js
@@ -72,6 +72,10 @@ App.KerberosWizardStep2Controller = App.WizardStep7Controller.extend({
   },
 
 
+  isConfigsLoaded: function () {
+    return this.get('wizardController.stackConfigsLoaded');
+  }.property('wizardController.stackConfigsLoaded'),
+
   /**
    * On load function
    * @method loadStep
@@ -82,18 +86,12 @@ App.KerberosWizardStep2Controller = App.WizardStep7Controller.extend({
       return;
     }
     this.clearStep();
-    //STEP 1: Load advanced configs
-    var advancedConfigs = this.get('content.advancedServiceConfig');
     //STEP 2: Load on-site configs by service from local DB
     var storedConfigs = this.get('content.serviceConfigProperties');
     //STEP 3: Merge pre-defined configs with loaded on-site configs
-    this.set('configs', App.config.mergePreDefinedWithStored(
-      storedConfigs,
-      advancedConfigs,
-      this.get('selectedServiceNames')));
+    this.set('configs', App.config.mergePreDefinedWithStack(this.get('selectedServiceNames')));
     App.config.setPreDefinedServiceConfigs(this.get('addMiscTabToPage'));
-    //STEP 4: Add advanced configs
-    App.config.addAdvancedConfigs(this.get('configs'), advancedConfigs);
+
     this.filterConfigs(this.get('configs'));
     this.applyServicesConfigs(this.get('configs'), storedConfigs);
   },

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js b/ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js
index e66d6c7..5096602 100644
--- a/ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js
+++ b/ambari-web/app/controllers/main/admin/kerberos/wizard_controller.js
@@ -30,6 +30,7 @@ App.KerberosWizardController = App.WizardController.extend({
 
   isKerberosWizard: true,
 
+  stackConfigsLoaded: false,
   /**
    * Used for hiding back button in wizard
    */
@@ -153,21 +154,6 @@ App.KerberosWizardController = App.WizardController.extend({
     this.set('content.serviceConfigProperties', serviceConfigProperties);
   },
 
-  /**
-   * load advanced configs from server
-   */
-  loadAdvancedConfigs: function (dependentController) {
-    var self = this;
-    var loadAdvancedConfigResult = [];
-    dependentController.set('isAdvancedConfigLoaded', false);
-    var serviceName = this.get('content.serviceName');
-    App.config.loadAdvancedConfig(serviceName, function (properties) {
-      loadAdvancedConfigResult.pushObjects(properties);
-      self.set('content.advancedServiceConfig', loadAdvancedConfigResult);
-      dependentController.set('isAdvancedConfigLoaded', true);
-    });
-  },
-
   loadKerberosDescriptorConfigs: function () {
     var kerberosDescriptorConfigs = this.getDBProperty('kerberosDescriptorConfigs');
     this.set('kerberosDescriptorConfigs', kerberosDescriptorConfigs);
@@ -268,9 +254,13 @@ App.KerberosWizardController = App.WizardController.extend({
       {
         type: 'sync',
         callback: function () {
-          var kerberosStep2controller = App.get('router.kerberosWizardStep2Controller');
-          this.loadAdvancedConfigs(kerberosStep2controller);
+          var self = this;
           this.loadServiceConfigProperties();
+          if (!this.get('stackConfigsLoaded')) {
+            App.config.loadConfigsFromStack(['KERBEROS']).complete(function() {
+              self.set('stackConfigsLoaded', true);
+            }, this);
+          }
         }
       }
     ],

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/controllers/main/admin/serviceAccounts_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/serviceAccounts_controller.js b/ambari-web/app/controllers/main/admin/serviceAccounts_controller.js
index 3fcb1df..8629d67 100644
--- a/ambari-web/app/controllers/main/admin/serviceAccounts_controller.js
+++ b/ambari-web/app/controllers/main/admin/serviceAccounts_controller.js
@@ -45,9 +45,7 @@ App.MainAdminServiceAccountsController = App.MainServiceInfoConfigsController.ex
   },
   loadServiceTagSuccess: function (data, opt, params) {
     var self = this;
-    var installedServices = App.Service.find().mapProperty("serviceName");
     var serviceConfigsDef = params.serviceConfigsDef;
-    var serviceName = this.get('selectedService');
     var loadedClusterSiteToTagMap = {};
 
     for (var site in Em.get(data, 'Clusters.desired_configs')) {
@@ -58,15 +56,7 @@ App.MainAdminServiceAccountsController = App.MainServiceInfoConfigsController.ex
     this.setServiceConfigTags(loadedClusterSiteToTagMap);
     // load server stored configurations
     App.router.get('configurationController').getConfigsByTags(this.get('serviceConfigTags')).done(function (serverConfigs) {
-      // load configurations list for installed services
-      App.config.loadAdvancedConfigPartial(installedServices, {
-        queryFilter: 'configurations/StackConfigurations/property_type.matches(.*[USER,GROUP].*)'
-      }, function(advancedConfigs) {
-        // load cluster configs
-        App.config.loadClusterConfig(function(clusterConfigs) {
-          self.createConfigObject(serverConfigs, advancedConfigs.concat(clusterConfigs));
-        });
-      });
+      self.createConfigObject(serverConfigs);
     });
   },
 
@@ -111,11 +101,10 @@ App.MainAdminServiceAccountsController = App.MainServiceInfoConfigsController.ex
    * Generate configuration object that will be rendered
    *
    * @param {Object[]} serverConfigs
-   * @param {Object[]} advancedConfigs
    */
-  createConfigObject: function(serverConfigs, advancedConfigs) {
-    var configSet = App.config.mergePreDefinedWithLoaded(serverConfigs, advancedConfigs, this.get('serviceConfigTags'), this.get('selectedService'));
-    var miscConfigs = configSet.configs.filterProperty('serviceName', this.get('selectedService')).filterProperty('category', 'Users and Groups').filterProperty('isVisible', true).rejectProperty('displayType', 'password').rejectProperty('displayType', 'checkbox');
+  createConfigObject: function(serverConfigs) {
+    var configs = App.config.mergePredefinedWithSaved(serverConfigs, this.get('selectedService'));
+    var miscConfigs = configs.filterProperty('displayType', 'user').filterProperty('category', 'Users and Groups').filterProperty('isVisible', true);
 
     miscConfigs = App.config.miscConfigVisibleProperty(miscConfigs, App.Service.find().mapProperty('serviceName').concat('MISC'));
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/controllers/main/service/info/configs.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/service/info/configs.js b/ambari-web/app/controllers/main/service/info/configs.js
index ce06786..ca2500f 100644
--- a/ambari-web/app/controllers/main/service/info/configs.js
+++ b/ambari-web/app/controllers/main/service/info/configs.js
@@ -106,16 +106,6 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
   }.property('content.serviceName', 'dependentServiceNames'),
 
   /**
-   * configs from stack for dependent services
-   * @type {App.StackConfigProperty[]}
-   */
-  advancedConfigs: function() {
-    return App.StackConfigProperty.find().filter(function(scp) {
-      return this.get('servicesToLoad').contains(scp.get('serviceName'));
-    }, this);
-  }.property('content.serviceName', 'App.router.clusterController.isStackConfigsLoaded'),
-
-  /**
    * @type {boolean}
    */
   isCurrentSelected: function () {
@@ -134,10 +124,6 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
     return App.config.get('preDefinedServiceConfigs');
   }.property('App.config.preDefinedServiceConfigs'),
 
-  configMapping: function () {
-    return App.config.get('configMapping');
-  }.property('App.config.configMapping'),
-
   configs: function () {
     return  App.config.get('preDefinedSiteProperties');
   }.property('App.config.preDefinedSiteProperties'),
@@ -213,6 +199,20 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
   ],
 
   /**
+   * get array of config proerties that are shown in settings tab
+   * @type {App.StackConfigProperty[]}
+   */
+  settingsTabProperties: function() {
+    var properties = [];
+    App.Tab.find(this.get('content.serviceName') + '_settings').get('sections').forEach(function(s) {
+      s.get('subSections').forEach(function(ss) {
+        properties = properties.concat(ss.get('configProperties').filterProperty('id'));
+      });
+    });
+    return properties;
+  }.property('content.serviceName', 'App.router.clusterController.isStackConfigsLoaded'),
+
+  /**
    * Dropdown menu items in filter combobox
    * @type {{attributeName: string, attributeValue: string, name: string, selected: boolean}[]}
    */
@@ -366,8 +366,8 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
         });
       }
     });
-    var configs = App.config.mergePredefinedWithSaved(configGroups, this.get('advancedConfigs'), serviceName, this.get('selectedConfigGroup'), this.get('canEdit'));
-    configs = App.config.syncOrderWithPredefined(configs);
+    var configs = App.config.mergePredefinedWithSaved(configGroups, serviceName, this.get('selectedConfigGroup'), this.get('canEdit'));
+    configs = App.config.sortConfigs(configs);
     /**
      * if property defined in stack but somehow it missed from cluster properties (can be after stack upgrade)
      * ui should add this properties to step configs
@@ -376,7 +376,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
 
     //put properties from capacity-scheduler.xml into one config with textarea view
     if (this.get('content.serviceName') === 'YARN') {
-      var configsToSkip = this.get('advancedConfigs').filterProperty('filename', 'capacity-scheduler.xml').filterProperty('subSection');
+      var configsToSkip = this.get('settingsTabProperties').filterProperty('filename', 'capacity-scheduler.xml');
       configs = App.config.fileConfigsIntoTextarea(configs, 'capacity-scheduler.xml', configsToSkip);
     }
 
@@ -386,9 +386,10 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
         configs.findProperty('name', 'kdc_host').set('isRequired', false).set('isVisible', false);
         configs.findProperty('name', 'admin_server_host').set('isRequired', false).set('isVisible', false);
         configs.findProperty('name', 'domains').set('isRequired', false).set('isVisible', false);
+      } else if (kdc_type.get('value') === 'active-directory') {
+        configs.findProperty('name', 'container_dn').set('isVisible', true);
+        configs.findProperty('name', 'ldap_url').set('isVisible', true);
       }
-
-      kdc_type.set('value', App.router.get('mainAdminKerberosController.kdcTypesValues')[kdc_type.get('value')]);
     }
 
     this.set('allConfigs', configs);
@@ -397,26 +398,6 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
   },
 
   /**
-   * revert certain config values to their innital value
-   * i.e. don't save the KDC Type as "Existing MIT KDC", instead save it as mit-kdc
-   */
-  configValueRevert: function () {
-    var stepConfigs = this.get('stepConfigs').findProperty('serviceName', this.get('content.serviceName'));
-    if (!stepConfigs) { return; }
-
-    var configs = stepConfigs.configs;
-    if (configs) {
-      var kdc_type = configs.findProperty('name', 'kdc_type');
-
-      if (!kdc_type) { return; };
-      if (App.router.get('mainAdminKerberosController.kdcTypesValues')[kdc_type.get('value')]) { return; }
-
-      kdc_type.set('value', kdc_type.get('savedValue'));
-    }
-
-  }.observes('saveInProgress'),
-
-  /**
    * adds properties form stack that doesn't belong to cluster
    * to step configs
    * also set recommended value if isn't exists
@@ -424,14 +405,9 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
    * @return {App.ServiceConfigProperty[]}
    * @method mergeWithStackProperties
    */
-  mergeWithStackProperties: function(configs) {
-    this.get('advancedConfigs').forEach(function(advanced) {
-      var c = configs.findProperty('name', advanced.get('name'));
-      if (c) {
-        if (!c.get('recommendedValue')) {
-          c.set('recommendedValue', advanced.get('value'));
-        }
-      } else if (advanced.get('widget')) {
+  mergeWithStackProperties: function (configs) {
+    this.get('settingsTabProperties').forEach(function (advanced) {
+      if (!configs.someProperty('name', advanced.get('name'))) {
         configs.pushObject(App.ServiceConfigProperty.create({
           name: advanced.get('name'),
           displayName: advanced.get('displayName'),
@@ -467,12 +443,14 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
 
             if (serviceConfig) {
               if (self.get('selectedConfigGroup.isDefault') || configGroup.get('name') == self.get('selectedConfigGroup.name')) {
-                var override = self.createNewSCP({"value": value, "isFinal": isFinal, "group": configGroup}, serviceConfig, self.get('selectedConfigGroup.isDefault'));
-                override.set('isEditable', self.get('canEdit') && configGroup.get('name') == self.get('selectedConfigGroup.name'));
-                if (!serviceConfig.get('overrides')) serviceConfig.set('overrides', []);
-                serviceConfig.get('overrides').pushObject(override);
-                serviceConfig.set('overrideValues', serviceConfig.get('overrides').mapProperty('value'));
-                serviceConfig.set('overrideIsFinalValues', serviceConfig.get('overrides').mapProperty('isFinal'));
+                var overridePlainObject = {
+                  "value": value,
+                  "savedValue": value,
+                  "isFinal": isFinal,
+                  "savedIsFinal": isFinal,
+                  "isEditable": self.get('canEdit') && configGroup.get('name') == self.get('selectedConfigGroup.name')
+                };
+                App.config.createOverride(serviceConfig, overridePlainObject, configGroup);
               }
             } else {
               var isEditable = self.get('canEdit') && configGroup.get('name') == self.get('selectedConfigGroup.name');
@@ -630,187 +608,33 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
   },
 
   /**
-   * trigger addOverrideProperty
-   * @param {Object[]} configs
+   * trigger App.config.createOverride
+   * @param {Object[]} stepConfig
    * @private
    * @method checkOverrideProperty
    */
-  checkOverrideProperty: function (componentConfig) {
+  checkOverrideProperty: function (stepConfig) {
     var overrideToAdd = this.get('overrideToAdd');
-    var value = Em.get(overrideToAdd, 'value');
-    var isEnhanced = !!this.get('overrideToAdd.widget');
+    var value = !!this.get('overrideToAdd.widget') ? Em.get(overrideToAdd, 'value') : '';
     if (overrideToAdd) {
-      overrideToAdd = componentConfig.configs.filter(function(c){
+      overrideToAdd = stepConfig.configs.filter(function(c){
         return c.name == overrideToAdd.name && c.filename == overrideToAdd.filename;
       });
       if (overrideToAdd[0]) {
-        this.addOverrideProperty(overrideToAdd[0], this.get('selectedConfigGroup'), isEnhanced ? value : null);
+        App.config.createOverride(overrideToAdd[0], {"isEditable": true, "value": value}, this.get('selectedConfigGroup'));
         this.set('overrideToAdd', null);
       }
     }
   },
 
   /**
-   * create new overridden property and set appropriate fields
-   * @param override
-   * @param serviceConfigProperty
-   * @param defaultGroupSelected
-   * @returns {*}
-   * @private
-   * @method createNewSCP
-   */
-  createNewSCP: function (override, serviceConfigProperty, defaultGroupSelected) {
-    var newSCP = App.ServiceConfigProperty.create(serviceConfigProperty, {
-      value: Em.get(override, 'value'),
-      savedValue: Em.get(override, 'value'),
-      recommendedValue: serviceConfigProperty.get('recommendedValue'),
-      isFinal: Em.get(override, 'isFinal'),
-      savedIsFinal: Em.get(override, 'isFinal'),
-      recommendedIsFinal: serviceConfigProperty.get('recommendedIsFinal'),
-      group: Em.get(override, 'group'),
-      supportsFinal: serviceConfigProperty.get('supportsFinal'),
-      isOriginalSCP: false,
-      parentSCP: serviceConfigProperty,
-      overrides: null
-    });
-    if (defaultGroupSelected) {
-      newSCP.set('isEditable', false);
-    }
-    newSCP.validate();
-    return newSCP;
-  },
-
-  /**
-   * Array of Objects
-   * {
-   *  hostProperty - hostName property name for current component
-   *  componentName - master componentName
-   *  serviceName - serviceName of component
-   *  serviceUseThis - services that use hostname property of component(componentName)
-   *  m(multiple) - true if can be more than one components installed on cluster
-   * }
-   */
-
-  hostComponentsMapping: [
-    {
-      hostProperty: 'snamenode_host',
-      componentName: 'SECONDARY_NAMENODE',
-      serviceName: 'HDFS',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'jobtracker_host',
-      componentName: 'JOBTRACKER',
-      serviceName: 'MAPREDUCE2',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'hs_host',
-      componentName: 'HISTORYSERVER',
-      serviceName: 'MAPREDUCE2',
-      serviceUseThis: ['YARN']
-    },
-    {
-      hostProperty: 'ats_host',
-      componentName: 'APP_TIMELINE_SERVER',
-      serviceName: 'YARN',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'rm_host',
-      componentName: 'RESOURCEMANAGER',
-      serviceName: 'YARN',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'hivemetastore_host',
-      componentName: 'HIVE_METASTORE',
-      serviceName: 'HIVE',
-      serviceUseThis: ['HIVE'],
-      m: true
-    },
-    {
-      hostProperty: 'hive_ambari_host',
-      componentName: 'HIVE_SERVER',
-      serviceName: 'HIVE',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'oozieserver_host',
-      componentName: 'OOZIE_SERVER',
-      serviceName: 'OOZIE',
-      serviceUseThis: [],
-      m: true
-    },
-    {
-      hostProperty: 'oozie_ambari_host',
-      componentName: 'OOZIE_SERVER',
-      serviceName: 'OOZIE',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'hbasemaster_host',
-      componentName: 'HBASE_MASTER',
-      serviceName: 'HBASE',
-      serviceUseThis: [],
-      m: true
-    },
-    {
-      hostProperty: 'webhcatserver_host',
-      componentName: 'WEBHCAT_SERVER',
-      serviceName: 'HIVE',
-      serviceUseThis: [],
-      m: true
-    },
-    {
-      hostProperty: 'zookeeperserver_hosts',
-      componentName: 'ZOOKEEPER_SERVER',
-      serviceName: 'ZOOKEEPER',
-      serviceUseThis: ['HBASE', 'HIVE'],
-      m: true
-    },
-    {
-      hostProperty: 'stormuiserver_host',
-      componentName: 'STORM_UI_SERVER',
-      serviceName: 'STORM',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'drpcserver_host',
-      componentName: 'DRPC_SERVER',
-      serviceName: 'STORM',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'storm_rest_api_host',
-      componentName: 'STORM_REST_API',
-      serviceName: 'STORM',
-      serviceUseThis: []
-    },
-    {
-      hostProperty: 'supervisor_hosts',
-      componentName: 'SUPERVISOR',
-      serviceName: 'STORM',
-      serviceUseThis: [],
-      m: true
-    },
-    {
-      hostProperty: 'rangerserver_host',
-      componentName: 'RANGER_ADMIN',
-      serviceName: 'RANGER',
-      serviceUseThis: [],
-      m: true
-    }
-  ],
-
-  /**
    * Adds host name of master component to config
    * @private
    * @method addHostNamesToGlobalConfig
    */
   addHostNamesToConfig: function () {
     var serviceName = this.get('content.serviceName');
-    var configs = this.get('allConfigs');
+    var hostComponentMapping = require('data/host_component_mapping');
     //namenode_host is required to derive "fs.default.name" a property of core-site
     try {
       this.setHostForService('HDFS', 'NAMENODE', 'namenode_host', true);
@@ -818,7 +642,7 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
       console.log("No NameNode Host available.  This is expected if you're using GLUSTERFS rather than HDFS.");
     }
 
-    var hostProperties = this.get('hostComponentsMapping').filter(function (h) {
+    var hostProperties = hostComponentMapping.filter(function (h) {
       return h.serviceUseThis.contains(serviceName) || h.serviceName == serviceName;
     });
     hostProperties.forEach(function (h) {
@@ -961,39 +785,6 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.ConfigsLoader, A
   },
 
   /**
-   * add new overridden property to config property object
-   * @param {object} serviceConfigProperty - config property object
-   * @param {App.ConfigGroup} group - config group for new property
-   * @param {String} value
-   * @param {boolean} isNotSaved TODO
-   * @method addOverrideProperty
-   */
-  addOverrideProperty: function (serviceConfigProperty, group, value, isNotSaved) {
-    if (serviceConfigProperty.get('isOriginalSCP')) {
-      var overrides = serviceConfigProperty.get('overrides');
-      if (!overrides) {
-        overrides = [];
-        serviceConfigProperty.set('overrides', overrides);
-      }
-      // create new override with new value
-      var newSCP = App.ServiceConfigProperty.create(serviceConfigProperty, {
-        value: value || '',
-        recommendedValue: serviceConfigProperty.get('recommendedValue'),
-        recommendedIsFinal: serviceConfigProperty.get('recommendedIsFinal'),
-        isOriginalSCP: false,
-        parentSCP: serviceConfigProperty,
-        isEditable: true,
-        group: group,
-        overrides: null,
-        isNotSaved: isNotSaved
-      });
-      console.debug("createOverrideProperty(): Added:", newSCP, " to main-property:", serviceConfigProperty);
-      newSCP.validate();
-      overrides.pushObject(newSCP);
-    }
-  },
-
-  /**
    * trigger manageConfigurationGroups
    * @method manageConfigurationGroup
    */

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/controllers/wizard.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard.js b/ambari-web/app/controllers/wizard.js
index c34cad9..0cc8e74 100644
--- a/ambari-web/app/controllers/wizard.js
+++ b/ambari-web/app/controllers/wizard.js
@@ -833,43 +833,6 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, App.ThemesMappingM
   },
 
   /**
-   * load advanced configs from server
-   */
-  loadAdvancedConfigs: function (dependentController) {
-    var self = this;
-    var loadServiceConfigsFn = function (clusterProperties) {
-      var stackServices = self.get('content.services').filter(function (service) {
-        return service.get('isInstalled') || service.get('isSelected');
-      });
-      var loadAdvancedConfigResult = [];
-      dependentController.set('isAdvancedConfigLoaded', false);
-
-      App.config.loadAdvancedConfigAll(stackServices.mapProperty('serviceName'), function (configMap) {
-        stackServices.forEach(function (service) {
-          var serviceName = service.get('serviceName');
-          var properties = configMap[serviceName];
-          var supportsFinal = App.config.getConfigTypesInfoFromService(service).supportsFinal;
-
-          properties.forEach(function (property) {
-            property.supportsFinal = Boolean(supportsFinal.find(function (configType) {
-              return property.filename.startsWith(configType);
-            }));
-            if (property.serviceName == 'MISC' && property.name == 'yarn_user') {
-               property.supportsFinal = false;
-            }
-          });
-          loadAdvancedConfigResult.pushObjects(properties);
-        });
-        loadAdvancedConfigResult.pushObjects(clusterProperties);
-        self.set('content.advancedServiceConfig', loadAdvancedConfigResult);
-        dependentController.set('isAdvancedConfigLoaded', true);
-      });
-    };
-    App.config.loadClusterConfig(loadServiceConfigsFn);
-  },
-
-
-  /**
    * Load serviceConfigProperties to model
    */
   loadServiceConfigProperties: function () {
@@ -891,29 +854,8 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, App.ThemesMappingM
       }
 
       _content.get('configs').forEach(function (_configProperties) {
-        var configProperty = {
-          id: _configProperties.get('id'),
-          name: _configProperties.get('name'),
-          displayName: _configProperties.get('displayName'),
-          value: _configProperties.get('value'),
-          savedValue: _configProperties.get('savedValue'),
-          recommendedValue: _configProperties.get('recommendedValue'),
-          description: _configProperties.get('description'),
-          serviceName: _configProperties.get('serviceName'),
-          domain: _configProperties.get('domain'),
-          isVisible: _configProperties.get('isVisible'),
-          isFinal: _configProperties.get('isFinal'),
-          recommendedIsFinal: _configProperties.get('isFinal'),
-          supportsFinal: _configProperties.get('supportsFinal'),
-          filename: _configProperties.get('filename'),
-          displayType: _configProperties.get('displayType'),
-          isRequiredByAgent: _configProperties.get('isRequiredByAgent'),
-          hasInitialValue: !!_configProperties.get('hasInitialValue'),
-          isRequired: _configProperties.get('isRequired'), // flag that allow saving property with empty value
-          group: !!_configProperties.get('group') ? _configProperties.get('group.name') : null,
-          showLabel: _configProperties.get('showLabel'),
-          category: _configProperties.get('category')
-        };
+        var configProperty = App.config.createDefaultConfig(_configProperties.get('name'), _configProperties.get('filename'), _configProperties.get('isUserProperty'), {value: _configProperties.get('value')});
+        configProperty = App.config.mergeStaticProperties(configProperty, _configProperties, ['name', 'filename']);
 
         if (this.isExcludedConfig(configProperty)) {
           configProperty.value = '';
@@ -1248,11 +1190,13 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, App.ThemesMappingM
         return s.get('isSelected') || s.get('isInstalled');
       }).mapProperty('serviceName');
       // Load stack configs before loading themes
-      App.config.loadConfigsFromStack(serviceNames).done(function () {
-        self.loadConfigThemeForServices(serviceNames).always(function () {
-          self.set('stackConfigsLoaded', true);
-          App.themesMapper.generateAdvancedTabs(serviceNames);
-          dfd.resolve();
+      App.config.loadClusterConfigsFromStack().always(function() {
+        App.config.loadConfigsFromStack(serviceNames).done(function () {
+          self.loadConfigThemeForServices(serviceNames).always(function () {
+            self.set('stackConfigsLoaded', true);
+            App.themesMapper.generateAdvancedTabs(serviceNames);
+            dfd.resolve();
+          });
         });
       });
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/controllers/wizard/step7_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard/step7_controller.js b/ambari-web/app/controllers/wizard/step7_controller.js
index 67fb944..1d3eea4 100644
--- a/ambari-web/app/controllers/wizard/step7_controller.js
+++ b/ambari-web/app/controllers/wizard/step7_controller.js
@@ -106,20 +106,14 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E
   serviceConfigTags: [],
 
   /**
-   * Are advanced configs loaded
-   * @type {bool}
-   */
-  isAdvancedConfigLoaded: true,
-
-  /**
    * Are applied to service configs loaded
    * @type {bool}
    */
   isAppliedConfigLoaded: true,
 
   isConfigsLoaded: function () {
-    return (this.get('isAdvancedConfigLoaded') && this.get('isAppliedConfigLoaded'));
-  }.property('isAdvancedConfigLoaded', 'isAppliedConfigLoaded'),
+    return (this.get('wizardController.stackConfigsLoaded') && this.get('isAppliedConfigLoaded'));
+  }.property('wizardController.stackConfigsLoaded', 'isAppliedConfigLoaded'),
 
   /**
    * Number of errors in the configs in the selected service
@@ -540,7 +534,9 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E
     if (overrideToAdd) {
       overrideToAdd = componentConfig.get('configs').findProperty('name', overrideToAdd.name);
       if (overrideToAdd) {
-        this.addOverrideProperty(overrideToAdd);
+        var group = this.get('selectedService.configGroups').findProperty('name', this.get('selectedConfigGroup.name'));
+        var newSCP = App.config.createOverride(overrideToAdd, {isEditable: true}, group);
+        group.get('properties').pushObject(newSCP);
         component.set('overrideToAdd', null);
       }
     }
@@ -624,19 +620,12 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E
     this.clearStep();
 
     var self = this;
-    //STEP 1: Load advanced configs
-    var advancedConfigs = this.get('content.advancedServiceConfig');
     //STEP 2: Load on-site configs by service from local DB
     var storedConfigs = this.get('content.serviceConfigProperties');
     //STEP 3: Merge pre-defined configs with loaded on-site configs
-    var configs = App.config.mergePreDefinedWithStored(
-      storedConfigs,
-      advancedConfigs,
-      this.get('selectedServiceNames').concat(this.get('installedServiceNames'))
-    );
+    var configs = (storedConfigs && storedConfigs.length) ? storedConfigs
+      : App.config.mergePreDefinedWithStack(this.get('selectedServiceNames').concat(this.get('installedServiceNames')));
     App.config.setPreDefinedServiceConfigs(this.get('addMiscTabToPage'));
-    //STEP 4: Add advanced configs
-    App.config.addAdvancedConfigs(configs, advancedConfigs);
 
     this.set('groupsToDelete', this.get('wizardController').getDBProperty('groupsToDelete') || []);
     if (this.get('wizardController.name') === 'addServiceController') {
@@ -668,51 +657,37 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E
     this.activateSpecialConfigs();
     this.selectProperService();
     var self = this;
-    this.loadServerSideConfigsRecommendations().always(function () {
-      // format descriptor configs
-      var serviceConfigPropertiesNames = (self.get('content.serviceConfigProperties') || []).mapProperty('name'),
-       serviceConfigPropertiesFileNames = (self.get('content.serviceConfigProperties') || []).mapProperty('filename'),
-       recommendedToDelete = self.get('_dependentConfigValues').filterProperty('toDelete');
-      recommendedToDelete.forEach(function (c) {
-        var name = Em.get(c, 'propertyName'),
-         filename = Em.get(c, 'fileName');
-        if (serviceConfigPropertiesNames.contains(name) && serviceConfigPropertiesFileNames.contains(filename)) {
-          Em.set(c, 'toDelete', false);
-        }
-      });
-
-      var rangerService = App.StackService.find().findProperty('serviceName', 'RANGER');
-      if (rangerService && !rangerService.get('isInstalled') && !rangerService.get('isSelected')) {
-        App.config.removeRangerConfigs(self.get('stepConfigs'));
-      }
-      if (!self.get('content.serviceConfigProperties.length')) {
-        // for Add Service just remove or add dependent properties and ignore config values changes
-        // for installed services only
+    var rangerService = App.StackService.find().findProperty('serviceName', 'RANGER');
+    if (rangerService && !rangerService.get('isInstalled') && !rangerService.get('isSelected')) {
+      App.config.removeRangerConfigs(self.get('stepConfigs'));
+    }
+    if (this.get('content.serviceConfigProperties.length') > 0) {
+      this.completeConfigLoading();
+    } else {
+      this.loadServerSideConfigsRecommendations().always(function () {
         if (self.get('wizardController.name') == 'addServiceController') {
+          // for Add Service just remove or add dependent properties and ignore config values changes
+          // for installed services only
           self.addRemoveDependentConfigs(self.get('installedServiceNames'));
           self.clearDependenciesForInstalledServices(self.get('installedServiceNames'), self.get('stepConfigs'));
         }
         // * add dependencies based on recommendations
         // * update config values with recommended
-        // * remove properties recieved from recommendations
+        // * remove properties received from recommendations
         self.updateDependentConfigs();
-      } else {
-        // control flow for managing dependencies for stored configs,
-        // * Don't update values with recommended to save user's input
-        // * add dependencies based on user's input for parent configs
-        // * remove dependencies based on user's input for parent configs
-        self.addRemoveDependentConfigs();
-      }
-      self.restoreRecommendedConfigs();
-      self.clearDependentConfigsByService(App.StackService.find().filterProperty('isSelected').mapProperty('serviceName'));
-      self.set('isRecommendedLoaded', true);
-      if (self.get('content.skipConfigStep')) {
-        App.router.send('next');
-      }
-      self.set('hash', self.getHash());
-    });
+        self.completeConfigLoading();
+      });
+    }
   },
 
+  completeConfigLoading: function() {
+    this.clearDependentConfigsByService(App.StackService.find().filterProperty('isSelected').mapProperty('serviceName'));
+    this.set('isRecommendedLoaded', true);
+    if (this.get('content.skipConfigStep')) {
+      App.router.send('next');
+    }
+    this.set('hash', this.getHash());
+  },
   /**
    * After user navigates back to step7, values for depended configs should be set to values set by user and not to default values
    * @method restoreRecommendedConfigs
@@ -1178,7 +1153,11 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E
       configOverrides = overrides.filterProperty('name', config.get('name'));
     if (!selectedGroup) return config;
     if (overrideToAdd && overrideToAdd.get('name') === config.get('name')) {
-      configOverrides.push(this.addOverrideProperty(config));
+      var valueForOverride = (config.get('widget') || config.get('displayType') == 'checkbox') ? config.get('value') : '';
+      var group = this.get('selectedService.configGroups').findProperty('name', selectedGroup.get('name'));
+      var newSCP = App.config.createOverride(config, {value: valueForOverride, recommendedValue: valueForOverride}, group);
+      configOverrides.push(newSCP);
+      group.get('properties').pushObject(newSCP);
       this.set('overrideToAdd', null);
     }
     configOverrides.setEach('isEditable', !selectedGroup.get('isDefault'));
@@ -1188,34 +1167,6 @@ App.WizardStep7Controller = Em.Controller.extend(App.ServerValidatorMixin, App.E
   },
 
   /**
-   * create overriden property and push it into Config group
-   * @param serviceConfigProperty
-   * @param group
-   * @param value
-   * @param isNotSaved
-   * @param {App.ServiceConfigProperty} serviceConfigProperty
-   * @return {App.ServiceConfigProperty}
-   * @method addOverrideProperty
-   */
-  addOverrideProperty: function (serviceConfigProperty, group, value, isNotSaved) {
-    var overrides = serviceConfigProperty.get('overrides') || [];
-    var newSCP = App.ServiceConfigProperty.create(serviceConfigProperty);
-    group = group || this.get('selectedService.configGroups').findProperty('name', this.get('selectedConfigGroup.name'));
-    var valueForOverride = (serviceConfigProperty.get('widget') || serviceConfigProperty.get('displayType') == 'checkbox') ? serviceConfigProperty.get('value') : '';
-    newSCP.set('group', group);
-    newSCP.set('value', value || valueForOverride);
-    newSCP.set('recommendedValue', value || valueForOverride);
-    newSCP.set('isOriginalSCP', false); // indicated this is overridden value,
-    newSCP.set('parentSCP', serviceConfigProperty);
-    newSCP.set('isEditable', true);
-    newSCP.set('isNotSaved', isNotSaved);
-    group.get('properties').pushObject(newSCP);
-    overrides.pushObject(newSCP);
-    newSCP.validate();
-    return newSCP;
-  },
-
-  /**
    * @method manageConfigurationGroup
    */
   manageConfigurationGroup: function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/data/HDP2.3/site_properties.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/data/HDP2.3/site_properties.js b/ambari-web/app/data/HDP2.3/site_properties.js
index 152d58d..1babe76 100644
--- a/ambari-web/app/data/HDP2.3/site_properties.js
+++ b/ambari-web/app/data/HDP2.3/site_properties.js
@@ -41,7 +41,13 @@ var excludedConfigs = [
   'xa_ldap_ad_domain',
   'xa_ldap_ad_url',
   'policymgr_http_enabled',
-  'policymgr_external_url'
+  'policymgr_external_url',
+  'hbase.regionserver.global.memstore.lowerLimit',
+  'hbase.regionserver.global.memstore.upperLimit',
+  "port",
+  "hive.metastore.heapsize",
+  "hive.client.heapsize",
+  "SQL_COMMAND_INVOKER"
 ];
 
 var hdp23properties = hdp22properties.filter(function (item) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/data/host_component_mapping.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/data/host_component_mapping.js b/ambari-web/app/data/host_component_mapping.js
new file mode 100644
index 0000000..be5f891
--- /dev/null
+++ b/ambari-web/app/data/host_component_mapping.js
@@ -0,0 +1,142 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var App = require('app');
+
+/**
+ * Array of Objects
+ * {
+   *  hostProperty - hostName property name for current component
+   *  componentName - master componentName
+   *  serviceName - serviceName of component
+   *  serviceUseThis - services that use hostname property of component(componentName)
+   *  m(multiple) - true if can be more than one components installed on cluster
+   * }
+ */
+
+module.exports = [
+  {
+    hostProperty: 'snamenode_host',
+    componentName: 'SECONDARY_NAMENODE',
+    serviceName: 'HDFS',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'jobtracker_host',
+    componentName: 'JOBTRACKER',
+    serviceName: 'MAPREDUCE2',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'hs_host',
+    componentName: 'HISTORYSERVER',
+    serviceName: 'MAPREDUCE2',
+    serviceUseThis: ['YARN']
+  },
+  {
+    hostProperty: 'ats_host',
+    componentName: 'APP_TIMELINE_SERVER',
+    serviceName: 'YARN',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'rm_host',
+    componentName: 'RESOURCEMANAGER',
+    serviceName: 'YARN',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'hivemetastore_host',
+    componentName: 'HIVE_METASTORE',
+    serviceName: 'HIVE',
+    serviceUseThis: ['HIVE'],
+    m: true
+  },
+  {
+    hostProperty: 'hive_ambari_host',
+    componentName: 'HIVE_SERVER',
+    serviceName: 'HIVE',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'oozieserver_host',
+    componentName: 'OOZIE_SERVER',
+    serviceName: 'OOZIE',
+    serviceUseThis: [],
+    m: true
+  },
+  {
+    hostProperty: 'oozie_ambari_host',
+    componentName: 'OOZIE_SERVER',
+    serviceName: 'OOZIE',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'hbasemaster_host',
+    componentName: 'HBASE_MASTER',
+    serviceName: 'HBASE',
+    serviceUseThis: [],
+    m: true
+  },
+  {
+    hostProperty: 'webhcatserver_host',
+    componentName: 'WEBHCAT_SERVER',
+    serviceName: 'HIVE',
+    serviceUseThis: [],
+    m: true
+  },
+  {
+    hostProperty: 'zookeeperserver_hosts',
+    componentName: 'ZOOKEEPER_SERVER',
+    serviceName: 'ZOOKEEPER',
+    serviceUseThis: ['HBASE', 'HIVE'],
+    m: true
+  },
+  {
+    hostProperty: 'stormuiserver_host',
+    componentName: 'STORM_UI_SERVER',
+    serviceName: 'STORM',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'drpcserver_host',
+    componentName: 'DRPC_SERVER',
+    serviceName: 'STORM',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'storm_rest_api_host',
+    componentName: 'STORM_REST_API',
+    serviceName: 'STORM',
+    serviceUseThis: []
+  },
+  {
+    hostProperty: 'supervisor_hosts',
+    componentName: 'SUPERVISOR',
+    serviceName: 'STORM',
+    serviceUseThis: [],
+    m: true
+  },
+  {
+    hostProperty: 'rangerserver_host',
+    componentName: 'RANGER_ADMIN',
+    serviceName: 'RANGER',
+    serviceUseThis: [],
+    m: true
+  }
+];

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/mappers/configs/stack_config_properties_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/configs/stack_config_properties_mapper.js b/ambari-web/app/mappers/configs/stack_config_properties_mapper.js
index 09f3cf9..e907020 100644
--- a/ambari-web/app/mappers/configs/stack_config_properties_mapper.js
+++ b/ambari-web/app/mappers/configs/stack_config_properties_mapper.js
@@ -34,25 +34,34 @@ App.stackConfigPropertiesMapper = App.QuickDataMapper.create({
     property_depended_by: 'StackConfigurations.property_depended_by',
     property_depends_on: 'StackConfigurations.property_depends_on',
     value_attributes: 'StackConfigurations.property_value_attributes',
-    is_final: 'default_is_final',
-    recommended_is_final: 'default_is_final',
+    is_final: 'recommended_is_final',
+    recommended_is_final: 'recommended_is_final',
     supports_final: 'supports_final',
     widget: 'widget',
     /**** ui properties ***/
     display_type: 'display_type',
-    category: 'category'
+    category: 'category',
+    index: 'index'
   },
 
   map: function (json) {
-    console.time('stackConfigMapper execution time');
+    console.time('stackConfigPropertiesMapper execution time');
+    if (json && json.Versions) {
+      //hack for cluster versions
+      json = {items: [json]};
+      var clusterConfigs = true;
+    }
     if (json && json.items) {
       var configs = [];
       json.items.forEach(function(stackItem) {
-        var configTypeInfo = Em.get(stackItem, 'StackServices.config_types');
+        var configTypeInfo = clusterConfigs ? Em.get(stackItem, 'Versions.config_types') : Em.get(stackItem, 'StackServices.config_types');
 
         stackItem.configurations.forEach(function(config) {
+          if (clusterConfigs) {
+            config.StackConfigurations = config.StackLevelConfigurations;
+          }
           var configType = App.config.getConfigTagFromFileName(config.StackConfigurations.type);
-          config.id = config.StackConfigurations.property_name + '_' + configType;
+          config.id = App.config.configId(config.StackConfigurations.property_name, configType);
           config.recommended_is_final = config.StackConfigurations.final === "true";
           config.supports_final = !!configTypeInfo[configType] && configTypeInfo[configType].supports.final === "true";
           // Map from /dependencies to property_depended_by
@@ -90,10 +99,10 @@ App.stackConfigPropertiesMapper = App.QuickDataMapper.create({
       }, this);
       App.store.loadMany(this.get('model'), configs);
     }
-    console.timeEnd('stackConfigMapper execution time');
+    console.timeEnd('stackConfigPropertiesMapper execution time');
   },
 
-  /******************* METHODS TO MERGE STACK PROPERTIES WITH STORED ON UI (NOT USED FOR NOW)*********************************/
+  /******************* METHODS TO MERGE STACK PROPERTIES WITH STORED ON UI *********************************/
 
   /**
    * find UI config with current name and fileName
@@ -102,13 +111,18 @@ App.stackConfigPropertiesMapper = App.QuickDataMapper.create({
    * @method mergeWithUI
    */
   mergeWithUI: function(config) {
-    var uiConfigProperty = this.getUIConfig(config.StackConfigurations.property_name, config.StackConfigurations.type);
-    var displayType = App.permit(App.config.advancedConfigIdentityData(config.StackConfigurations), 'displayType').displayType || 'string';
-    if (!config.StackConfigurations.property_display_name) {
-      config.StackConfigurations.property_display_name = uiConfigProperty && uiConfigProperty.displayName ? uiConfigProperty.displayName : config.StackConfigurations.property_name;
+    var c = config.StackConfigurations;
+    var uiConfigProperty = this.getUIConfig(c.property_name, c.type);
+    var advancedData = App.config.advancedConfigIdentityData(c);
+
+    if (!c.property_display_name) {
+      c.property_display_name = App.config.getPropertyIfExists('displayName', App.config.getDefaultDisplayName(c.property_name, c.type), advancedData, uiConfigProperty);
     }
-    config.category = uiConfigProperty ? uiConfigProperty.category : 'Advanced ' + App.config.getConfigTagFromFileName(config.StackConfigurations.type);
-    config.display_type = uiConfigProperty ? uiConfigProperty.displayType || displayType : displayType;
+    c.service_name = App.config.getPropertyIfExists('serviceName', c.service_name, advancedData, uiConfigProperty);
+
+    config.category = App.config.getPropertyIfExists('category', App.config.getDefaultCategory(true, c.type), advancedData, uiConfigProperty);
+    config.display_type = App.config.getPropertyIfExists('displayType', App.config.getDefaultDisplayType(c.property_name, c.type, c.property_value), advancedData, uiConfigProperty);
+    config.index = App.config.getPropertyIfExists('index', null, advancedData, uiConfigProperty);
   },
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/mappers/configs/themes_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/configs/themes_mapper.js b/ambari-web/app/mappers/configs/themes_mapper.js
index eda0e52..e632860 100644
--- a/ambari-web/app/mappers/configs/themes_mapper.js
+++ b/ambari-web/app/mappers/configs/themes_mapper.js
@@ -164,7 +164,7 @@ App.themesMapper = App.QuickDataMapper.create({
   getConfigId: function(json) {
     if (json && json.config && typeof json.config === "string") {
       var split = json.config.split("/");
-      return split[1] + "_" + split[0];
+      return App.config.configId(split[1], split[0]);
     } else {
       console.warn('getConfigId: invalid input data');
       return null;

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/mixins/common/configs/configs_saver.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/common/configs/configs_saver.js b/ambari-web/app/mixins/common/configs/configs_saver.js
index b00a28e..252229c 100644
--- a/ambari-web/app/mixins/common/configs/configs_saver.js
+++ b/ambari-web/app/mixins/common/configs/configs_saver.js
@@ -555,6 +555,8 @@ App.ConfigsSaverMixin = Em.Mixin.create({
       return property.get('value').toString();
     }
     switch (name) {
+      case 'kdc_type':
+        return App.router.get('mainAdminKerberosController.kdcTypesValues')[property.get('value')];
       case 'storm.zookeeper.servers':
       case 'nimbus.seeds':
         if (Em.isArray(value)) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/mixins/common/configs/enhanced_configs.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/common/configs/enhanced_configs.js b/ambari-web/app/mixins/common/configs/enhanced_configs.js
index 5e5f653..b08e7b2 100644
--- a/ambari-web/app/mixins/common/configs/enhanced_configs.js
+++ b/ambari-web/app/mixins/common/configs/enhanced_configs.js
@@ -555,7 +555,7 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
       var properties = configs[siteName].property_attributes || {};
       Em.keys(properties).forEach(function (propertyName) {
         var cp = configProperties.findProperty('name', propertyName);
-        var stackProperty = App.StackConfigProperty.find().findProperty('id', propertyName + '_' + siteName);
+        var stackProperty = App.StackConfigProperty.find().findProperty('id', App.config.configId(propertyName, siteName));
         var attributes = properties[propertyName] || {};
         Em.keys(attributes).forEach(function (attributeName) {
           if (attributeName == 'delete') {
@@ -684,7 +684,13 @@ App.EnhancedConfigsMixin = Em.Mixin.create({
             overriddenProperty.set('value', Em.get(propertyToAdd, 'recommendedValue'));
             overriddenProperty.set('recommendedValue', Em.get(propertyToAdd, 'recommendedValue'));
           } else {
-            this.addOverrideProperty(cp, selectedGroup, Em.get(propertyToAdd, 'recommendedValue'), !Em.get(propertyToAdd, 'isDeleted'));
+            var overridePlainObject = {
+              "value": Em.get(propertyToAdd, 'recommendedValue'),
+              "recommendedValue": Em.get(propertyToAdd, 'recommendedValue'),
+              "isNotSaved": !Em.get(propertyToAdd, 'isDeleted'),
+              "isEditable": true
+            };
+            App.config.createOverride(cp, overridePlainObject, selectedGroup);
           }
         }
         Em.setProperties(propertyToAdd, {

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/mixins/main/service/configs/config_overridable.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/main/service/configs/config_overridable.js b/ambari-web/app/mixins/main/service/configs/config_overridable.js
index 1dc3d24..4f42b34 100644
--- a/ambari-web/app/mixins/main/service/configs/config_overridable.js
+++ b/ambari-web/app/mixins/main/service/configs/config_overridable.js
@@ -53,7 +53,6 @@ App.ConfigOverridable = Em.Mixin.create({
         configGroups,
         serviceConfigProperty,
         function (selectedGroupInPopup) {
-          console.log("launchConfigGroupSelectionCreationDialog(): Selected/Created:", selectedGroupInPopup);
           if (selectedGroupInPopup) {
             serviceConfigController.set('overrideToAdd', serviceConfigProperty);
             serviceConfigController.set('selectedConfigGroup', selectedGroupInPopup);
@@ -63,8 +62,11 @@ App.ConfigOverridable = Em.Mixin.create({
       );
     }
     else {
-      var valueForOverride = (serviceConfigProperty.get('widget') || serviceConfigProperty.get('displayType') == 'checkbox') ? serviceConfigProperty.get('value') : null;
-      serviceConfigController.addOverrideProperty(serviceConfigProperty, selectedConfigGroup, valueForOverride);
+      var valueForOverride = (serviceConfigProperty.get('widget') || serviceConfigProperty.get('displayType') == 'checkbox') ? serviceConfigProperty.get('value') : '';
+      var override = App.config.createOverride(serviceConfigProperty, { "value": valueForOverride, "isEditable": true }, selectedConfigGroup);
+      if (isInstaller) {
+        selectedConfigGroup.get('properties').pushObject(override);
+      }
     }
     Em.$('body>.tooltip').remove();
   },
@@ -126,8 +128,10 @@ App.ConfigOverridable = Em.Mixin.create({
         if (this.get('optionSelectConfigGroup')) {
           var selectedConfigGroup = this.get('selectedConfigGroup');
           this.hide();
-          App.get('router.mainServiceInfoConfigsController').loadSelectedVersion(null, this.get('selectedConfigGroup'));
           callback(selectedConfigGroup);
+          if (!isInstaller) {
+            App.get('router.mainServiceInfoConfigsController').doSelectConfigGroup({context: selectedConfigGroup});
+          }
         } else {
           var newConfigGroupName = this.get('newConfigGroupName').trim();
           var newConfigGroup = App.ConfigGroup.create({

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/models/configs/stack_config_property.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/configs/stack_config_property.js b/ambari-web/app/models/configs/stack_config_property.js
index 7caeadf..a1925a4 100644
--- a/ambari-web/app/models/configs/stack_config_property.js
+++ b/ambari-web/app/models/configs/stack_config_property.js
@@ -86,7 +86,7 @@ App.StackConfigProperty = DS.Model.extend({
    * service name
    * @property {string}
    */
-  serviceName:  DS.attr('string'),
+  serviceName:  DS.attr('string', {defaultValue: 'MISC'}),
 
   /**
    * stack name
@@ -182,7 +182,12 @@ App.StackConfigProperty = DS.Model.extend({
    * config property isFinal value same as recommendedIsFinal
    * @property {boolean}
    */
-  isFinal: DS.attr('boolean', {defaultValue: false})
+  isFinal: DS.attr('boolean', {defaultValue: false}),
+
+  /**
+   * @type {boolean}
+   */
+  index: DS.attr('number', {defaultValue: null})
 });
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/routes/add_service_routes.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/routes/add_service_routes.js b/ambari-web/app/routes/add_service_routes.js
index 9a4071f..96937f9 100644
--- a/ambari-web/app/routes/add_service_routes.js
+++ b/ambari-web/app/routes/add_service_routes.js
@@ -214,7 +214,6 @@ module.exports = App.WizardRoute.extend({
       controller.dataLoading().done(function () {
         var wizardStep7Controller = router.get('wizardStep7Controller');
         controller.loadAllPriorSteps().done(function () {
-          controller.loadAdvancedConfigs(wizardStep7Controller);
           wizardStep7Controller.getConfigTags();
           wizardStep7Controller.set('wizardController', controller);
           controller.usersLoading().done(function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/routes/installer.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/routes/installer.js b/ambari-web/app/routes/installer.js
index c57da9c..4422f2b 100644
--- a/ambari-web/app/routes/installer.js
+++ b/ambari-web/app/routes/installer.js
@@ -302,11 +302,8 @@ module.exports = Em.Route.extend(App.RouterRedirections, {
     },
     connectOutlets: function (router, context) {
       var controller = router.get('installerController');
-
+      var wizardStep7Controller = router.get('wizardStep7Controller');
       controller.loadAllPriorSteps().done(function () {
-        var wizardStep7Controller = router.get('wizardStep7Controller');
-        controller.loadAdvancedConfigs(wizardStep7Controller);
-        wizardStep7Controller.set('isAdvancedConfigLoaded', false);
         wizardStep7Controller.set('wizardController', controller);
         controller.connectOutlet('wizardStep7', controller.get('content'));
       });

http://git-wip-us.apache.org/repos/asf/ambari/blob/9582cc0a/ambari-web/app/utils/ajax/ajax.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ajax/ajax.js b/ambari-web/app/utils/ajax/ajax.js
index ef6cee3..bde7af6 100644
--- a/ambari-web/app/utils/ajax/ajax.js
+++ b/ambari-web/app/utils/ajax/ajax.js
@@ -640,6 +640,11 @@ var urls = {
 
   /*************************STACK CONFIGS**************************************/
 
+  'configs.stack_configs.load.cluster_configs': {
+    'real': '{stackVersionUrl}?fields=configurations/*,Versions/config_types/*',
+    'mock': '/data/stacks/HDP-2.2/configurations.json'
+  },
+
   'configs.stack_configs.load.all': {
     'real': '{stackVersionUrl}/services?fields=configurations/*,StackServices/config_types/*',
     'mock': '/data/stacks/HDP-2.2/configurations.json'