You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by xi...@apache.org on 2016/04/12 22:39:06 UTC

[2/2] ambari git commit: AMBARI-15724. Integrate Version Registration in Select Stack Page.(xiwang)

AMBARI-15724. Integrate Version Registration in Select Stack Page.(xiwang)


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

Branch: refs/heads/trunk
Commit: 391b45e934b8d4e94cb64adab0293736671395db
Parents: 81279fa
Author: Xi Wang <xi...@apache.org>
Authored: Wed Mar 30 17:43:53 2016 -0700
Committer: Xi Wang <xi...@apache.org>
Committed: Tue Apr 12 13:38:26 2016 -0700

----------------------------------------------------------------------
 .../wizard/stack/HDP_version_definitions.json   | 556 +++++++++++++++
 ambari-web/app/controllers/installer.js         | 191 +++++-
 .../main/admin/stack_and_upgrade_controller.js  |  33 +-
 .../controllers/main/service/add_controller.js  |   8 +-
 ambari-web/app/controllers/wizard.js            |  55 ++
 .../app/controllers/wizard/step1_controller.js  | 105 ++-
 .../app/mappers/repository_version_mapper.js    |  11 +
 ambari-web/app/mappers/stack_mapper.js          |  52 +-
 ambari-web/app/messages.js                      |  24 +-
 ambari-web/app/models/stack.js                  |  42 +-
 ambari-web/app/routes/add_service_routes.js     |   9 +-
 ambari-web/app/styles/application.less          | 177 +++++
 .../main/admin/stack_upgrade/services.hbs       |   2 +-
 ambari-web/app/templates/wizard/step1.hbs       | 282 +++++---
 .../templates/wizard/step1_viewRepositories.hbs | 102 +++
 ambari-web/app/templates/wizard/step4.hbs       |   2 +-
 ambari-web/app/utils/ajax/ajax.js               |  52 ++
 .../main/admin/stack_upgrade/services_view.js   |  11 +-
 ambari-web/app/views/wizard/step1_view.js       | 470 +++++++++----
 ambari-web/test/controllers/installer_test.js   |  27 +-
 ambari-web/test/mappers/stack_mapper_test.js    | 674 ++++++++++++++-----
 .../admin/stack_upgrade/services_view_test.js   |  25 +-
 ambari-web/test/views/wizard/step1_view_test.js | 296 +-------
 23 files changed, 2426 insertions(+), 780 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/ambari-web/app/assets/data/wizard/stack/HDP_version_definitions.json
----------------------------------------------------------------------
diff --git a/ambari-web/app/assets/data/wizard/stack/HDP_version_definitions.json b/ambari-web/app/assets/data/wizard/stack/HDP_version_definitions.json
new file mode 100644
index 0000000..fde11e2
--- /dev/null
+++ b/ambari-web/app/assets/data/wizard/stack/HDP_version_definitions.json
@@ -0,0 +1,556 @@
+{
+  "href" : "http://c6401.ambari.apache.org:8080/api/v1/version_definitions?fields=operating_systems/repositories/Repositories/*,VersionDefinition/stack_services&show_available=true&VersionDefinition/stack_name=HDP",
+  "items" : [
+    {
+      "VersionDefinition" : {
+        "id" : 1,
+        "show_available": true,
+        "stack_name" : "HDP",
+        "stack_version" : "2.3",
+        "repository_version" : "2.3.4.0-3396",
+        "type" : "STANDARD",
+        "version_url" : "file:/Users/ncole/src/hwx/ambari/contrib/version-builder/version_234-3396.xml",
+        "release" : {
+          "build" : "3396",
+          "compatible_with" : "2.3.[0-3].0",
+          "notes" : "http://example.com",
+          "version" : "2.3.4.0"
+        },
+        "stack_services" : [
+          {
+            "name" : "HDFS",
+            "display_name" : "HDFS",
+            "comment" : "Data warehouse system for ad-hoc queries & analysis of large datasets and table & storage management service",
+            "versions" : [
+              "2.7.1.2.3396"
+            ]
+          },
+          {
+            "name" : "YARN",
+            "display_name" : "YARN",
+            "comment" : "",
+            "versions" : [
+              "1.7.3.3396"
+            ]
+          },
+          {
+            "name" : "ZOOKEEPER",
+            "display_name" : "ZooKeeper",
+            "comment" : "",
+            "versions" : [
+              "1.7.3.3396"
+            ]
+          }
+        ]
+      },
+      "operating_systems" : [
+        {
+          "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7",
+          "OperatingSystems" : {
+            "os_type" : "debian7",
+            "repository_version_id" : 1,
+            "stack_name" : "HDP",
+            "stack_version" : "2.3"
+          },
+          "repositories" : [
+            {
+              "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7/repositories/HDP-2.3",
+              "Repositories" : {
+                "base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.3.4.0-3396",
+                "default_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.3.4.0-3396",
+                "latest_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.3.4.0-3396",
+                "mirrors_list" : "",
+                "os_type" : "debian7",
+                "repo_id" : "HDP-2.3",
+                "repo_name" : "HDP",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            },
+            {
+              "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7/repositories/HDP-UTILS-1.1.0.20",
+              "Repositories" : {
+                "base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7",
+                "default_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7",
+                "latest_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7",
+                "mirrors_list" : "",
+                "os_type" : "debian7",
+                "repo_id" : "HDP-UTILS-1.1.0.20",
+                "repo_name" : "HDP-UTILS",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            }
+          ]
+        },
+        {
+          "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/redhat6",
+          "OperatingSystems" : {
+            "os_type" : "redhat6",
+            "repository_version_id" : 1,
+            "stack_name" : "HDP",
+            "stack_version" : "2.3"
+          },
+          "repositories" : [
+            {
+              "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/redhat6/repositories/HDP-2.3",
+              "Repositories" : {
+                "base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos6/2.x/BUILDS/2.3.4.0-3396",
+                "default_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos6/2.x/BUILDS/2.3.4.0-3396",
+                "latest_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos6/2.x/BUILDS/2.3.4.0-3396",
+                "mirrors_list" : "",
+                "os_type" : "redhat6",
+                "repo_id" : "HDP-2.3",
+                "repo_name" : "HDP",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            },
+            {
+              "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/redhat6/repositories/HDP-UTILS-1.1.0.20",
+              "Repositories" : {
+                "base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6",
+                "default_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6",
+                "latest_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6",
+                "mirrors_list" : "",
+                "os_type" : "redhat6",
+                "repo_id" : "HDP-UTILS-1.1.0.20",
+                "repo_name" : "HDP-UTILS",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            }
+          ]
+        }
+      ]
+    },
+
+    {
+      "VersionDefinition" : {
+        "id" : 2,
+        "stack_name" : "HDP",
+        "stack_version" : "2.3",
+        "show_available": true,
+        "repository_version" : "2.3.4.0-3397",
+        "type" : "STANDARD",
+        "version_url" : "file:/Users/ncole/src/hwx/ambari/contrib/version-builder/version_234-3397.xml",
+        "release" : {
+          "build" : "3397",
+          "compatible_with" : "2.3.[0-3].0",
+          "notes" : "http://example.com",
+          "version" : "2.3.4.0"
+        },
+        "stack_services" : [
+          {
+            "name" : "HDFS",
+            "display_name" : "HDFS",
+            "comment" : "Data warehouse system for ad-hoc queries & analysis of large datasets and table & storage management service",
+            "versions" : [
+              "2.7.1.2-3397"
+            ]
+          },
+          {
+            "name" : "YARN",
+            "display_name" : "YARN",
+            "comment" : "",
+            "versions" : [
+              "1.7.3-3397"
+            ]
+          },
+          {
+            "name" : "HBase",
+            "display_name" : "HBase",
+            "comment" : "",
+            "versions" : [
+              "1.7.3-3397"
+            ]
+          },
+          {
+            "name" : "ZOOKEEPER",
+            "display_name" : "ZooKeeper",
+            "comment" : "",
+            "versions" : [
+              "1.7.3-3397"
+            ]
+          },
+          {
+            "name" : "Hive",
+            "display_name" : "Hive",
+            "comment" : "",
+            "versions" : [
+              "1.1.0-3397"
+            ]
+          }
+        ]
+      },
+      "operating_systems" : [
+        {
+          "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7",
+          "OperatingSystems" : {
+            "os_type" : "debian7",
+            "repository_version_id" : 1,
+            "stack_name" : "HDP",
+            "stack_version" : "2.3"
+          },
+          "repositories" : [
+            {
+              "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7/repositories/HDP-2.3",
+              "Repositories" : {
+                "base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.3.4.0-3397",
+                "default_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.3.4.0-3397",
+                "latest_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.3.4.0-3397",
+                "mirrors_list" : "",
+                "os_type" : "debian7",
+                "repo_id" : "HDP-2.3",
+                "repo_name" : "HDP",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            },
+            {
+              "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7/repositories/HDP-UTILS-1.1.0.20",
+              "Repositories" : {
+                "base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7",
+                "default_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7",
+                "latest_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7",
+                "mirrors_list" : "",
+                "os_type" : "debian7",
+                "repo_id" : "HDP-UTILS-1.1.0.20",
+                "repo_name" : "HDP-UTILS",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            }
+          ]
+        },
+        {
+          "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/redhat6",
+          "OperatingSystems" : {
+            "os_type" : "redhat6",
+            "repository_version_id" : 1,
+            "stack_name" : "HDP",
+            "stack_version" : "2.3"
+          },
+          "repositories" : [
+            {
+              "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/redhat6/repositories/HDP-2.3",
+              "Repositories" : {
+                "base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos6/2.x/BUILDS/2.3.4.0-3397",
+                "default_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos6/2.x/BUILDS/2.3.4.0-3397",
+                "latest_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos6/2.x/BUILDS/2.3.4.0-3397",
+                "mirrors_list" : "",
+                "os_type" : "redhat6",
+                "repo_id" : "HDP-2.3",
+                "repo_name" : "HDP",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            },
+            {
+              "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/redhat6/repositories/HDP-UTILS-1.1.0.20",
+              "Repositories" : {
+                "base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6",
+                "default_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6",
+                "latest_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6",
+                "mirrors_list" : "",
+                "os_type" : "redhat6",
+                "repo_id" : "HDP-UTILS-1.1.0.20",
+                "repo_name" : "HDP-UTILS",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            }
+          ]
+        }
+      ]
+    },
+
+    {
+      "VersionDefinition" : {
+        "id" : 5,
+        "stack_name" : "HDP",
+        "stack_version" : "2.3",
+        "show_available": true,
+        "repository_version" : "2.3.6.0-3646",
+        "type" : "STANDARD",
+        "version_url" : "file:/Users/ncole/src/hwx/ambari/contrib/version-builder/version_234-3646.xml",
+        "release" : {
+          "build" : "3646",
+          "compatible_with" : "2.3.[0-6].0",
+          "notes" : "http://example.com",
+          "version" : "2.3.6.0"
+        },
+        "stack_services" : [
+          {
+            "name" : "HDFS",
+            "display_name" : "HDFS",
+            "comment" : "Data warehouse system for ad-hoc queries & analysis of large datasets and table & storage management service",
+            "versions" : [
+              "2.7.1.2-3646"
+            ]
+          },
+          {
+            "name" : "YARN",
+            "display_name" : "YARN",
+            "comment" : "",
+            "versions" : [
+              "1.7.3-3646"
+            ]
+          },
+          {
+            "name" : "HBase",
+            "display_name" : "HBase",
+            "comment" : "",
+            "versions" : [
+              "1.7.3-3646"
+            ]
+          },
+          {
+            "name" : "ZOOKEEPER",
+            "display_name" : "ZooKeeper",
+            "comment" : "",
+            "versions" : [
+              "1.7.3-3646"
+            ]
+          },
+          {
+            "name" : "Hive",
+            "display_name" : "Hive",
+            "comment" : "",
+            "versions" : [
+              "1.1.0-3646"
+            ]
+          }
+        ]
+      },
+      "operating_systems" : [
+        {
+          "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7",
+          "OperatingSystems" : {
+            "os_type" : "debian7",
+            "repository_version_id" : 1,
+            "stack_name" : "HDP",
+            "stack_version" : "2.3"
+          },
+          "repositories" : [
+            {
+              "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7/repositories/HDP-2.3",
+              "Repositories" : {
+                "base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.3.6.0-3646",
+                "default_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.3.6.0-3646",
+                "latest_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.3.6.0-3646",
+                "mirrors_list" : "",
+                "os_type" : "debian7",
+                "repo_id" : "HDP-2.3",
+                "repo_name" : "HDP",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            },
+            {
+              "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7/repositories/HDP-UTILS-1.1.0.20",
+              "Repositories" : {
+                "base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7",
+                "default_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7",
+                "latest_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7",
+                "mirrors_list" : "",
+                "os_type" : "debian7",
+                "repo_id" : "HDP-UTILS-1.1.0.20",
+                "repo_name" : "HDP-UTILS",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            }
+          ]
+        },
+        {
+          "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/redhat6",
+          "OperatingSystems" : {
+            "os_type" : "redhat6",
+            "repository_version_id" : 1,
+            "stack_name" : "HDP",
+            "stack_version" : "2.3"
+          },
+          "repositories" : [
+            {
+              "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/redhat6/repositories/HDP-2.3",
+              "Repositories" : {
+                "base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos6/2.x/BUILDS/2.3.6.0-3646",
+                "default_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos6/2.x/BUILDS/2.3.6.0-3646",
+                "latest_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos6/2.x/BUILDS/2.3.6.0-3646",
+                "mirrors_list" : "",
+                "os_type" : "redhat6",
+                "repo_id" : "HDP-2.3",
+                "repo_name" : "HDP",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            },
+            {
+              "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/redhat6/repositories/HDP-UTILS-1.1.0.20",
+              "Repositories" : {
+                "base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6",
+                "default_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6",
+                "latest_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/centos6",
+                "mirrors_list" : "",
+                "os_type" : "redhat6",
+                "repo_id" : "HDP-UTILS-1.1.0.20",
+                "repo_name" : "HDP-UTILS",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.3"
+              }
+            }
+          ]
+        }
+      ]
+    },
+
+
+    {
+      "VersionDefinition" : {
+        "id" : 3,
+        "stack_name" : "HDP",
+        "stack_version" : "2.4",
+        "show_available": true,
+        "repository_version" : "2.4.0.0-169",
+        "type" : "STANDARD",
+        "version_url" : "file:/Users/ncole/src/hwx/ambari/contrib/version-builder/version_169.xml",
+        "release" : {
+          "build" : "169",
+          "compatible_with" : "2.4.[0-3].0",
+          "notes" : "http://example.com",
+          "version" : "2.4.0.0"
+        },
+        "stack_services" : [
+          {
+            "name" : "HDFS",
+            "display_name" : "HDFS",
+            "comment" : "Data warehouse system for ad-hoc queries & analysis of large datasets and table & storage management service",
+            "versions" : [
+              "2.7.1.2-169"
+            ]
+          },
+          {
+            "name" : "YARN",
+            "display_name" : "YARN",
+            "comment" : "",
+            "versions" : [
+              "1.7.3-169"
+            ]
+          },
+          {
+            "name" : "HBase",
+            "display_name" : "HBase",
+            "comment" : "",
+            "versions" : [
+              "1.7.3-169"
+            ]
+          },
+          {
+            "name" : "ZOOKEEPER",
+            "display_name" : "ZooKeeper",
+            "comment" : "",
+            "versions" : [
+              "1.7.3-169"
+            ]
+          },
+          {
+            "name" : "Hive",
+            "display_name" : "Hive",
+            "comment" : "",
+            "versions" : [
+              "1.1.0-169"
+            ]
+          },
+          {
+            "name" : "MAPREDUCE2",
+            "display_name" : "MapReduce2",
+            "comment" : "service",
+            "versions" : [
+              "2.7.1.2-169"
+            ]
+          },
+          {
+            "name" : "Slider",
+            "display_name" : "Slider",
+            "comment" : "service",
+            "versions" : [
+              "2.7.1.2-169"
+            ]
+          },
+          {
+            "name" : "Pig",
+            "display_name" : "Pig",
+            "comment" : "service",
+            "versions" : [
+              "2.7.1.2-169"
+            ]
+          },
+          {
+            "name" : "Sqoop",
+            "display_name" : "Sqoop",
+            "comment" : "service",
+            "versions" : [
+              "2.7.1.2-169"
+            ]
+          }
+        ]
+      },
+      "operating_systems" : [
+        {
+          "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7",
+          "OperatingSystems" : {
+            "os_type" : "debian7",
+            "repository_version_id" : 1,
+            "stack_name" : "HDP",
+            "stack_version" : "2.4"
+          },
+          "repositories" : [
+            {
+              "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7/repositories/HDP-2.3",
+              "Repositories" : {
+                "base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.4.0.0-169",
+                "default_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.4.0.0-169",
+                "latest_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP/debian7/2.x/BUILDS/2.4.0.0-169",
+                "mirrors_list" : "",
+                "os_type" : "debian7",
+                "repo_id" : "HDP-2.4",
+                "repo_name" : "HDP",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.4"
+              }
+            },
+            {
+              "href" : "http://c6401.ambari.apache.org:8080/api/v1/stacks/HDP/versions/2.3/repository_versions/1/operating_systems/debian7/repositories/HDP-UTILS-1.1.0.20",
+              "Repositories" : {
+                "base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7",
+                "default_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7",
+                "latest_base_url" : "http://s3.amazonaws.com/dev.hortonworks.com/HDP-UTILS-1.1.0.20/repos/debian7",
+                "mirrors_list" : "",
+                "os_type" : "debian7",
+                "repo_id" : "HDP-UTILS-1.1.0.20",
+                "repo_name" : "HDP-UTILS",
+                "repository_version_id" : 1,
+                "stack_name" : "HDP",
+                "stack_version" : "2.4"
+              }
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/ambari-web/app/controllers/installer.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/installer.js b/ambari-web/app/controllers/installer.js
index 9c92282..bf0ae7d 100644
--- a/ambari-web/app/controllers/installer.js
+++ b/ambari-web/app/controllers/installer.js
@@ -138,8 +138,13 @@ App.InstallerController = App.WizardController.extend({
     var stackServices = App.StackService.find().mapProperty('serviceName');
     if (!(stackServices && !!stackServices.length && App.StackService.find().objectAt(0).get('stackVersion') == App.get('currentStackVersionNumber'))) {
       this.loadServiceComponents().complete(function () {
-        self.set('content.services', App.StackService.find());
-        dfd.resolve();
+        self.loadServiceVersionFromVersionDefinitions().complete(function () {
+          self.set('content.services', App.StackService.find().forEach(function (item) {
+            // user the service version from VersionDefinition
+            item.serviceVersionDisplay = self.get('serviceVersionsMap')[item.get('serviceName')];
+          }));
+          dfd.resolve();
+        });
       });
     } else {
       dfd.resolve();
@@ -240,7 +245,7 @@ App.InstallerController = App.WizardController.extend({
     App.Tab.find().clear();
     this.set('stackConfigsLoaded', false);
     if (stacks && stacks.get('length')) {
-      App.set('currentStackVersion', App.Stack.find().findProperty('isSelected').get('id'));
+      App.set('currentStackVersion', App.Stack.find().findProperty('isSelected').get('stackNameVersion'));
       dfd.resolve(true);
     } else {
       App.ajax.send({
@@ -277,12 +282,12 @@ App.InstallerController = App.WizardController.extend({
     var requests = [];
     this.get('stackNames').forEach(function (stackName) {
       requests.push(App.ajax.send({
-        name: 'wizard.stacks_versions',
+        name: 'wizard.stacks_versions_definitions',
         sender: this,
         data: {
           stackName: stackName
         },
-        success: 'loadStacksVersionsSuccessCallback',
+        success: 'loadStacksVersionsDefinitionsSuccessCallback',
         error: 'loadStacksVersionsErrorCallback'
       }));
     }, this);
@@ -298,21 +303,21 @@ App.InstallerController = App.WizardController.extend({
   /**
    * Parse loaded data and create array of stacks objects
    */
-  loadStacksVersionsSuccessCallback: function (data) {
+  loadStacksVersionsDefinitionsSuccessCallback: function (data) {
     var stacks = App.db.getStacks();
     var isStacksExistInDb = stacks && stacks.length;
     if (isStacksExistInDb) {
       stacks.forEach(function (_stack) {
-        var stack = data.items.filterProperty('Versions.stack_name', _stack.stack_name).findProperty('Versions.stack_version', _stack.stack_version);
+        var stack = data.items.findProperty('VersionDefinition.repository_version', _stack.repository_version);
         if (stack) {
-          stack.Versions.is_selected = _stack.is_selected;
+          stack.VersionDefinition.is_selected = _stack.is_selected;
         }
       }, this);
     }
-    App.stackMapper.map(data);
+    App.stackMapper.map(data.items, "VersionDefinition");
     if (!this.decrementProperty('loadStacksRequestsCounter')) {
       if (!isStacksExistInDb) {
-        var defaultStackVersion = App.Stack.find().findProperty('id', App.defaultStackVersion);
+        var defaultStackVersion = App.Stack.find().findProperty('stackNameVersion', App.defaultStackVersion);
         if (defaultStackVersion) {
           defaultStackVersion.set('isSelected', true)
         } else {
@@ -320,7 +325,7 @@ App.InstallerController = App.WizardController.extend({
         }
       }
       this.set('content.stacks', App.Stack.find());
-      App.set('currentStackVersion', App.Stack.find().findProperty('isSelected').get('id'));
+      App.set('currentStackVersion', App.Stack.find().findProperty('isSelected').get('stackNameVersion'));
     }
   },
 
@@ -404,7 +409,6 @@ App.InstallerController = App.WizardController.extend({
    * @param stepController App.WizardStep5Controller
    */
   saveMasterComponentHosts: function (stepController) {
-
     var obj = stepController.get('selectedServicesMasters'),
       hosts = this.getDBProperty('hosts');
 
@@ -505,13 +509,174 @@ App.InstallerController = App.WizardController.extend({
     this.set('content.clients', clients);
   },
 
+  /*
+   * Post version definition file (.xml) to server
+   */
+  postVersionDefinitionFile: function (isXMLdata, data) {
+    var dfd = $.Deferred();
+    var name = isXMLdata? 'wizard.step1.post_version_definition_file.xml' : 'wizard.step1.post_version_definition_file.url';
+
+    App.ajax.send({
+      name: name,
+      sender: this,
+      data: {
+        dfd: dfd,
+        data: data
+      },
+      success: 'postVersionDefinitionFileSuccessCallback',
+      error: 'postVersionDefinitionFileErrorCallback'
+    });
+    return dfd.promise();
+  },
+
+  /**
+   * onSuccess callback for postVersionDefinitionFile.
+   */
+  postVersionDefinitionFileSuccessCallback: function (response, request, data) {
+    if (response.resources.length && response.resources[0].VersionDefinition) {
+      data.dfd.resolve(
+        {
+          stackName: response.resources[0].VersionDefinition.stack_name,
+          id: response.resources[0].VersionDefinition.id,
+          stackVersion: response.resources[0].VersionDefinition.stack_version
+        });
+    }
+  },
+
+  /**
+   * onError callback for postVersionDefinitionFile.
+   */
+  postVersionDefinitionFileErrorCallback: function (request, ajaxOptions, error, data, params) {
+    params.dfd.reject(data);
+    var header = Em.I18n.t('installer.step1.useLocalRepo.uploadFile.error.title');
+    var body = "";
+    if(request && request.responseText){
+      try {
+        var json = $.parseJSON(request.responseText);
+        body = json.message;
+      } catch (err) {}
+    }
+    App.showAlertPopup(header, body);
+  },
+
+  getSupportedOSList: function (stackName, stackVersion) {
+    return  App.ajax.send({
+      name: 'wizard.step1.get_supported_os_types',
+      sender: this,
+      data: {
+        stackName: stackName,
+        stackVersion: stackVersion
+      },
+      success: 'getSupportedOSListSuccessCallback',
+      error: 'getSupportedOSListErrorCallback'
+    });
+  },
+
+  /**
+   * onSuccess callback for getSupportedOSList.
+   */
+  getSupportedOSListSuccessCallback: function (response, request, data) {
+    if (response.operating_systems) {
+      this.set('allSupportedOS', response.operating_systems);
+    }
+  },
+
+  /**
+   * onError callback for getSupportedOSList
+   */
+  getSupportedOSListErrorCallback: function (request, ajaxOptions, error, data, params) {
+    var header = Em.I18n.t('installer.step1.useLocalRepo.getSurpottedOs.error.title');
+    var body = "";
+    if(request && request.responseText){
+      try {
+        var json = $.parseJSON(request.responseText);
+        body = json.message;
+      } catch (err) {}
+    }
+    App.showAlertPopup(header, body);
+  },
+
+  /*
+   * Get the specific repo by stack name, version and id
+   */
+  getRepoById: function (repo_id, stack_name, stack_version) {
+    var dfd = $.Deferred();
+    App.ajax.send({
+      name: 'wizard.step1.get_repo_version_by_id',
+      sender: this,
+      data: {
+        dfd: dfd,
+        stackName: stack_name,
+        stackVersion: stack_version,
+        repoId: repo_id
+      },
+      success: 'getRepoByIdSuccessCallback',
+      error: 'getRepoByIdErrorCallback'
+    });
+    return dfd.promise();
+  },
+
+  /**
+   * onSuccess callback for getRepoById.
+   */
+  getRepoByIdSuccessCallback: function (data, request, dataInfo) {
+    data = data.items[0];
+    var self = this;
+    // load the data info to display for details and contents panel
+    var response = {
+      id : data.repository_versions[0].RepositoryVersions.id,
+      stackVersion : data.Versions.stack_version,
+      stackName: data.Versions.stack_name,
+      type: data.repository_versions[0].RepositoryVersions.release? data.repository_versions[0].RepositoryVersions.release.type: null,
+      stackNameVersion: data.Versions.stack_name + '-' + data.Versions.stack_version, /// HDP-2.3
+      actualVersion: data.repository_versions[0].RepositoryVersions.repository_version, /// 2.3.4.0-3846
+      version: data.repository_versions[0].RepositoryVersions.release ? data.repository_versions[0].RepositoryVersions.release.version: null, /// 2.3.4.0
+      releaseNotes: data.repository_versions[0].RepositoryVersions.release ? data.repository_versions[0].RepositoryVersions.release.release_notes: null,
+      displayName: data.repository_versions[0].RepositoryVersions.release ? data.Versions.stack_name + '-' + data.repository_versions[0].RepositoryVersions.release.version :
+      data.Versions.stack_name + '-' + data.repository_versions[0].RepositoryVersions.repository_version.split('-')[0], //HDP-2.3.4.0
+      repoVersionFullName : data.Versions.stack_name + '-' + data.repository_versions[0].RepositoryVersions.repository_version,
+      osList: data.repository_versions[0].operating_systems,
+      updateObj: data.repository_versions[0]
+    };
+    var services = [];
+    data.repository_versions[0].RepositoryVersions.services.forEach(function (service) {
+      services.push({
+        name: service.name,
+        version: service.versions[0].version,
+        components: service.versions[0].components
+      });
+    });
+    response.services = services;
+
+    // to diaplay repos panel, should map all available operating systems including empty ones
+    this.getSupportedOSList(response.stackName, response.stackVersion).complete(function () {
+      var existedOS = data.repository_versions[0].operating_systems;
+      var existedMap = {};
+      existedOS.map(function (existedOS) {
+        existedOS.isSelected = true;
+        existedMap[existedOS.OperatingSystems.os_type] = existedOS;
+      });
+      self.get('allSupportedOS').forEach(function(supportedOS) {
+        if(!existedMap[supportedOS.OperatingSystems.os_type]) {
+          supportedOS.isSelected = false;
+          supportedOS.repositories.forEach(function(repo) {
+            repo.Repositories.base_url = '';
+          });
+          existedOS.push(supportedOS);
+        }
+      });
+      App.stackMapper.map(data.repository_versions, "RepositoryVersions");
+      dataInfo.dfd.resolve(response);
+    });
+  },
+
   /**
    * Check validation of the customized local urls
    */
   checkRepoURL: function (wizardStep1Controller) {
     var selectedStack = this.get('content.stacks').findProperty('isSelected', true);
     selectedStack.set('reload', true);
-    var nameVersionCombo = selectedStack.get('id');
+    var nameVersionCombo = selectedStack.get('stackNameVersion');
     var stackName = nameVersionCombo.split('-')[0];
     var stackVersion = nameVersionCombo.split('-')[1];
     var dfd = $.Deferred();

http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js b/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
index a056d3b..7a7d050 100644
--- a/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
+++ b/ambari-web/app/controllers/main/admin/stack_and_upgrade_controller.js
@@ -1794,5 +1794,36 @@ App.MainAdminStackAndUpgradeController = Em.Controller.extend(App.LocalStorage,
     newWindow = window.open();
     newWindow.document.write(output);
     newWindow.focus();
-  }
+  },
+
+  /**
+   * load version for services to display on Choose Servoces page
+   * should load from VersionDefinition endpoint
+   */
+  loadServiceVersionFromVersionDefinitions: function () {
+    return App.ajax.send({
+      name: 'cluster.load_current_repo_stack_services',
+      sender: this,
+      data: {
+        clusterName: App.clusterName
+      },
+      success: 'loadServiceVersionFromVersionDefinitionsSuccessCallback',
+      error: 'loadServiceVersionFromVersionDefinitionsErrorCallback'
+    });
+  },
+
+  serviceVersionsMap: {},
+  loadServiceVersionFromVersionDefinitionsSuccessCallback: function (jsonData) {
+    var rv = jsonData.items[0].repository_versions[0].RepositoryVersions;
+    var map = this.get('serviceVersionsMap');
+    if (rv) {
+      rv.stack_services.forEach(function (item) {
+        map[item.name] = item.versions[0];
+      });
+    }
+  },
+
+  loadServiceVersionFromVersionDefinitionsErrorCallback: function (request, ajaxOptions, error) {
+  },
+
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/ambari-web/app/controllers/main/service/add_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/service/add_controller.js b/ambari-web/app/controllers/main/service/add_controller.js
index 73abd59..a4fa9b7 100644
--- a/ambari-web/app/controllers/main/service/add_controller.js
+++ b/ambari-web/app/controllers/main/service/add_controller.js
@@ -192,7 +192,13 @@ App.AddServiceController = App.WizardController.extend(App.AddSecurityConfigs, {
       this.setSkipSlavesStep(App.StackService.find().filterProperty('isSelected').filterProperty('isInstalled', false), 3);
     }
     this.set('serviceToInstall', null);
-    this.set('content.services', App.StackService.find());
+    var self = this;
+    this.loadServiceVersionFromVersionDefinitions().complete(function () {
+      self.set('content.services', App.StackService.find().forEach(function (item) {
+        // user the service version from VersionDefinition
+        Ember.set(item, 'serviceVersionDisplay', self.get('serviceVersionsMap')[item.get('serviceName')]);
+      }));
+    });
   },
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/ambari-web/app/controllers/wizard.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard.js b/ambari-web/app/controllers/wizard.js
index c3d7f08..7b55545 100644
--- a/ambari-web/app/controllers/wizard.js
+++ b/ambari-web/app/controllers/wizard.js
@@ -681,6 +681,61 @@ App.WizardController = Em.Controller.extend(App.LocalStorage, App.ThemesMappingM
   },
 
   /**
+   * load version for services to display on Choose Servoces page
+   * should load from VersionDefinition endpoint
+   */
+  loadServiceVersionFromVersionDefinitions: function () {
+    if (this.get('name') == 'addServiceController') {
+      return App.ajax.send({
+        name: 'cluster.load_current_repo_stack_services',
+        sender: this,
+        data: {
+          clusterName: App.clusterName
+        },
+        success: '_loadServiceVersionFromVersionDefinitionsSuccessCallback',
+        error: 'loadServiceVersionFromVersionDefinitionsErrorCallback'
+      });
+    } else {
+      var seletedRepo = App.Stack.find().findProperty('isSelected');
+      var name = seletedRepo.get('showAvailable') ? 'wizard.get_shown_version_definition': 'wizard.get_version_definition';
+      if (seletedRepo) {
+        return App.ajax.send({
+          name: name,
+          sender: this,
+          data: {
+            repositoryVersion: seletedRepo.get('repositoryVersion')
+          },
+          success: 'loadServiceVersionFromVersionDefinitionsSuccessCallback',
+          error: 'loadServiceVersionFromVersionDefinitionsErrorCallback'
+        });
+      }
+    }
+  },
+
+  serviceVersionsMap: {},
+  loadServiceVersionFromVersionDefinitionsSuccessCallback: function (jsonData) {
+    var versionDefinitions = jsonData.items[0].VersionDefinition;
+    var map = this.get('serviceVersionsMap');
+    if (versionDefinitions) {
+      versionDefinitions.stack_services.forEach(function (item) {
+        map[item.name] = item.versions[0];
+      });
+    }
+  },
+
+  _loadServiceVersionFromVersionDefinitionsSuccessCallback: function (jsonData) {
+    var rv = jsonData.items[0].repository_versions[0].RepositoryVersions;
+    var map = this.get('serviceVersionsMap');
+    if (rv) {
+      rv.stack_services.forEach(function (item) {
+        map[item.name] = item.versions[0];
+      });
+    }
+  },
+  loadServiceVersionFromVersionDefinitionsErrorCallback: function (request, ajaxOptions, error) {
+  },
+
+  /**
    * Load config groups from local DB
    */
   loadServiceConfigGroups: function () {

http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/ambari-web/app/controllers/wizard/step1_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/wizard/step1_controller.js b/ambari-web/app/controllers/wizard/step1_controller.js
index c357bf4..dce66a3 100644
--- a/ambari-web/app/controllers/wizard/step1_controller.js
+++ b/ambari-web/app/controllers/wizard/step1_controller.js
@@ -31,7 +31,110 @@ App.WizardStep1Controller = Em.Controller.extend({
 
   selectedStack: function() {
     return App.Stack.find().findProperty('isSelected');
-  }.property('content.stacks.@each.isSelected')
+  }.property('content.stacks.@each.isSelected'),
 
+  optionsToSelect: {
+    'usePublicRepo': {
+      index: 0,
+      isSelected: true
+    },
+    'useLocalRepo': {
+      index: 1,
+      isSelected: false,
+      'uploadFile': {
+        index: 0,
+        name: 'uploadFile',
+        file: '',
+        hasError: false,
+        isSelected: true
+      },
+      'enterUrl': {
+        index: 1,
+        name: 'enterUrl',
+        url: 'http://',
+        hasError: false,
+        isSelected: false
+      }
+    }
+  },
 
+  /**
+   * Used to set version definition file from FileUploader
+   * @method setVDFFile
+   * @param {string} vdf
+   */
+  setVDFFile: function (vdf) {
+    this.set("optionsToSelect.useLocalRepo.uploadFile.file", vdf);
+  },
+
+  /**
+   * Load selected file to current page content
+   */
+  readVersionInfo: function(){
+    var data = {};
+    var isXMLdata = false;
+    var loadedVersionInfo = {};
+    if (this.get("optionsToSelect.usePublicRepo.isSelected")) return;
+    if (this.get("optionsToSelect.useLocalRepo.isSelected") && this.get("optionsToSelect.useLocalRepo.enterUrl.isSelected")) {
+      var url = this.get("optionsToSelect.useLocalRepo.enterUrl.url");
+      data = {
+        "VersionDefinition": {
+          "version_url": url
+        }
+      };
+    } else if (this.get("optionsToSelect.useLocalRepo.uploadFile.isSelected")) {
+      isXMLdata = true;
+      // load from file browser
+      data = this.get("optionsToSelect.useLocalRepo.uploadFile.file");
+    }
+
+    var installerController = App.router.get('installerController');
+    var self = this;
+    installerController.postVersionDefinitionFile(isXMLdata, data).done(function (versionInfo) {
+      if (versionInfo.id && versionInfo.stackName && versionInfo.stackVersion) {
+        installerController.getRepoById(versionInfo.id, versionInfo.stackName, versionInfo.stackVersion).done(function(response) {
+          loadedVersionInfo.id = response.id;
+          loadedVersionInfo.isPatch = response.type == 'PATCH';
+          loadedVersionInfo.stackNameVersion = response.stackNameVersion;
+          loadedVersionInfo.displayName = response.displayName;
+          loadedVersionInfo.version = response.version || 'n/a';
+          loadedVersionInfo.actualVersion = response.actualVersion || 'n/a';
+          loadedVersionInfo.updateObj = response.updateObj;
+          loadedVersionInfo.upgradeStack = {
+            stack_name: response.stackName,
+            stack_version: response.stackVersion,
+            display_name: response.displayName
+          };
+          loadedVersionInfo.services = response.services || [];
+          loadedVersionInfo.repoVersionFullName = response.repoVersionFullName;
+          self.set('loadedVersionInfo', loadedVersionInfo);
+          self.set('latestSelectedLocalRepoId', response.repoVersionFullName);
+
+          Ember.run.next(function () {
+            $("[rel=skip-validation-tooltip]").tooltip({ placement: 'right'});
+            $("[rel=use-redhat-tooltip]").tooltip({ placement: 'right'});
+          });
+          // load successfully, so make this local stack repo as selectedStack
+          self.get('content.stacks').setEach('isSelected', false);
+          self.get('content.stacks').findProperty('id', response.repoVersionFullName).set('isSelected', true);
+        })
+      }
+    });
+  },
+
+  /**
+   * On click handler for removing OS
+   */
+  removeOS: function(event) {
+    var osToRemove = event.context;
+    Em.set(osToRemove, 'isSelected', false);
+  },
+
+  /**
+   * On click handler for adding new OS
+   */
+  addOS: function(event) {
+    var osToAdd = event.context;
+    Em.set(osToAdd, 'isSelected', true);
+  }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/ambari-web/app/mappers/repository_version_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/repository_version_mapper.js b/ambari-web/app/mappers/repository_version_mapper.js
index 67cfe64..816308b 100644
--- a/ambari-web/app/mappers/repository_version_mapper.js
+++ b/ambari-web/app/mappers/repository_version_mapper.js
@@ -128,6 +128,17 @@ App.repoVersionMapper = App.QuickDataMapper.create({
               serviceArray.pushObject(serviceObj);
               resultService.push(this.parseIt(serviceObj, this.get('modelService')));
             }, this);
+          } else if (item[repoVersionsKey].stack_services) {
+            item[repoVersionsKey].stack_services.forEach(function (service) {
+              var serviceObj = {
+                id: service.name,
+                name: service.name,
+                display_name: service.display_name,
+                latest_version: service.versions[0] ? service.versions[0]: ''
+              };
+              serviceArray.pushObject(serviceObj);
+              resultService.push(this.parseIt(serviceObj, this.get('modelService')));
+            }, this);
           }
           repo.operating_systems = osArray;
           repo.services = serviceArray;

http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/ambari-web/app/mappers/stack_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/stack_mapper.js b/ambari-web/app/mappers/stack_mapper.js
index 75245e0..784431a 100644
--- a/ambari-web/app/mappers/stack_mapper.js
+++ b/ambari-web/app/mappers/stack_mapper.js
@@ -21,11 +21,14 @@ App.stackMapper = App.QuickDataMapper.create({
   modelStack: App.Stack,
   modelOS: App.OperatingSystem,
   modelRepo: App.Repository,
+  modelServices: App.ServiceSimple,
   
   configStack: {
     id: 'id',
     stack_name: 'stack_name',
     stack_version: 'stack_version',
+    show_available: 'show_available',
+    repository_version: 'repository_version',
     active: 'active',
     parent_stack_version: 'parent_stack_version',
     min_upgrade_version: 'min_upgrade_version',
@@ -33,6 +36,11 @@ App.stackMapper = App.QuickDataMapper.create({
     max_jdk_version: 'max_jdk',
     is_selected: 'is_selected',
     config_types: 'config_types',
+    stack_services_key: 'stack_services',
+    stack_services_type: 'array',
+    stack_services: {
+      item: 'id'
+    },
     operating_systems_key: 'operating_systems',
     operating_systems_type: 'array',
     operating_systems: {
@@ -46,12 +54,20 @@ App.stackMapper = App.QuickDataMapper.create({
     stack_name: 'stack_name',
     stack_version: 'stack_version',
     stack_id: 'stack_id',
+    is_selected: 'is_selected',
     repositories_key: 'repositories',
     repositories_type: 'array',
     repositories: {
       item: 'id'
     }
   },
+
+  configService: {
+    id: 'id',
+    name: 'name',
+    display_name: 'display_name',
+    latest_version: 'latest_version'
+  },
   
   configRepository: {
     id: 'id',
@@ -67,42 +83,59 @@ App.stackMapper = App.QuickDataMapper.create({
     operating_system_id: 'os_id'
   },
   
-  map: function(json) {
+  map: function(json, key) {
     var modelStack = this.get('modelStack');
     var modelOS = this.get('modelOS');
     var modelRepo = this.get('modelRepo');
+    var modelServices = this.get('modelServices');
     var resultStack = [];
     var resultOS = [];
     var resultRepo = [];
+    var resultServices = [];
 
-    var stackVersions = json.items.filterProperty('Versions.active');
-    stackVersions.sortProperty('Versions.stack_version').reverse().forEach(function(item) {
-      var stack = item.Versions;
+    var stackVersions = json;
+    var propertiesKey = key;
+    stackVersions.sortProperty(key + '.stack_version').reverse().forEach(function(item) {
+      var stack = item[key];
       var operatingSystemsArray = [];
+      var servicesArray = [];
 
-      stack.id = stack.stack_name + "-" + stack.stack_version;
+      stack.id = stack.stack_name + "-" + stack.repository_version;
 
       item.operating_systems.forEach(function(ops) {
         var operatingSystems = ops.OperatingSystems;
 
         var repositoriesArray = [];
         ops.repositories.forEach(function(repo) {
-          repo.Repositories.id = [repo.Repositories.stack_name, repo.Repositories.stack_version, repo.Repositories.os_type, repo.Repositories.repo_id].join('-');
-          repo.Repositories.os_id = [repo.Repositories.stack_name, repo.Repositories.stack_version, repo.Repositories.os_type].join('-');
+          repo.Repositories.id = [stack.id, repo.Repositories.os_type, repo.Repositories.repo_id].join('-');
+          repo.Repositories.os_id = [stack.id, repo.Repositories.os_type].join('-');
+          if (!repo.Repositories.latest_base_url)  repo.Repositories.latest_base_url = repo.Repositories.base_url;
           resultRepo.push(this.parseIt(repo.Repositories, this.get('configRepository')));
           repositoriesArray.pushObject(repo.Repositories);
         }, this);
 
 
-        operatingSystems.id = operatingSystems.stack_name + "-" + operatingSystems.stack_version + "-" + operatingSystems.os_type;
+        operatingSystems.id = stack.id + "-" + operatingSystems.os_type;
         operatingSystems.stack_id = operatingSystems.stack_name + "-" + operatingSystems.stack_version;
         operatingSystems.repositories = repositoriesArray;
+        operatingSystems.is_selected = (ops.isSelected == true || ops.isSelected == undefined);
         resultOS.push(this.parseIt(operatingSystems, this.get('configOS')));
         operatingSystemsArray.pushObject(operatingSystems);
         
       }, this);
-      
 
+      stack.stack_services.forEach(function(service) {
+        var serviceObj = {
+          id: service.name + '-' + stack.id,
+          name: service.name,
+          display_name: service.display_name,
+          latest_version: service.versions? service.versions[0] : ''
+        };
+        resultServices.push(this.parseIt(serviceObj, this.get('configService')));
+        servicesArray.pushObject(serviceObj);
+      }, this);
+
+      stack.stack_services = servicesArray;
       stack.operating_systems = operatingSystemsArray;
       resultStack.push(this.parseIt(stack, this.get('configStack')));
       
@@ -111,6 +144,7 @@ App.stackMapper = App.QuickDataMapper.create({
     App.store.commit();
     App.store.loadMany(modelRepo, resultRepo);
     App.store.loadMany(modelOS, resultOS);
+    App.store.loadMany(modelServices, resultServices);
     App.store.loadMany(modelStack, resultStack);
   }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index 2e4f648..d9064ea 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -541,8 +541,28 @@ Em.I18n.translations = {
   'installer.step0.clusterName.error.whitespace':'Cluster Name cannot contain whitespace',
   'installer.step0.clusterName.error.specialChar':'Cluster Name cannot contain special characters',
 
-  'installer.step1.header':'Select Stack',
-  'installer.step1.body':'Please select the service stack that you want to use to install your Hadoop cluster.',
+  'installer.step1.header':'Select Version',
+  'installer.step1.body':'Select the software version and method of delivery for your cluster. Using a Public Repository requires Internet connectivity. Using a Local Repository requires you have configured the software in a repository available in your network.',
+  'installer.step1.selectUseRepoOptions.public':'Use Public Repository',
+  'installer.step1.selectUseRepoOptions.local':'Use Local Repository',
+  'installer.step1.usePublicRepo.ReposList.empty':'No other repositories',
+  'installer.step1.usePublicRepo.viewRepos':'View Repositories',
+  'installer.step1.useLocalRepo.uploadFile': 'Upload Version Definition File',
+  'installer.step1.useLocalRepo.uploadFile.error.title': 'Upload Version Definition File Error',
+  'installer.step1.useLocalRepo.getSurpottedOs.error.title': 'Cannot get supportted OS types',
+  'installer.step1.useLocalRepo.addRepo.button': 'Add Repository',
+  'installer.step1.useLocalRepo.enterUrl': 'Version Definition File URL',
+  'installer.step1.useLocalRepo.readButton': 'Read Version Info',
+  'installer.step1.useLocalRepo.infoForm.details.title': 'Details',
+  'installer.step1.useLocalRepo.infoForm.details.stackName': 'Stack Name',
+  'installer.step1.useLocalRepo.infoForm.details.displayName': 'Display Name',
+  'installer.step1.useLocalRepo.infoForm.details.version': 'Version',
+  'installer.step1.useLocalRepo.infoForm.details.actualVersion': 'Actual Version',
+  'installer.step1.useLocalRepo.infoForm.details.releaseNotes': 'Release Notes',
+  'installer.step1.useLocalRepo.infoForm.content.title': 'Contents',
+  'installer.step1.useLocalRepo.infoForm.content.empty': 'No contents to display',
+  'installer.step1.useLocalRepo.infoForm.alert.baseUrl': 'Provide Base URLs for the Operating Systems you are configuring.',
+  'installer.step1.useLocalRepo.infoForm.alert.warning': 'Some of the repositories failed validation. Make changes to the base url or skip validation if you are sure that urls are correct',
   'installer.step1.advancedRepo.title':'Advanced Repository Options',
   'installer.step1.advancedRepo.message':'Customize the repository Base URLs for downloading the Stack software packages. If your hosts do not have access to the internet, you will have to create a local mirror of the Stack repository that is accessible by all hosts and use those Base URLs here.',
   'installer.step1.advancedRepo.importantMassage':'<b>Important:</b> When using local mirror repositories, you only need to provide Base URLs for the Operating System you are installing for your Stack. Uncheck all other repositories.',

http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/ambari-web/app/models/stack.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/stack.js b/ambari-web/app/models/stack.js
index 0b1c9d2..8157ab2 100644
--- a/ambari-web/app/models/stack.js
+++ b/ambari-web/app/models/stack.js
@@ -19,18 +19,20 @@
 var App = require('app');
 
 App.Stack = DS.Model.extend({
-  id: DS.attr('string'), //  ${stackName}-${stackVersion}.
+  id: DS.attr('string'), //  ${stackName}-${repoVersion}.
   stackName: DS.attr('string'),
   stackVersion: DS.attr('string'),
-  active: DS.attr('boolean'),  // All of the instances should have this value to true. We should map only those stacks that has active flag set to true
-  parentStackVersion: DS.attr('string'),
-  minUpgradeVersion: DS.attr('string'),
-  minJdkVersion: DS.attr('string'),
-  maxJdkVersion: DS.attr('string'),
-  configTypes: DS.attr('object'),
+  repositoryVersion: DS.attr('string'),
+  showAvailable: DS.attr('boolean'),  // All of the instances should have this value to true. We should map only those stacks that has this flag set to true
+  stackServices: DS.hasMany('App.ServiceSimple'),
   operatingSystems: DS.hasMany('App.OperatingSystem'),
   isSelected: DS.attr('boolean', {defaultValue: false}),
 
+  stackNameVersion: function () {
+    //${stackName}-${stackVersion}.
+    return this.get('stackName') + '-' + this.get('stackVersion');
+  }.property('stackName', 'stackVersion'),
+
   /**
    * @return: {Array} returns supported repositories for all OperatingSystem's supported by a stack instance
    */
@@ -43,30 +45,8 @@ App.Stack = DS.Model.extend({
       }, this);
     }, this);
     return repositories;
-  }.property('id'),
-
-  /**
-   * @return: {Array} App.StackService instances for selected stack instance. For non-selected stack instance returns empty array
-   */
-  services: function () {
-    var result = [];
-    var isStackSelected = this.get('isSelected');
-    var stackServices = App.StackService.find().get('length');
-    if (isStackSelected && stackServices) {
-      result = App.StackService.find();
-    }
-    return result;
-  }.property('isSelected'),
-
-  /**
-   * Right now there ambari-web is not fetching this information from the server as it does not need as of present.
-   * @TODO: This should return stack level configurations for selected stack instance i.e properties of cluster-env file
-   */
-  configurations: function() {
-    return [];
-  }.property('isSelected')
-
+  }.property('id')
 });
 
 
-App.Stack.FIXTURES = [];
+App.Stack.FIXTURES = [];
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/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 2aaf1c1..bdb4814 100644
--- a/ambari-web/app/routes/add_service_routes.js
+++ b/ambari-web/app/routes/add_service_routes.js
@@ -101,7 +101,14 @@ module.exports = App.WizardRoute.extend({
         controller.loadAllPriorSteps().done(function () {
           var wizardStep4Controller = router.get('wizardStep4Controller');
           wizardStep4Controller.set('wizardController', controller);
-          controller.connectOutlet('wizardStep4', controller.get('content.services').filterProperty('isInstallable', true));
+          controller.loadServiceVersionFromVersionDefinitions().complete(function () {
+            controller.set('content.services', App.StackService.find().forEach(function (item) {
+              // user the service version from VersionDefinition
+              Ember.set(item, 'serviceVersionDisplay', controller.get('serviceVersionsMap')[item.get('serviceName')]);
+              //item.set('serviceVersionDisplay', controller.get('serviceVersionsMap')[item.get('serviceName')]);
+            }));
+            controller.connectOutlet('wizardStep4', controller.get('content.services').filterProperty('isInstallable', true));
+          });
         });
       });
     },

http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/ambari-web/app/styles/application.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/application.less b/ambari-web/app/styles/application.less
index 61ccbfa..fb46bfc 100644
--- a/ambari-web/app/styles/application.less
+++ b/ambari-web/app/styles/application.less
@@ -6199,6 +6199,183 @@ input[type="radio"].align-checkbox, input[type="checkbox"].align-checkbox {
   margin-left: -10px;
 }
 
+#select-stack .stack-version-selection{
+  .tabs-left {
+    border-bottom: none;
+    padding-top: 20px;
+    border-right: 1px solid #ddd;
+    min-height: 264px;
+  }
+  .tabs-left>li {
+    float: none;
+    margin-bottom: 2px;
+    margin-right: -1px;
+  }
+  .tabs-left>li.active>a,
+  .tabs-left>li.active>a:hover,
+  .tabs-left>li.active>a:focus {
+    border-color: #ddd transparent #ddd #ddd;
+  }
+  .tabs-left>li>a:hover,
+  .tabs-left>li>a:focus {
+    border-color: #eeeeee #dddddd #eeeeee #eeeeee;
+  }
+  .tabs-left>li>a {
+    border-radius: 4px 0 0 4px;
+    padding: 5px 10px;
+    margin-right: 0;
+    display:block;
+  }
+  .right-stack-info {
+    margin-left: 0px;
+    padding: 10px 20px;
+    border: 1px solid;
+    border-color: #ddd #ddd #ddd transparent;
+    .available-repos-dropdown {
+      a, a.disbled{
+        cursor: pointer;
+      }
+      a.disabled{
+        color: #999999;
+        background: none;
+      }
+    }
+    .services-list {
+      padding: 20px 20px;
+      margin-top: 10px;
+      border: 1px #ddd solid;
+      background-color: #f5f5f5;
+      height: 150px;
+      max-height: 150px;
+      overflow: auto;
+      .control-label {
+        font-weight: bold;
+        min-height: 20px;
+        line-height: 12px;
+      }
+      .version-info {
+        //padding-top: 2px;
+        line-height: 12px;
+      }
+    }
+    .badge.badge-important {
+      margin: 6px 3px;
+    }
+    a.view-repos {
+      cursor: pointer;
+      text-decoration: none;
+      padding: 5px 5px;
+    }
+
+  }
+}
+#select-stack .stack-version-selection.disabled{
+  background-color: #dddddd;
+  display: none;
+}
+
+#select-stack {
+  .big-radio {
+    font-weight: bold;
+    padding: 5px 15px;
+  }
+  #upload-definition-file-panel {
+    .register-version-options {
+      padding: 5px 0px;
+      .local-option-label {
+        margin-left: 20px;
+        padding-top: 4px;
+      }
+    }
+    .vdf-url {
+      input {
+        width: 80%;
+      }
+    }
+    .read-info-button {
+      margin: 10px 0px;
+    }
+  }
+}
+#select-stack #localVersionInfoForm {
+  .accordion-heading {
+    background-color: #f0f0f0;
+    font-weight: bold;
+    p {
+      margin-bottom: 0px;
+      display: block;
+      padding: 8px 15px;
+    }
+  }
+  .accordion-body {
+    .control-label {
+      font-weight: bold;
+      line-height: 14px;
+    }
+    .version-info {
+      padding-top: 5px;
+      line-height: 14px;
+    }
+  }
+  .details-panel .patch-icon {
+    color: #ff4500;
+  }
+  .contents-panel .version-contents-body {
+    max-height: 150px;
+    overflow: auto;
+  }
+  .repos-panel {
+    .remove-icon {
+      color: red;
+      margin: 20px 0px;
+      padding: 0px;
+      text-align: center;
+      cursor: pointer;
+    }
+    .border-bottom {
+      border-bottom: 1px solid #ebebeb;
+    }
+    .repo-table-title {
+      padding-left: 5px;
+      border-bottom: 1px solid #ebebeb;
+      label {
+        font-weight: bold;
+      }
+    }
+    .os-type-label {
+      margin-top: 27px;
+      padding-left: 10px;
+      label {
+        font-weight: bold;
+      }
+    }
+    .repo-name-label {
+      text-align: left;
+      padding-top: 10px;
+    }
+    .repo-name-url {
+      padding: 8px 0px;
+    }
+    .repo-url input {
+      width: 90%;
+      height: 24px;
+    }
+    .add-os-button {
+      margin-top:10px;
+    }
+    #skip-validation {
+      margin-top: 25px;
+    }
+    #use-redhat, #skip-validation {
+      .icon-question-sign {
+        color: #0572ff;
+      }
+      input{
+        margin: 0px 10px;
+      }
+    }
+  }
+}
 #combo_search_box {
   .VS-search {
     .VS-search-box {

http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/ambari-web/app/templates/main/admin/stack_upgrade/services.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/admin/stack_upgrade/services.hbs b/ambari-web/app/templates/main/admin/stack_upgrade/services.hbs
index a87c50c..8ba51e8 100644
--- a/ambari-web/app/templates/main/admin/stack_upgrade/services.hbs
+++ b/ambari-web/app/templates/main/admin/stack_upgrade/services.hbs
@@ -30,7 +30,7 @@
     {{#each service in view.services}}
     <tr>
       <td class="service-display-name">{{service.displayName}}</td>
-      <td class="service-stack-version">{{service.serviceVersion}}</td>
+      <td class="service-stack-version">{{service.serviceVersionDisplay}}</td>
       <td class="stack-version-state">
         {{#if service.isInstalled}}
           <span class="label label-success">{{t common.installed}}</span>

http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/ambari-web/app/templates/wizard/step1.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/wizard/step1.hbs b/ambari-web/app/templates/wizard/step1.hbs
index ab9a0dd..fc05980 100644
--- a/ambari-web/app/templates/wizard/step1.hbs
+++ b/ambari-web/app/templates/wizard/step1.hbs
@@ -17,109 +17,213 @@
 }}
 <div id="select-stack">
   <h2>{{t installer.step1.header}}</h2>
-  <p class="alert alert-info">
-    {{t installer.step1.body}}
-  </p>
-  <p><b>{{t common.stacks}}</b></p>
-  <form autocomplete="off">
-    {{#each stack in view.stacks}}
-      <label class="radio">{{view view.stackRadioButton contentBinding="stack"}} {{stack.name}}</label>
-    {{/each}}
-  </form>
+  <p class="alert alert-info">{{t installer.step1.body}}</p>
 
+  <label class="radio big-radio">{{view view.usePublicRepoRadioButton}} {{t installer.step1.selectUseRepoOptions.public}}</label>
 
-  <div class="accordion" id="advancedRepoAccordion">
-    <div class="accordion-group">
-      <div class="accordion-heading" {{action "onToggleBlock" target="view"}}>
-        <i {{bindAttr class=":pull-left :accordion-toggle view.isRLCollapsed:icon-caret-right:icon-caret-down"}}></i>
-        <a class="accordion-toggle">
-          {{t installer.step1.advancedRepo.title}}
-          {{#if view.showErrorsWarningCount}}
-            <span class="badge badge-important">{{view.totalErrorCnt}}</span>
+    <form {{bindAttr class="optionsToSelect.useLocalRepo.isSelected:disabled :stack-version-selection :row-fluid"}}>
+      <div class="span2 left-menu-tabs">
+        <ul class="nav nav-tabs tabs-left sideways">
+          {{#each stack in view.stackNames}}
+            {{#if stack.name}}
+              <li {{bindAttr class="stack.isActive:active"}}>
+                <a {{bindAttr href="stack.name"}} data-toggle="tab"
+                    {{action "selectStackNameOnTab" stack target="view"}}>{{stack.name}}</a></li>
+            {{/if}}
+          {{/each}}
+        </ul>
+      </div>
+      <div class="span9 right-stack-info">
+        <div class="repo-list-button btn-group">
+          <button class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
+            {{controller.selectedStack.repositoryVersion}} &nbsp;<span class="caret"></span>
+          </button>
+          <ul class="dropdown-menu available-repos-dropdown">
+            {{#if view.availableStackRepoList}}
+              {{#each repo in view.availableStackRepoList}}
+                {{#if repo.repositoryVersion}}
+                  <li><a {{action "selectRepoInList" repo target="view"}}>{{repo.repositoryVersion}}</a></li>
+                {{/if}}
+              {{/each}}
+            {{else}}
+              <li><a class="disabled">{{t installer.step1.usePublicRepo.ReposList.empty}}</a></li>
+            {{/if}}
+          </ul>
+        </div>
+        <div class="services-list">
+          {{#each service in view.selectedServices}}
+            <div class="clearfix row-fluid">
+              <label class="control-label span4">{{service.displayName}}</label>
+              <div class="version-info span8">{{service.version}}</div>
+            </div>
+          {{/each}}
+        </div>
+
+        {{#if view.showErrorsWarningCount}}
+          <span class="badge badge-important pull-right">{{view.totalErrorCnt}}</span>
+        {{/if}}
+        <a class="view-repos pull-right"{{action "viewRepositories" target="view"}}>{{t installer.step1.usePublicRepo.viewRepos}}</a>
+      </div>
+    </form>
+
+
+    {{!--Local repo loaded info below--}}
+  <label class="radio big-radio">{{view view.useLocalRepoRadioButton}} {{t installer.step1.selectUseRepoOptions.local}}</label>
+  {{#if optionsToSelect.useLocalRepo.isSelected}}
+    <div id="upload-definition-file-panel" >
+      <div class="clearfix register-version-options row-fluid">
+        <div class="span5 option-radio-button">
+          <label class="local-option-label radio">
+            {{view view.uploadFileRadioButton}} {{t installer.step1.useLocalRepo.uploadFile}}
+          </label>
+        </div>
+        <div class="span7">
+          {{#if view.isFileApi}}
+            {{view App.VersionDefinitionFileUploader disabledBinding="optionsToSelect.useLocalRepo.enterUrl.isSelected"}}
           {{/if}}
-        </a>
+        </div>
       </div>
-      <div class="accordion-body collapse in">
-        <div class="accordion-inner">
-          <div class="alert alert-info">{{t installer.step1.advancedRepo.message}}</div>
-          <div class="alert alert-warning">{{t installer.step1.advancedRepo.importantMassage}}</div>
+      <div class="clearfix register-version-options row-fluid">
+        <div class="span5 option-radio-button">
+          <label class="local-option-label radio">
+            {{view view.enterUrlRadioButton}} {{t installer.step1.useLocalRepo.enterUrl}}
+          </label>
+        </div>
+        <div class="span7 vdf-url">
+          <div {{bindAttr class="optionsToSelect.useLocalRepo.enterUrl.name optionsToSelect.useLocalRepo.enterUrl.url.hasError:has-error }"}}>
+            {{view Ember.TextField valueBinding="optionsToSelect.useLocalRepo.enterUrl.url" disabledBinding="optionsToSelect.useLocalRepo.uploadFile.isSelected"}}
+          </div>
+        </div>
+        <div class="span12 read-info-button">
+          <button {{bindAttr class="view.readInfoButtonDisabled:disabled :btn :btn-primary :pull-right"}}
+            {{action "readVersionInfo" target="controller"}}> {{t installer.step1.useLocalRepo.readButton}}</button>
+        </div>
+      </div>
+    </div>
 
-          <div class="repositories-table">
-            <div class="thead">
-              <div class="first-th">&nbsp;</div>
-              <div class="th os-th">{{t common.os}}</div>
-              <div class="th name-th">{{t common.name}}</div>
-              <div class="th url-th">{{t installer.step1.advancedRepo.localRepo.column.baseUrl}}</div>
+  {{#if loadedVersionInfo.stackNameVersion}}
+    <form id="localVersionInfoForm" class="form-horizontal" role="form" name="localVersionInfoForm" novalidate>
+      <div class="accordion-group details-panel">
+        <div class="accordion-heading">
+          <p>{{t installer.step1.useLocalRepo.infoForm.details.title}}</p>
+        </div>
+        <div class="accordion-body">
+          <div class="accordion-inner">
+            <div class="row-fluid">
+                <label class="control-label span3">{{t installer.step1.useLocalRepo.infoForm.details.stackName}}</label>
+                <div class="version-info span7">{{loadedVersionInfo.stackNameVersion}}</div>
+                {{#if loadedVersionInfo.isPatch}}
+                    <div class="span2 patch-icon"><i class="icon-umbrella"></i>&nbsp;{{t common.patch}}</div>
+                {{/if}}
             </div>
-            <div class="tbody">
+            <div class="row-fluid">
+                <label class="control-label span3">{{t installer.step1.useLocalRepo.infoForm.details.displayName}}</label>
+                <div class="version-info span9">{{loadedVersionInfo.displayName}}</div>
+            </div>
+            <div class="row-fluid">
+                <label class="control-label span3">{{t installer.step1.useLocalRepo.infoForm.details.version}}</label>
+                <div class="version-info span9">{{loadedVersionInfo.version}}</div>
+            </div>
+            <div class="row-fluid">
+                <label class="control-label span3">{{t installer.step1.useLocalRepo.infoForm.details.actualVersion}}</label>
+                <div class="version-info span9">{{loadedVersionInfo.actualVersion}}</div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="accordion-group contents-panel">
+        <div class="accordion-heading">
+          <p>{{t installer.step1.useLocalRepo.infoForm.content.title}}</p>
+        </div>
+        <div class="accordion-body version-contents-body">
+          <div class="accordion-inner">
+            {{#unless loadedVersionInfo.services}}
+              <div class="alert alert-info" role="alert">{{t installer.step1.useLocalRepo.infoForm.content.empty}}</div>
+            {{/unless}}
+            {{#each service in loadedVersionInfo.services}}
+              <div class="clearfix row-fluid">
+                <label class="control-label span3">{{service.name}}</label>
+                <div class="version-info span9">{{service.version}}</div>
+              </div>
+            {{/each}}
+            </div>
+        </div>
+      </div>
+      <div class="accordion-group repos-panel">
+        <div class="accordion-heading">
+          <p>{{t common.repositories}}</p>
+        </div>
+          <div class="accordion-body version-contents-body">
+            <div class="accordion-inner">
+              <div class="alert alert-info" role="alert">{{t installer.step1.useLocalRepo.infoForm.alert.baseUrl}}</div>
+              {{#if view.hasValidationErrors}}
+                <div class="alert alert-warning" role="alert">{{t installer.step1.useLocalRepo.infoForm.alert.warning}}</div>
+              {{/if}}
+
+              <div class="clearfix repo-table-title row-fluid">
+                <div class="span2"><label>{{t common.os}}</label></div>
+                <div class="span2"><label>{{t common.name}}</label></div>
+                <div class="span7"><label>{{t installer.step1.advancedRepo.localRepo.column.baseUrl}}</label></div>
+              </div>
+
               {{#each operatingSystem in view.operatingSystems}}
-                <div class="trow">
-                  <div {{bindAttr class=":os-td operatingSystem.osType"}}>
-                    <label>
-                      {{view Ember.Checkbox checkedBinding="operatingSystem.isSelected"}}
-                      <span {{bindAttr class=":os operatingSystem.isSelected::disabled-label"}}>{{operatingSystem.osType}}</span>
-                    </label>
-                  </div>
-                  <div style="width:83%">
-                    {{#each repository in operatingSystem.repositories}}
-                      <div class="sub-trow">
-                        <div class="name-td">{{repository.repoId}}</div>
-                        <div class="validation-td">
-                          {{#if repository.validation}}
-                            {{view view.popoverView repositoryBinding="repository"}}
-                          {{/if}}
-                        </div>
-                        <div {{bindAttr class=":url-td operatingSystem.osType repository.repoId repository.invalidFormatError:textfield-error repository.invalidError:textfield-error"}}>
-                          {{view Ember.TextField valueBinding="repository.baseUrl" disabledBinding="operatingSystem.isDeselected"}}
-                        </div>
-                        <div class="clear-td">
-                          {{#if repository.clearAll}}
-                            <a {{action "clearGroupLocalRepository" repository target="view" }} {{bindAttr class="operatingSystem.isSelected::disabled-clear-button"}}>
-                              <i class="icon-remove-sign"></i>
-                            </a>
-                          {{/if}}
+                {{#if operatingSystem.isSelected}}
+                  <div class="clearfix row-fluid border-bottom">
+                    <div class="span2 os-type-label">
+                      <label>{{operatingSystem.osType}}</label>
+                    </div>
+                    <div class="span9">
+                      {{#each repository in operatingSystem.repositories}}
+                        <div class="repo-name-url row-fluid" {{bindAttr class="repository.hasError:has-error"}} >
+                          <label class="repo-name-label control-label span3">{{repository.repoId}}</label>
+                          <div class="validation-td span1">
+                            {{#if repository.validation}}
+                                {{view view.popoverView repositoryBinding="repository"}}
+                            {{/if}}
+                          </div>
+                          <div {{bindAttr class=":span8 :repo-url repository.invalidFormatError:textfield-error repository.invalidError:textfield-error"}}>
+                            {{view Ember.TextField valueBinding="repository.baseUrl"}}
+                          </div>
                         </div>
-                        <div class="actions-td">
-                          {{#if repository.undo}}
-                            <a {{action "undoGroupLocalRepository" repository target="view" }}>
-                              <i class="icon-undo"></i>{{t common.undo}}
-                            </a>
-                          {{/if}}
-                        </div>
-                      </div>
-                    {{/each}}
+                      {{/each}}
+                    </div>
+                    <div class="span1 remove-icon" {{action "removeOS" operatingSystem target="controller"}}><i class="icon-minus"></i>{{t common.remove}}</div>
                   </div>
-                </div>
+                {{/if}}
               {{/each}}
+
+              <div class="add-os-button btn-group pull-right">
+                <button class="btn dropdown-toggle" data-toggle="dropdown">
+                  <i class="icon-plus"></i> {{t common.add}} &nbsp;<span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu">
+                  {{#each operatingSystem in view.operatingSystems}}
+                    {{#unless operatingSystem.isSelected}}
+                      <li><a {{action "addOS" operatingSystem target="controller"}}>{{operatingSystem.osType}}</a></li>
+                    {{/unless}}
+                  {{/each}}
+                </ul>
+              </div>
+              <div id="skip-validation">
+                <label>{{view Ember.Checkbox checkedBinding="skipValidationChecked" class="checkbox"}}{{t installer.step1.advancedRepo.skipValidation.message}}
+                  <i class="icon-question-sign" rel="skip-validation-tooltip"
+                     data-toggle="tooltip" {{translateAttr title="installer.step1.advancedRepo.skipValidation.tooltip"}}></i></label>
+              </div>
+              <div id="use-redhat">
+                <label>{{view Ember.Checkbox classNames="align-checkbox" checkedBinding="useRedhatSatellite"}}{{t installer.step1.advancedRepo.useRedhatSatellite.message}}
+                  <i class="icon-question-sign" rel="use-redhat-tooltip"
+                    data-toggle="tooltip" {{translateAttr title="installer.step1.advancedRepo.useRedhatSatellite.tooltip"}}>
+                  </i>
+                </label>
+              </div>
             </div>
           </div>
-          <div id="skip-validation">
-            <label>{{view Ember.Checkbox checkedBinding="skipValidationChecked" class="checkbox"}}{{t installer.step1.advancedRepo.skipValidation.message}}
-              <i class="icon-question-sign" rel="skip-validation-tooltip"
-                 data-toggle="tooltip" {{translateAttr title="installer.step1.advancedRepo.skipValidation.tooltip"}}></i></label>
-          </div>
-          <div id="use-redhat">
-            <label>{{view Ember.Checkbox classNames="align-checkbox" checkedBinding="useRedhatSatellite"}}{{t installer.step1.advancedRepo.useRedhatSatellite.message}}
-              <i class="icon-question-sign" rel="use-redhat-tooltip"
-                 data-toggle="tooltip" {{translateAttr title="installer.step1.advancedRepo.useRedhatSatellite.tooltip"}}></i></label>
-          </div>
-          {{#if view.invalidFormatUrlExist}}
-            <div class="alert">{{t installer.step1.attentionNeeded}}</div>
-          {{/if}}
-          {{#if view.invalidUrlExist}}
-            <div class="alert">
-              {{t installer.step1.invalidURLAttention}}
-              <a href="javascript:void(null)" {{action "retryRepoUrls" target="view"}}>{{t installer.step1.retryRepoUrls}}</a>
-            </div>
-          {{/if}}
-          {{#if view.allRepoUnchecked}}
-            <div class="alert">{{t installer.step1.checkAtLeastOneAttention}}</div>
-          {{/if}}
-        </div>
       </div>
-    </div>
-  </div>
+    </form>
+  {{/if}}
+  {{/if}}
 
   <a class="btn pull-left installer-back-btn" {{action back}}>&larr; {{t common.back}}</a>
   <button class="btn btn-success pull-right" {{bindAttr disabled="view.isSubmitDisabled"}} {{action next}}>{{t common.next}} &rarr;</button>
+
 </div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/ambari-web/app/templates/wizard/step1_viewRepositories.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/wizard/step1_viewRepositories.hbs b/ambari-web/app/templates/wizard/step1_viewRepositories.hbs
new file mode 100644
index 0000000..ca8e18f
--- /dev/null
+++ b/ambari-web/app/templates/wizard/step1_viewRepositories.hbs
@@ -0,0 +1,102 @@
+{{!
+* 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.
+}}
+
+<div class="accordion" id="advancedRepoAccordion">
+  <div class="">
+    <div class="accordion-body">
+      <div class="accordion-inner">
+        <div class="alert alert-info">{{t installer.step1.advancedRepo.message}}</div>
+        <div class="alert alert-warning">{{t installer.step1.advancedRepo.importantMassage}}</div>
+
+        <div class="repositories-table">
+          <div class="thead">
+            <div class="first-th">&nbsp;</div>
+            <div class="th os-th">{{t common.os}}</div>
+            <div class="th name-th">{{t common.name}}</div>
+            <div class="th url-th">{{t installer.step1.advancedRepo.localRepo.column.baseUrl}}</div>
+          </div>
+          <div class="tbody">
+            {{#each operatingSystem in view.operatingSystems}}
+              <div class="trow">
+                <div {{bindAttr class=":os-td operatingSystem.osType"}}>
+                  <label>
+                    {{view Ember.Checkbox checkedBinding="operatingSystem.isSelected"}}
+                    <span {{bindAttr class=":os operatingSystem.isSelected::disabled-label"}}>{{operatingSystem.osType}}</span>
+                  </label>
+                </div>
+                <div style="width:83%">
+                  {{#each repository in operatingSystem.repositories}}
+                    <div class="sub-trow">
+                      <div class="name-td">{{repository.repoId}}</div>
+                      <div class="validation-td">
+                        {{#if repository.validation}}
+                            {{view view.popoverView repositoryBinding="repository"}}
+                        {{/if}}
+                      </div>
+                      <div {{bindAttr class=":url-td operatingSystem.osType repository.repoId repository.invalidFormatError:textfield-error repository.invalidError:textfield-error"}}>
+                        {{view Ember.TextField valueBinding="repository.baseUrl" disabledBinding="operatingSystem.isDeselected"}}
+                      </div>
+                      <div class="clear-td">
+                        {{#if repository.clearAll}}
+                          <a {{action "clearGroupLocalRepository" repository target="view" }} {{bindAttr class="operatingSystem.isSelected::disabled-clear-button"}}>
+                            <i class="icon-remove-sign"></i>
+                          </a>
+                        {{/if}}
+                      </div>
+                        <div class="actions-td">
+                          {{#if repository.undo}}
+                            <a {{action "undoGroupLocalRepository" repository target="view" }}>
+                                <i class="icon-undo"></i>{{t common.undo}}
+                            </a>
+                          {{/if}}
+                        </div>
+                    </div>
+                  {{/each}}
+                </div>
+              </div>
+            {{/each}}
+          </div>
+        </div>
+        <div id="skip-validation">
+          <label>{{view Ember.Checkbox checkedBinding="skipValidationChecked" class="checkbox"}}{{t installer.step1.advancedRepo.skipValidation.message}}
+            <i class="icon-question-sign" rel=""
+               data-toggle="tooltip" {{translateAttr title="installer.step1.advancedRepo.skipValidation.tooltip"}}></i></label>
+        </div>
+        {{#if App.supports.redhatSatellite}}
+          <div id="use-redhat">
+            <label>{{view Ember.Checkbox classNames="align-checkbox" checkedBinding="useRedhatSatellite"}}{{t installer.step1.advancedRepo.useRedhatSatellite.message}}
+              <i class="icon-question-sign" rel="use-redhat-tooltip"
+                   data-toggle="tooltip" {{translateAttr title="installer.step1.advancedRepo.useRedhatSatellite.tooltip"}}></i></label>
+          </div>
+        {{/if}}
+        {{#if view.invalidFormatUrlExist}}
+          <div class="alert">{{t installer.step1.attentionNeeded}}</div>
+        {{/if}}
+        {{#if view.invalidUrlExist}}
+          <div class="alert">
+            {{t installer.step1.invalidURLAttention}}
+            <a href="javascript:void(null)" {{action "retryRepoUrls" target="view"}}>{{t installer.step1.retryRepoUrls}}</a>
+          </div>
+        {{/if}}
+        {{#if view.isNoOsChecked}}
+          <div class="alert">{{t installer.step1.checkAtLeastOneAttention}}</div>
+        {{/if}}
+      </div>
+    </div>
+  </div>
+</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/391b45e9/ambari-web/app/templates/wizard/step4.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/wizard/step4.hbs b/ambari-web/app/templates/wizard/step4.hbs
index cc4c68f..21c2aae 100644
--- a/ambari-web/app/templates/wizard/step4.hbs
+++ b/ambari-web/app/templates/wizard/step4.hbs
@@ -40,7 +40,7 @@
           disabledBinding="isInstalled"
           checkedBinding="isSelected"}}{{displayNameOnSelectServicePage}}</label>
           </td>
-          <td>{{serviceVersion}}</td>
+          <td>{{serviceVersionDisplay}}</td>
           <td>{{{comments}}}</td>
         </tr>
       {{/unless}}