This is an automated email from the ASF dual-hosted git repository.

jluniya pushed a commit to branch branch-feature-AMBARI-14714
in repository https://gitbox.apache.org/repos/asf/ambari.git


The following commit(s) were added to refs/heads/branch-feature-AMBARI-14714 by 
this push:
     new 1ae465f  AMBARI-22979: Update software registry API to support new 
mpack schema (jluniya) (#433)
1ae465f is described below

commit 1ae465f1af19b52c87f6141b42cd9377ef825471
Author: jayush <jay...@gmail.com>
AuthorDate: Thu Feb 22 10:49:13 2018 -0800

    AMBARI-22979: Update software registry API to support new mpack schema 
(jluniya) (#433)
---
 .../api/resources/MpackResourceDefinition.java     |   2 +-
 .../ambari/server/api/services/MpacksService.java  |  24 ++---
 .../api/services/RootClusterSettingService.java    |   2 +-
 .../ambari/server/controller/MpackRequest.java     |  24 ++---
 .../ambari/server/controller/MpackResponse.java    |  73 +++++++-------
 .../server/controller/RegistryMpackResponse.java   |  37 ++++----
 .../controller/RegistryMpackVersionResponse.java   |  88 ++++++++---------
 .../ambari/server/controller/RegistryResponse.java |   1 -
 .../controller/internal/MpackResourceProvider.java |  50 +++++-----
 .../internal/RegistryMpackResourceProvider.java    |  22 ++---
 .../RegistryMpackVersionResourceProvider.java      |  74 +++++++--------
 .../apache/ambari/server/mpack/MpackGenerator.java |   1 -
 .../apache/ambari/server/mpack/MpackManager.java   |  53 +++++------
 .../org/apache/ambari/server/orm/dao/MpackDAO.java |  14 +--
 .../ambari/server/orm/entities/MpackEntity.java    |  20 ++--
 .../ambari/server/registry/RegistryAdvisor.java    |  57 +++++++----
 .../ambari/server/registry/RegistryMpack.java      |  13 +--
 ...patiblity.java => RegistryMpackDependency.java} |  18 +++-
 .../server/registry/RegistryMpackService.java      |  41 --------
 .../server/registry/RegistryMpackVersion.java      |  33 ++-----
 .../server/registry/json/JsonRegistryMpack.java    |  24 ++---
 ...ility.java => JsonRegistryMpackDependency.java} |  14 ++-
 .../registry/json/JsonRegistryMpackService.java    |  42 ---------
 .../registry/json/JsonRegistryMpackVersion.java    |  72 +++++++-------
 .../java/org/apache/ambari/server/state/Mpack.java | 105 ++++++---------------
 .../apache/ambari/server/utils/MpackVersion.java   |  83 ++++++++++++----
 .../apache/ambari/server/utils/VersionUtils.java   |  13 ++-
 .../AmbariManagementControllerImplTest.java        |   2 +-
 .../ambari/server/controller/MpackRequestTest.java |   2 +-
 .../server/controller/MpackResponseTest.java       |   4 +-
 .../server/controller/RegistryRequestTest.java     |   4 +-
 .../internal/MpackResourceProviderTest.java        |  20 ++--
 .../apache/ambari/server/orm/dao/MpackDAOTest.java |   4 +-
 .../server/orm/entities/MpackEntityTest.java       |   6 +-
 .../org/apache/ambari/server/state/MpackTest.java  |   4 +-
 .../ambari/server/utils/TestVersionUtils.java      |  32 ++++++-
 36 files changed, 540 insertions(+), 538 deletions(-)

diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/MpackResourceDefinition.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/MpackResourceDefinition.java
index fdf8217..4fbe5be 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/api/resources/MpackResourceDefinition.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/api/resources/MpackResourceDefinition.java
@@ -85,7 +85,7 @@ public class MpackResourceDefinition extends 
BaseResourceDefinition {
         Map<String, Object> mpackInfo = mapInfo.get("MpackInfo");
 
         int idx = href.indexOf("stacks/");
-        Long mpackId = (Long)mpackInfo.get("mpack_id");
+        Long mpackId = (Long)mpackInfo.get("id");
         href = href.substring(0, idx) + "mpacks/" + mpackId;
         resultNode.setProperty("href", href);
       } else {
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/api/services/MpacksService.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/api/services/MpacksService.java
index cf71af3..ba76fe1 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/api/services/MpacksService.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/api/services/MpacksService.java
@@ -73,7 +73,7 @@ public class MpacksService extends BaseService {
     response = MpackResponseWrapper.class, responseContainer = 
RESPONSE_CONTAINER_LIST)
   @ApiImplicitParams({
     @ApiImplicitParam(name = QUERY_FIELDS, value = QUERY_FILTER_DESCRIPTION, 
dataType = DATA_TYPE_STRING,
-      paramType = PARAM_TYPE_QUERY, defaultValue = 
MpackResourceProvider.MPACK_ID),
+      paramType = PARAM_TYPE_QUERY, defaultValue = 
MpackResourceProvider.MPACK_RESOURCE_ID),
     @ApiImplicitParam(name = QUERY_SORT, value = QUERY_SORT_DESCRIPTION, 
dataType = DATA_TYPE_STRING,
       paramType = PARAM_TYPE_QUERY),
     @ApiImplicitParam(name = QUERY_PAGE_SIZE, value = 
QUERY_PAGE_SIZE_DESCRIPTION, defaultValue = DEFAULT_PAGE_SIZE,
@@ -123,13 +123,13 @@ public class MpacksService extends BaseService {
   }
 
   /***
-   * Handles: GET /mpacks/{mpack_id}
-   * Return a specific mpack given an mpack_id
+   * Handles: GET /mpacks/{id}
+   * Return a specific mpack given an id
    *
    * @param
    */
   @GET
-  @Path("{mpack_id}")
+  @Path("{id}")
   @Produces(MediaType.TEXT_PLAIN)
   @ApiOperation(value = "Returns information about a specific mpack that is 
registered with this Ambari instance",
     response = MpackResponseWrapper.class)
@@ -145,14 +145,14 @@ public class MpacksService extends BaseService {
     @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = 
MSG_SERVER_ERROR),
   })
   public Response getMpack(String body, @Context HttpHeaders headers, @Context 
UriInfo ui,
-    @PathParam("mpack_id") String mpackId) {
+    @PathParam("id") String id) {
 
     return handleRequest(headers, body, ui, Request.Type.GET,
-            createMpackResource(mpackId));
+            createMpackResource(id));
   }
 
   @DELETE
-  @Path("{mpack_id}")
+  @Path("{id}")
   @Produces(MediaType.TEXT_PLAIN)
   @ApiOperation(value = "Deletes a selected management pack")
   @ApiImplicitParams({
@@ -166,19 +166,19 @@ public class MpacksService extends BaseService {
           @ApiResponse(code = HttpStatus.SC_FORBIDDEN, message = 
MSG_PERMISSION_DENIED),
           @ApiResponse(code = HttpStatus.SC_INTERNAL_SERVER_ERROR, message = 
MSG_SERVER_ERROR),
   })
-  public Response deleteMpack(String body, @Context HttpHeaders headers, 
@Context UriInfo ui, @PathParam("mpack_id") String mpackId) {
+  public Response deleteMpack(String body, @Context HttpHeaders headers, 
@Context UriInfo ui, @PathParam("id") String id) {
     return handleRequest(headers, body, ui, Request.Type.DELETE,
-            createMpackResource(mpackId));
+            createMpackResource(id));
   }
 
   /**
    * Create an mpack resource instance
-   * @param mpackId
+   * @param id
    * @return ResourceInstance
    */
-  private ResourceInstance createMpackResource(String mpackId) {
+  private ResourceInstance createMpackResource(String id) {
     return createResource(Resource.Type.Mpack,
-            Collections.singletonMap(Resource.Type.Mpack, mpackId));
+            Collections.singletonMap(Resource.Type.Mpack, id));
 
   }
 
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootClusterSettingService.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootClusterSettingService.java
index bd2fb91..d8a3785 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootClusterSettingService.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/api/services/RootClusterSettingService.java
@@ -70,7 +70,7 @@ public class RootClusterSettingService extends BaseService {
           response = 
ReadOnlyConfigurationResponse.ReadOnlyConfigurationResponseSwagger.class, 
responseContainer = RESPONSE_CONTAINER_LIST)
   @ApiImplicitParams({
           @ApiImplicitParam(name = QUERY_FIELDS, value = 
QUERY_FILTER_DESCRIPTION, dataType = DATA_TYPE_STRING,
-                  paramType = PARAM_TYPE_QUERY, defaultValue = 
MpackResourceProvider.MPACK_ID),
+                  paramType = PARAM_TYPE_QUERY, defaultValue = 
MpackResourceProvider.MPACK_RESOURCE_ID),
           @ApiImplicitParam(name = QUERY_SORT, value = QUERY_SORT_DESCRIPTION, 
dataType = DATA_TYPE_STRING,
                   paramType = PARAM_TYPE_QUERY),
           @ApiImplicitParam(name = QUERY_PAGE_SIZE, value = 
QUERY_PAGE_SIZE_DESCRIPTION, defaultValue = DEFAULT_PAGE_SIZE,
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/MpackRequest.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/MpackRequest.java
index a705d18..49d0caa 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/MpackRequest.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/MpackRequest.java
@@ -26,25 +26,25 @@ import org.apache.ambari.server.orm.entities.MpackEntity;
  */
 public class MpackRequest {
 
-  private Long mpackId;
+  private Long id;
+  private Long registryId;
   private String mpackName;
   private String mpackVersion;
   private String mpackUri;
-  private Long registryId;
 
-  public MpackRequest(Long mpackId) {
-    this.setMpackId(mpackId);
+  public MpackRequest(Long id) {
+    this.setId(id);
   }
 
   public MpackRequest() {
   }
 
-  public Long getMpackId() {
-    return mpackId;
+  public Long getId() {
+    return id;
   }
 
-  public void setMpackId(Long mpackId) {
-    this.mpackId = mpackId;
+  public void setId(Long id) {
+    this.id = id;
   }
 
   public String getMpackName() {
@@ -82,7 +82,7 @@ public class MpackRequest {
   @Override
   public int hashCode() {
     int result = 1;
-    result = 31 + getMpackId().hashCode();
+    result = 31 + getId().hashCode();
     return result;
   }
 
@@ -96,11 +96,11 @@ public class MpackRequest {
     }
     MpackRequest mpackRequest = (MpackRequest) obj;
 
-    if (mpackId == null) {
-      if (mpackRequest.mpackId != null) {
+    if (id == null) {
+      if (mpackRequest.id != null) {
         return false;
       }
-    } else if (!mpackId.equals(mpackRequest.mpackId)) {
+    } else if (!id.equals(mpackRequest.id)) {
       return false;
     }
 
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/MpackResponse.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/MpackResponse.java
index ce70f8a..0755c16 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/MpackResponse.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/MpackResponse.java
@@ -27,86 +27,93 @@ import io.swagger.annotations.ApiModelProperty;
  */
 public class MpackResponse {
 
-  private Long mpackId;
-  private String mpackVersion;
+  private Long id;
+  private String mpackId;
   private String mpackName;
+  private String mpackVersion;
   private String mpackUri;
   private Long registryId;
   private String stackId;
   private String description;
 
   public MpackResponse(Mpack mpack) {
+    this.id = mpack.getResourceId();
     this.mpackId = mpack.getMpackId();
+    this.mpackName = mpack.getName();
     this.mpackVersion = mpack.getVersion();
     this.mpackUri = mpack.getMpackUri();
-    this.mpackName = mpack.getName();
     this.registryId = mpack.getRegistryId();
-    this.stackId = mpack.getStackId();
     this.description = mpack.getDescription();
   }
 
-  public String getMpackVersion() {
-    return mpackVersion;
+  public Long getId() {
+    return id;
   }
 
-  public String getMpackUri() {
-    return mpackUri;
+  public void setId(Long id) {
+    this.id = id;
   }
 
-  public Long getMpackId() {
-    return mpackId;
+  public Long getRegistryId() {
+    return registryId;
   }
 
-  public String getStackId() {
-    return stackId;
+  public void setRegistryId(Long registryId) {
+    this.registryId = registryId;
   }
 
-  public void setStackId(String stackId) {
-    this.stackId = stackId;
+  public String getMpackId() {
+    return mpackId;
+  }
+
+  public void setMpackId(String mpackId) {
+    this.mpackId = mpackId;
   }
 
   public String getMpackName() {
     return mpackName;
   }
 
-  public Long getRegistryId() {
-    return registryId;
+  public void setMpackName(String mpackName) {
+    this.mpackName = mpackName;
   }
 
-  public void setMpackVersion(String mpackVersion) {
-    this.mpackVersion = mpackVersion;
+  public String getDescription() {
+    return description;
   }
 
-  public void setMpackName(String mpackName) {
-    this.mpackName = mpackName;
+  public void setDescription(String description) {
+    this.description = description;
   }
 
-  public void setMpackUri(String mpackUri) {
-    this.mpackUri = mpackUri;
+  public String getMpackVersion() {
+    return mpackVersion;
   }
 
-  public void setRegistryId(Long registryId) {
-    this.registryId = registryId;
+  public void setMpackVersion(String mpackVersion) {
+    this.mpackVersion = mpackVersion;
   }
 
-  public void setMpackId(Long mpackId) {
-    this.mpackId = mpackId;
+  public String getMpackUri() {
+    return mpackUri;
   }
 
-
-  public String getDescription() {
-    return description;
+  public void setMpackUri(String mpackUri) {
+    this.mpackUri = mpackUri;
   }
 
-  public void setDescription(String description) {
-    this.description = description;
+  public String getStackId() {
+    return stackId;
   }
 
+  public void setStackId(String stackId) {
+    this.stackId = stackId;
+  }
 
   @Override
   public int hashCode() {
     int result = 1;
-    result = 31 + getMpackId().hashCode();
+    result = 31 + getId().hashCode();
     return result;
   }
 
@@ -119,7 +126,7 @@ public class MpackResponse {
       return true;
     }
     MpackResponse MpackResponse = (MpackResponse) obj;
-    return getMpackId().equals(MpackResponse.getMpackId());
+    return getId().equals(MpackResponse.getId());
   }
 
   public interface MpackResponseWrapper extends ApiModel {
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/RegistryMpackResponse.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/RegistryMpackResponse.java
index 1bc9659..9943024 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/RegistryMpackResponse.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/RegistryMpackResponse.java
@@ -26,25 +26,25 @@ import io.swagger.annotations.ApiModelProperty;
  */
 public class RegistryMpackResponse {
   private Long registryId;
+  private String mpackId;
   private String mpackName;
-  private String mpackDisplayName;
   private String mpackDescription;
-  private String mpackLogoUrl;
+  private String mpackLogoUri;
 
   /**
    * Constructor
    * @param registryId        registry id
+   * @param mpackId           mpack id
    * @param mpackName         mpack name
-   * @param mpackDisplayName      mpack Display Name
    * @param mpackDescription  mpack description
-   * @param mpackLogoUrl      mpack logo url
+   * @param mpackLogoUri      mpack logo uri
    */
-  public RegistryMpackResponse(Long registryId, String mpackName, String 
mpackDisplayName, String mpackDescription, String mpackLogoUrl) {
+  public RegistryMpackResponse(Long registryId, String mpackId, String 
mpackName, String mpackDescription, String mpackLogoUri) {
     this.registryId = registryId;
     this.mpackName = mpackName;
-    this.mpackDisplayName = mpackDisplayName;
+    this.mpackId = mpackId;
     this.mpackDescription = mpackDescription;
-    this.mpackLogoUrl = mpackLogoUrl;
+    this.mpackLogoUri = mpackLogoUri;
   }
 
   /**
@@ -56,6 +56,15 @@ public class RegistryMpackResponse {
   }
 
   /**
+   * Get mpack id
+   * @return mpack id
+   */
+  public String getMpackId() {
+    return mpackId;
+  }
+
+
+  /**
    * Get mpack name
    * @return mpack name
    */
@@ -64,12 +73,6 @@ public class RegistryMpackResponse {
   }
 
   /**
-   * Get mpack summary
-   * @return
-   */
-  public String getMpackDisplayName() {return mpackDisplayName;}
-
-  /**
    * Get mpack description
    * @return mpack description
    */
@@ -78,11 +81,11 @@ public class RegistryMpackResponse {
   }
 
   /**
-   * Get mpack logo url
-   * @return mpack logo url
+   * Get mpack logo uri
+   * @return mpack logo uri
    */
-  public String getMpackLogoUrl() {
-    return mpackLogoUrl;
+  public String getMpackLogoUri() {
+    return mpackLogoUri;
   }
 
   /**
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/RegistryMpackVersionResponse.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/RegistryMpackVersionResponse.java
index 5929c4c..829ed5e 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/RegistryMpackVersionResponse.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/RegistryMpackVersionResponse.java
@@ -20,8 +20,8 @@ package org.apache.ambari.server.controller;
 import java.util.List;
 
 import 
org.apache.ambari.server.controller.internal.RegistryMpackVersionResourceProvider;
-import org.apache.ambari.server.registry.RegistryMpackCompatiblity;
-import org.apache.ambari.server.registry.RegistryMpackService;
+import org.apache.ambari.server.registry.RegistryMpackDependency;
+import org.apache.ambari.server.state.Module;
 
 import io.swagger.annotations.ApiModelProperty;
 
@@ -30,82 +30,82 @@ import io.swagger.annotations.ApiModelProperty;
  */
 public class RegistryMpackVersionResponse {
   private Long registryId;
+  private String mpackId;
   private String mpackName;
+  private String mpackDescription;
   private String mpackVersion;
-  private String mpackBuildNumber;
-  private String stackId;
-  private String mpackUrl;
-  private String mpackDocUrl;
-  private List<? extends RegistryMpackService> mpackServices;
-  private List<? extends RegistryMpackCompatiblity> compatibleMpacks;
+  private String mpackUri;
+  private String mpackDocUri;
+  private String mpackLogoUri;
+  private List<? extends RegistryMpackDependency> dependencies;
+  private List<Module> modules;
 
   /**
    * Constructor
    * @param registryId        registry id
+   * @param mpackId           mpack id
    * @param mpackName         mpack name
+   * @param mpackDescription mpack description
    * @param mpackVersion      mpack version
-   * @param mpackBuildNumber  mpack build number
-   * @param mpackUrl          mpack download url
-   * @param mpackDocUrl       mpack documentation url
-   * @param mpackServices     list of mpack services
-   * @param compatibleMpacks  list of compatible mpacks
-   * @param stackId           stack id of the mpack version
+   * @param mpackUri          mpack uri
+   * @param mpackDocUri       mpack documentation uri
+   * @param mpackLogoUri mpack logo uri
+   * @param dependencies      list of mpack dependencies
+   * @param modules list of modules in the mpack
    */
-  public RegistryMpackVersionResponse(
-    Long registryId, String mpackName, String mpackVersion, String 
mpackBuildNumber,
-    String mpackUrl, String mpackDocUrl,
-    List<? extends RegistryMpackService> mpackServices,
-    List<? extends RegistryMpackCompatiblity> compatibleMpacks, String 
stackId) {
+  public RegistryMpackVersionResponse(Long registryId, String mpackId, String 
mpackName, String mpackDescription,
+    String mpackVersion, String mpackUri, String mpackDocUri, String 
mpackLogoUri,
+    List<? extends RegistryMpackDependency> dependencies, List<Module> 
modules) {
     this.registryId = registryId;
+    this.mpackId = mpackId;
     this.mpackName = mpackName;
+    this.mpackDescription = mpackDescription;
     this.mpackVersion = mpackVersion;
-    this.mpackBuildNumber = mpackBuildNumber;
-    this.mpackUrl = mpackUrl;
-    this.mpackDocUrl = mpackDocUrl;
-    this.mpackServices = mpackServices;
-    this.compatibleMpacks = compatibleMpacks;
-    this.stackId = stackId;
+    this.mpackUri = mpackUri;
+    this.mpackDocUri = mpackDocUri;
+    this.mpackLogoUri = mpackLogoUri;
+    this.dependencies = dependencies;
+    this.modules = modules;
   }
 
   public Long getRegistryId() {
     return registryId;
   }
 
-  public String getMpackName() {
-    return mpackName;
+  public String getMpackId() {
+    return mpackId;
   }
 
-  public String getMpackVersion() {
-    return mpackVersion;
+  public String getMpackName() {
+    return mpackName;
   }
 
-  public String getMpackBuildNumber() {
-    return mpackBuildNumber;
+  public String getMpackDescription() {
+    return mpackDescription;
   }
 
-  public String getMpackUrl() {
-    return mpackUrl;
+  public String getMpackVersion() {
+    return mpackVersion;
   }
 
-  public String getMpackDocUrl() {
-    return mpackDocUrl;
+  public String getMpackUri() {
+    return mpackUri;
   }
 
-  public List<? extends RegistryMpackService> getMpackServices() {
-    return mpackServices;
+  public String getMpackDocUri() {
+    return mpackDocUri;
   }
 
-  public List<? extends RegistryMpackCompatiblity> getCompatibleMpacks() {
-    return compatibleMpacks;
+  public String getMpackLogoUri() {
+    return mpackLogoUri;
   }
 
-
-  public String getStackId() {
-    return stackId;
+  public List<? extends RegistryMpackDependency> getDependencies() {
+    return dependencies;
   }
 
-  public void setStackId(String stackId) {
-    this.stackId = stackId;
+  public List<Module> getModules() {
+    return modules;
   }
 
   @Override
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/RegistryResponse.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/RegistryResponse.java
index 729451f..b338fd5 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/RegistryResponse.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/RegistryResponse.java
@@ -67,7 +67,6 @@ public class RegistryResponse {
         return registryUri;
     }
 
-
     public void setRegistryUri(String registryUri) {
         this.registryUri = registryUri;
     }
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MpackResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MpackResourceProvider.java
index e3b6a5f..a867d11 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MpackResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MpackResourceProvider.java
@@ -69,19 +69,20 @@ public class MpackResourceProvider extends 
AbstractControllerResourceProvider {
 
   public static final String RESPONSE_KEY = "MpackInfo";
   public static final String ALL_PROPERTIES = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "*";
-  public static final String MPACK_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_id";
+  public static final String MPACK_RESOURCE_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "id";
   public static final String REGISTRY_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "registry_id";
+  public static final String MPACK_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_id";
   public static final String MPACK_NAME = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_name";
   public static final String MPACK_VERSION = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_version";
+  public static final String MPACK_DESCRIPTION = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_description";
   public static final String MPACK_URI = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_uri";
   public static final String MODULES = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "modules";
-  public static final String MPACK_DESC = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "description";
   public static final String STACK_NAME_PROPERTY_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "stack_name";
   public static final String STACK_VERSION_PROPERTY_ID =
     RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "stack_version";
 
   private static Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(MPACK_ID, STACK_NAME_PROPERTY_ID, 
STACK_VERSION_PROPERTY_ID));
+    Arrays.asList(MPACK_RESOURCE_ID, STACK_NAME_PROPERTY_ID, 
STACK_VERSION_PROPERTY_ID));
 
   /**
    * The property ids for an mpack resource.
@@ -104,18 +105,19 @@ public class MpackResourceProvider extends 
AbstractControllerResourceProvider {
 
   static {
     // properties
-    PROPERTY_IDS.add(MPACK_ID);
+    PROPERTY_IDS.add(MPACK_RESOURCE_ID);
     PROPERTY_IDS.add(REGISTRY_ID);
+    PROPERTY_IDS.add(MPACK_ID);
     PROPERTY_IDS.add(MPACK_NAME);
     PROPERTY_IDS.add(MPACK_VERSION);
     PROPERTY_IDS.add(MPACK_URI);
-    PROPERTY_IDS.add(MPACK_DESC);
+    PROPERTY_IDS.add(MPACK_DESCRIPTION);
     PROPERTY_IDS.add(MODULES);
     PROPERTY_IDS.add(STACK_NAME_PROPERTY_ID);
     PROPERTY_IDS.add(STACK_VERSION_PROPERTY_ID);
 
     // keys
-    KEY_PROPERTY_IDS.put(Resource.Type.Mpack, MPACK_ID);
+    KEY_PROPERTY_IDS.put(Resource.Type.Mpack, MPACK_RESOURCE_ID);
     KEY_PROPERTY_IDS.put(Resource.Type.Stack, STACK_NAME_PROPERTY_ID);
     KEY_PROPERTY_IDS.put(Resource.Type.StackVersion, 
STACK_VERSION_PROPERTY_ID);
 
@@ -147,11 +149,12 @@ public class MpackResourceProvider extends 
AbstractControllerResourceProvider {
       if (response != null) {
         notifyCreate(Resource.Type.Mpack, request);
         Resource resource = new ResourceImpl(Resource.Type.Mpack);
+        resource.setProperty(MPACK_RESOURCE_ID, response.getId());
         resource.setProperty(MPACK_ID, response.getMpackId());
         resource.setProperty(MPACK_NAME, response.getMpackName());
         resource.setProperty(MPACK_VERSION, response.getMpackVersion());
         resource.setProperty(MPACK_URI, response.getMpackUri());
-        resource.setProperty(MPACK_DESC, response.getDescription());
+        resource.setProperty(MPACK_DESCRIPTION, response.getDescription());
         resource.setProperty(REGISTRY_ID, response.getRegistryId());
         associatedResources.add(resource);
         return getRequestStatus(null, associatedResources);
@@ -203,21 +206,21 @@ public class MpackResourceProvider extends 
AbstractControllerResourceProvider {
     Set<Map<String, Object>> properties = request.getProperties();
     for (Map propertyMap : properties) {
       //Mpack Download url is either given in the request body or is fetched 
using the registry id
-      if (!propertyMap.containsKey(MPACK_URI) && 
!propertyMap.containsKey(REGISTRY_ID))
+      if (!propertyMap.containsKey(MPACK_URI) && 
!propertyMap.containsKey(REGISTRY_ID)) {
         return null;
-        //Fetch Mpack Download Url using the given registry id
-      else if (!propertyMap.containsKey(MPACK_URI)) {
+      } else if (!propertyMap.containsKey(MPACK_URI)) {
+        // Retrieve mpack download url using the given registry id
         mpackRequest.setRegistryId(Long.valueOf((String) 
propertyMap.get(REGISTRY_ID)));
         mpackRequest.setMpackName((String) propertyMap.get(MPACK_NAME));
         mpackRequest.setMpackVersion((String) propertyMap.get(MPACK_VERSION));
         mpackRequest.setMpackUri(getMpackUri(mpackRequest));
       }
-      //Directly download the mpack using the given url
-      else
+      else {
+        //Directly download the mpack using the given url
         mpackRequest.setMpackUri((String) propertyMap.get(MPACK_URI));
+      }
     }
     return mpackRequest;
-
   }
 
   /***
@@ -231,7 +234,7 @@ public class MpackResourceProvider extends 
AbstractControllerResourceProvider {
     Registry registry = 
getManagementController().getRegistry(mpackRequest.getRegistryId());
     RegistryMpack registryMpack = 
registry.getRegistryMpack(mpackRequest.getMpackName());
     RegistryMpackVersion registryMpackVersion = 
registryMpack.getMpackVersion(mpackRequest.getMpackVersion());
-    return registryMpackVersion.getMpackUrl();
+    return registryMpackVersion.getMpackUri();
   }
 
   @Override
@@ -249,11 +252,12 @@ public class MpackResourceProvider extends 
AbstractControllerResourceProvider {
       }
       for (MpackResponse response : responses){
         Resource resource = new ResourceImpl(Resource.Type.Mpack);
+        resource.setProperty(MPACK_RESOURCE_ID, response.getId());
         resource.setProperty(MPACK_ID, response.getMpackId());
         resource.setProperty(MPACK_NAME, response.getMpackName());
         resource.setProperty(MPACK_VERSION, response.getMpackVersion());
         resource.setProperty(MPACK_URI, response.getMpackUri());
-        resource.setProperty(MPACK_DESC, response.getDescription());
+        resource.setProperty(MPACK_DESCRIPTION, response.getDescription());
         resource.setProperty(REGISTRY_ID, response.getRegistryId());
         results.add(resource);
       }
@@ -269,11 +273,12 @@ public class MpackResourceProvider extends 
AbstractControllerResourceProvider {
           MpackResponse response = getManagementController().getMpack(mpackId);
           Resource resource = new ResourceImpl(Resource.Type.Mpack);
           if (null != response) {
+            resource.setProperty(MPACK_RESOURCE_ID, response.getId());
             resource.setProperty(MPACK_ID, response.getMpackId());
             resource.setProperty(MPACK_NAME, response.getMpackName());
             resource.setProperty(MPACK_VERSION, response.getMpackVersion());
             resource.setProperty(MPACK_URI, response.getMpackUri());
-            resource.setProperty(MPACK_DESC, response.getDescription());
+            resource.setProperty(MPACK_DESCRIPTION, response.getDescription());
             resource.setProperty(REGISTRY_ID, response.getRegistryId());
             resource.setProperty(STACK_NAME_PROPERTY_ID, stackName);
             resource.setProperty(STACK_VERSION_PROPERTY_ID, stackVersion);
@@ -283,21 +288,22 @@ public class MpackResourceProvider extends 
AbstractControllerResourceProvider {
         return results;
       }
 
-      if (propertyMap.containsKey(MPACK_ID)) {
-        Object objMpackId = propertyMap.get(MPACK_ID);
+      if (propertyMap.containsKey(MPACK_RESOURCE_ID)) {
+        Object objMpackId = propertyMap.get(MPACK_RESOURCE_ID);
         if (objMpackId != null)
           mpackId = Long.valueOf((String) objMpackId);
 
           MpackResponse response = getManagementController().getMpack(mpackId);
           Resource resource = new ResourceImpl(Resource.Type.Mpack);
           if (null != response) {
+            resource.setProperty(MPACK_RESOURCE_ID, response.getId());
             resource.setProperty(MPACK_ID, response.getMpackId());
             resource.setProperty(MPACK_NAME, response.getMpackName());
             resource.setProperty(MPACK_VERSION, response.getMpackVersion());
             resource.setProperty(MPACK_URI, response.getMpackUri());
-            resource.setProperty(MPACK_DESC, response.getDescription());
+            resource.setProperty(MPACK_DESCRIPTION, response.getDescription());
             resource.setProperty(REGISTRY_ID, response.getRegistryId());
-            List<Module> modules = 
getManagementController().getModules(response.getMpackId());
+            List<Module> modules = 
getManagementController().getModules(response.getId());
             resource.setProperty(MODULES, modules);
             results.add(resource);
           }
@@ -325,8 +331,8 @@ public class MpackResourceProvider extends 
AbstractControllerResourceProvider {
     if (getManagementController().getClusters().getClusters().size() > 0) {
       throw new SystemException("Delete request cannot be completed since 
there is a cluster deployed");
     } else {
-      if (propertyMap.containsKey(MPACK_ID)) {
-        Object objMpackId = propertyMap.get(MPACK_ID);
+      if (propertyMap.containsKey(MPACK_RESOURCE_ID)) {
+        Object objMpackId = propertyMap.get(MPACK_RESOURCE_ID);
         if (objMpackId != null) {
           mpackId = Long.valueOf((String) objMpackId);
           LOG.info("Deleting Mpack, id = " + mpackId.toString());
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RegistryMpackResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RegistryMpackResourceProvider.java
index 2e1c23c..fa0f62b 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RegistryMpackResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RegistryMpackResourceProvider.java
@@ -49,13 +49,13 @@ public class RegistryMpackResourceProvider extends 
AbstractControllerResourcePro
   public static final String RESPONSE_KEY = "RegistryMpackInfo";
   public static final String ALL_PROPERTIES = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "*";
   public static final String REGISTRY_ID =  RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP +  "registry_id";
+  public static final String REGISTRY_MPACK_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_id";
   public static final String REGISTRY_MPACK_NAME = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_name";
-  public static final String REGISTRY_MPACK_DISPLAY_NAME = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_display_name";
   public static final String REGISTRY_MPACK_DESC = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_description";
-  public static final String REGISTRY_MPACK_LOGO_URL = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_logo_url";
+  public static final String REGISTRY_MPACK_LOGO_URI = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_logo_uri";
 
   private static Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(REGISTRY_ID, REGISTRY_MPACK_NAME));
+    Arrays.asList(REGISTRY_ID, REGISTRY_MPACK_ID, REGISTRY_MPACK_NAME));
 
   /**
    * The property ids for a software registry resource.
@@ -70,10 +70,10 @@ public class RegistryMpackResourceProvider extends 
AbstractControllerResourcePro
   static {
     // properties
     PROPERTY_IDS.add(REGISTRY_ID);
+    PROPERTY_IDS.add(REGISTRY_MPACK_ID);
     PROPERTY_IDS.add(REGISTRY_MPACK_NAME);
-    PROPERTY_IDS.add(REGISTRY_MPACK_DISPLAY_NAME);
     PROPERTY_IDS.add(REGISTRY_MPACK_DESC);
-    PROPERTY_IDS.add(REGISTRY_MPACK_LOGO_URL);
+    PROPERTY_IDS.add(REGISTRY_MPACK_LOGO_URI);
 
     // keys
     KEY_PROPERTY_IDS.put(Resource.Type.Registry, REGISTRY_ID);
@@ -130,10 +130,10 @@ public class RegistryMpackResourceProvider extends 
AbstractControllerResourcePro
     for (RegistryMpackResponse response : responses) {
       Resource resource = new ResourceImpl(Resource.Type.RegistryMpack);
       setResourceProperty(resource, REGISTRY_ID, response.getRegistryId(), 
requestedIds);
+      setResourceProperty(resource, REGISTRY_MPACK_ID, response.getMpackId(), 
requestedIds);
       setResourceProperty(resource, REGISTRY_MPACK_NAME, 
response.getMpackName(), requestedIds);
-      setResourceProperty(resource, REGISTRY_MPACK_DISPLAY_NAME, 
response.getMpackDisplayName(), requestedIds);
       setResourceProperty(resource, REGISTRY_MPACK_DESC, 
response.getMpackDescription(), requestedIds);
-      setResourceProperty(resource, REGISTRY_MPACK_LOGO_URL, 
response.getMpackLogoUrl(), requestedIds);
+      setResourceProperty(resource, REGISTRY_MPACK_LOGO_URI, 
response.getMpackLogoUri(), requestedIds);
       resources.add(resource);
     }
     return resources;
@@ -184,10 +184,10 @@ public class RegistryMpackResourceProvider extends 
AbstractControllerResourcePro
       for (RegistryMpack registryMpack : registry.getRegistryMpacks()) {
         RegistryMpackResponse response = new RegistryMpackResponse(
           registry.getRegistryId(),
+          registryMpack.getMpackId(),
           registryMpack.getMpackName(),
-          registryMpack.getMpackDisplayName(),
           registryMpack.getMpackDescription(),
-          registryMpack.getMpackLogoUrl());
+          registryMpack.getMpackLogoUri());
         responses.add(response);
       }
     } else {
@@ -195,10 +195,10 @@ public class RegistryMpackResourceProvider extends 
AbstractControllerResourcePro
       if(registryMpack != null) {
         RegistryMpackResponse response = new RegistryMpackResponse(
           registry.getRegistryId(),
+          registryMpack.getMpackId(),
           registryMpack.getMpackName(),
-          registryMpack.getMpackDisplayName(),
           registryMpack.getMpackDescription(),
-          registryMpack.getMpackLogoUrl());
+          registryMpack.getMpackLogoUri());
         responses.add(response);
       }
     }
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RegistryMpackVersionResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RegistryMpackVersionResourceProvider.java
index 4b5393d..7dfddb0 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RegistryMpackVersionResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RegistryMpackVersionResourceProvider.java
@@ -58,20 +58,18 @@ public class RegistryMpackVersionResourceProvider extends 
AbstractControllerReso
   public static final String ALL_PROPERTIES = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "*";
 
   public static final String REGISTRY_ID =  RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP +  "registry_id";
+  public static final String REGISTRY_MPACK_ID = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_id";
   public static final String REGISTRY_MPACK_NAME = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_name";
+  public static final String REGISTRY_MPACK_DESCRIPTION = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_description";
   public static final String REGISTRY_MPACK_VERSION = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_version";
-  public static final String REGISTRY_MPACK_BUILDNUM = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_buildnum";
-  public static final String REGISTRY_MPACK_URL = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_url";
-  public static final String REGISTRY_MPACK_DOC_URL = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_doc_url";
-  public static final String REGISTRY_MPACK_SERVICES = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "services";
-  public static final String REGISTRY_MPACK_COMPATIBLE_MPACKS = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "compatible_mpacks";
-  public static final String REGISTRY_MPACK_STACK_NAME_PROPERTY_ID = 
RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "stack_name";
-  public static final String REGISTRY_MPACK_STACK_VERSION_PROPERTY_ID =
-          RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + "stack_version";
-
+  public static final String REGISTRY_MPACK_URI = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_uri";
+  public static final String REGISTRY_MPACK_DOC_URI = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_doc_uri";
+  public static final String REGISTRY_MPACK_LOGO_URI = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_logo_uri";
+  public static final String REGISTRY_MPACK_DEPENDENCIES = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "mpack_dependencies";
+  public static final String REGISTRY_MPACK_MODULES = RESPONSE_KEY + 
PropertyHelper.EXTERNAL_PATH_SEP + "modules";
 
   private static Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(REGISTRY_ID, REGISTRY_MPACK_NAME));
+    Arrays.asList(REGISTRY_ID, REGISTRY_MPACK_ID, REGISTRY_MPACK_NAME));
 
   /**
    * The property ids for a software registry resource.
@@ -91,17 +89,15 @@ public class RegistryMpackVersionResourceProvider extends 
AbstractControllerReso
   static {
     // properties
     PROPERTY_IDS.add(REGISTRY_ID);
+    PROPERTY_IDS.add(REGISTRY_MPACK_ID);
     PROPERTY_IDS.add(REGISTRY_MPACK_NAME);
+    PROPERTY_IDS.add(REGISTRY_MPACK_DESCRIPTION);
     PROPERTY_IDS.add(REGISTRY_MPACK_VERSION);
-    PROPERTY_IDS.add(REGISTRY_MPACK_BUILDNUM);
-    PROPERTY_IDS.add(REGISTRY_MPACK_URL);
-    PROPERTY_IDS.add(REGISTRY_MPACK_DOC_URL);
-    PROPERTY_IDS.add(REGISTRY_MPACK_SERVICES);
-    PROPERTY_IDS.add(REGISTRY_MPACK_COMPATIBLE_MPACKS);
-    PROPERTY_IDS.add(REGISTRY_MPACK_STACK_NAME_PROPERTY_ID);
-    PROPERTY_IDS.add(REGISTRY_MPACK_STACK_VERSION_PROPERTY_ID);
-
-
+    PROPERTY_IDS.add(REGISTRY_MPACK_URI);
+    PROPERTY_IDS.add(REGISTRY_MPACK_DOC_URI);
+    PROPERTY_IDS.add(REGISTRY_MPACK_LOGO_URI);
+    PROPERTY_IDS.add(REGISTRY_MPACK_DEPENDENCIES);
+    PROPERTY_IDS.add(REGISTRY_MPACK_MODULES);
     // keys
     KEY_PROPERTY_IDS.put(Resource.Type.Registry, REGISTRY_ID);
     KEY_PROPERTY_IDS.put(Resource.Type.RegistryMpack, REGISTRY_MPACK_NAME);
@@ -157,15 +153,15 @@ public class RegistryMpackVersionResourceProvider extends 
AbstractControllerReso
     for (RegistryMpackVersionResponse response : responses) {
       Resource resource = new ResourceImpl(Resource.Type.RegistryMpackVersion);
       setResourceProperty(resource, REGISTRY_ID, response.getRegistryId(), 
requestedIds);
+      setResourceProperty(resource, REGISTRY_MPACK_ID, response.getMpackId(), 
requestedIds);
       setResourceProperty(resource, REGISTRY_MPACK_NAME, 
response.getMpackName(), requestedIds);
+      setResourceProperty(resource, REGISTRY_MPACK_DESCRIPTION, 
response.getMpackDescription(), requestedIds);
       setResourceProperty(resource, REGISTRY_MPACK_VERSION, 
response.getMpackVersion(), requestedIds);
-      setResourceProperty(resource, REGISTRY_MPACK_BUILDNUM, 
response.getMpackBuildNumber(), requestedIds);
-      setResourceProperty(resource, REGISTRY_MPACK_URL, 
response.getMpackUrl(), requestedIds);
-      setResourceProperty(resource, REGISTRY_MPACK_DOC_URL, 
response.getMpackDocUrl(), requestedIds);
-      setResourceProperty(resource, REGISTRY_MPACK_SERVICES, 
response.getMpackServices(), requestedIds);
-      String[] stackid = ((String) response.getStackId()).split("-");
-      setResourceProperty(resource, REGISTRY_MPACK_STACK_NAME_PROPERTY_ID, 
stackid[0], requestedIds);
-      setResourceProperty(resource, REGISTRY_MPACK_STACK_VERSION_PROPERTY_ID, 
stackid[1], requestedIds);
+      setResourceProperty(resource, REGISTRY_MPACK_URI, 
response.getMpackUri(), requestedIds);
+      setResourceProperty(resource, REGISTRY_MPACK_DOC_URI, 
response.getMpackDocUri(), requestedIds);
+      setResourceProperty(resource, REGISTRY_MPACK_LOGO_URI, 
response.getMpackLogoUri(), requestedIds);
+      setResourceProperty(resource, REGISTRY_MPACK_DEPENDENCIES, 
response.getDependencies(), requestedIds);
+      setResourceProperty(resource, REGISTRY_MPACK_MODULES, 
response.getModules(), requestedIds);
       sortedResources.add(resource);
     }
     sortedResources.sort(new Comparator<Resource>() {
@@ -244,14 +240,15 @@ public class RegistryMpackVersionResourceProvider extends 
AbstractControllerReso
       for (RegistryMpackVersion registryMpackVersion : 
registryMpack.getMpackVersions()) {
         RegistryMpackVersionResponse response = new 
RegistryMpackVersionResponse(
           registry.getRegistryId(),
+          registryMpack.getMpackId(),
           registryMpack.getMpackName(),
+          registryMpack.getMpackDescription(),
           registryMpackVersion.getMpackVersion(),
-          registryMpackVersion.getMpackBuildNumber(),
-          registryMpackVersion.getMpackUrl(),
-          registryMpackVersion.getMpackDocUrl(),
-          registryMpackVersion.getMpackServices(),
-          registryMpackVersion.getCompatibleMpacks(),
-          registryMpackVersion.getMpackStackId());
+          registryMpackVersion.getMpackUri(),
+          registryMpackVersion.getMpackDocUri(),
+          registryMpack.getMpackLogoUri(),
+          registryMpackVersion.getDependencies(),
+          registryMpackVersion.getModules());
         responses.add(response);
       }
     } else {
@@ -259,14 +256,15 @@ public class RegistryMpackVersionResourceProvider extends 
AbstractControllerReso
       if(registryMpackVersion != null) {
         RegistryMpackVersionResponse response = new 
RegistryMpackVersionResponse(
           registry.getRegistryId(),
+          registryMpack.getMpackId(),
           registryMpack.getMpackName(),
+          registryMpack.getMpackDescription(),
           registryMpackVersion.getMpackVersion(),
-          registryMpackVersion.getMpackBuildNumber(),
-          registryMpackVersion.getMpackUrl(),
-          registryMpackVersion.getMpackDocUrl(),
-          registryMpackVersion.getMpackServices(),
-          registryMpackVersion.getCompatibleMpacks(),
-          registryMpackVersion.getMpackStackId());
+          registryMpackVersion.getMpackUri(),
+          registryMpackVersion.getMpackDocUri(),
+          registryMpack.getMpackLogoUri(),
+          registryMpackVersion.getDependencies(),
+          registryMpackVersion.getModules());
         responses.add(response);
       }
     }
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackGenerator.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackGenerator.java
index 6795aef..f274982 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackGenerator.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackGenerator.java
@@ -243,7 +243,6 @@ public class MpackGenerator {
     Mpack mpack = new Mpack();
     mpack.setName(dstStackName);
     mpack.setVersion(vdf.release.version);
-    mpack.setStackId(dstStackId.getStackId());
     mpack.setDescription(dstStackName + " Ambari Management Pack");
     Map<String, String> prereqs = new HashMap<>();
     prereqs.put("min-ambari-version", "3.0.0.0");
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java 
b/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java
index e272817..d77c5e1 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/mpack/MpackManager.java
@@ -121,9 +121,10 @@ public class MpackManager {
                     "UTF-8");
                   Gson gson = new Gson();
                   Mpack existingMpack = gson.fromJson(mpackJsonContents, 
Mpack.class);
-                  existingMpack.setMpackId(mpackEntity.getMpackId());
+                  existingMpack.setResourceId(mpackEntity.getId());
                   existingMpack.setMpackUri(mpackEntity.getMpackUri());
-                  mpackMap.put(mpackEntity.getMpackId(), existingMpack);
+                  existingMpack.setRegistryId(mpackEntity.getRegistryId());
+                  mpackMap.put(mpackEntity.getId(), existingMpack);
                 }
               }
             }
@@ -158,7 +159,7 @@ public class MpackManager {
   public MpackResponse registerMpack(MpackRequest mpackRequest)
     throws IOException, IllegalArgumentException, 
ResourceAlreadyExistsException {
 
-    Long mpackId;
+    Long mpackResourceId;
     String mpackName = "";
     String mpackVersion = "";
     Mpack mpack = new Mpack();
@@ -170,27 +171,25 @@ public class MpackManager {
     if (mpackRequest.getRegistryId() != null) {
       mpackName = mpackRequest.getMpackName();
       mpackVersion = mpackRequest.getMpackVersion();
-      mpack.setRegistryId(mpackRequest.getRegistryId());
 
       LOG.info("Mpack Registration via Registry :" + mpackName);
 
       mpack = downloadMpackMetadata(mpackRequest.getMpackUri());
+      mpack.setRegistryId(mpackRequest.getRegistryId());
       isValidMetadata = validateMpackInfo(mpackName, mpackVersion, 
mpack.getName(), mpack.getVersion());
 
       if (isValidMetadata) {
         mpackTarPath = downloadMpack(mpackRequest.getMpackUri(), 
mpack.getDefinition());
         createMpackDirectory(mpack);
         mpackDirectory = mpacksStaging + File.separator + mpack.getName() + 
File.separator + mpack.getVersion();
+      } else {
+        String message =
+          "Incorrect information : Mismatch in - (" + mpackName + "," + 
mpack.getName() + ") or (" + mpackVersion
+            + "," + mpack.getVersion() + ")";
+        throw new IllegalArgumentException(message); //Mismatch in information
       }
-      else {
-          String message =
-            "Incorrect information : Mismatch in - (" + mpackName + "," + 
mpack.getName() + ") or (" + mpackVersion
-              + "," + mpack.getVersion() + ")";
-          throw new IllegalArgumentException(message); //Mismatch in 
information
-        }
-      }
-    //Mpack registration using direct download
-    else {
+    } else {
+      // Mpack registration using direct download
       mpack = downloadMpackMetadata(mpackRequest.getMpackUri());
       mpackTarPath = downloadMpack(mpackRequest.getMpackUri(), 
mpack.getDefinition());
 
@@ -202,13 +201,13 @@ public class MpackManager {
     }
     extractMpackTar(mpack, mpackTarPath, mpackDirectory);
     mpack.setMpackUri(mpackRequest.getMpackUri());
-    mpackId = populateDB(mpack);
+    mpackResourceId = populateDB(mpack);
 
-    if (mpackId != null) {
-      mpackMap.put(mpackId, mpack);
-      mpack.setMpackId(mpackId);
-      if (populateStackDB(mpack))
-        return new MpackResponse(mpack);
+    if (mpackResourceId != null) {
+      mpackMap.put(mpackResourceId, mpack);
+      mpack.setResourceId(mpackResourceId);
+      populateStackDB(mpack);
+      return new MpackResponse(mpack);
     }
     String message = "Mpack :" + mpackRequest.getMpackName() + " version: " + 
mpackRequest.getMpackVersion()
       + " already exists in server";
@@ -484,9 +483,8 @@ public class MpackManager {
     String actualMpackName,
     String actualMpackVersion) {
 
-    String strippedActualMpackVersion = actualMpackVersion.substring(0, 
actualMpackVersion.lastIndexOf('.'));
     if (expectedMpackName.equalsIgnoreCase(actualMpackName) && 
expectedMpackVersion
-      .equalsIgnoreCase(strippedActualMpackVersion)) {
+      .equalsIgnoreCase(actualMpackVersion)) {
       return true;
     } else {
       LOG.info("Incorrect information : Mismatch in - (" + expectedMpackName + 
"," + actualMpackName + ") or ("
@@ -530,8 +528,7 @@ public class MpackManager {
    * @param mpack
    * @throws IOException
    */
-  protected boolean populateStackDB(Mpack mpack) throws IOException {
-
+  protected void populateStackDB(Mpack mpack) throws IOException, 
ResourceAlreadyExistsException {
     String stackName = mpack.getName();
     String stackVersion = mpack.getVersion();
     StackEntity stackEntity = stackDAO.find(stackName, stackVersion);
@@ -541,12 +538,12 @@ public class MpackManager {
 
       stackEntity.setStackName(stackName);
       stackEntity.setStackVersion(stackVersion);
-      stackEntity.setMpackId(mpack.getMpackId());
+      stackEntity.setMpackId(mpack.getResourceId());
       stackDAO.create(stackEntity);
-      return true;
     } else {
-      LOG.error("Stack {}-{} already exists in the database", stackName, 
stackVersion);
-      return false;
+      String message = "Stack " + stackName + "-" + stackVersion + " already 
exists";
+      LOG.error(message);
+      throw new ResourceAlreadyExistsException(message);
     }
   }
 
@@ -578,7 +575,7 @@ public class MpackManager {
 
     LOG.info("Removing mpack :" + mpackName);
 
-    mpackMap.remove(mpackEntity.getMpackId());
+    mpackMap.remove(mpackEntity.getId());
     FileUtils.deleteDirectory(mpackDirToDelete);
 
     if (mpackDirectory.isDirectory()) {
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/MpackDAO.java 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/MpackDAO.java
index 3228130..43e2a7f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/MpackDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/MpackDAO.java
@@ -56,19 +56,19 @@ public class MpackDAO {
   @Transactional
   public Long create(MpackEntity mpackEntity) {
     m_entityManagerProvider.get().persist(mpackEntity);
-    return mpackEntity.getMpackId();
+    return mpackEntity.getId();
   }
 
   /**
    * Gets an mpack with the specified ID.
    *
-   * @param mpackId
-   *          the ID of the alert to retrieve.
+   * @param id
+   *          the ID of the mpack to retrieve.
    * @return the mpack or {@code null} if none exists.
    */
   @RequiresSession
-  public MpackEntity findById(long mpackId) {
-    return m_entityManagerProvider.get().find(MpackEntity.class, mpackId);
+  public MpackEntity findById(long id) {
+    return m_entityManagerProvider.get().find(MpackEntity.class, id);
   }
 
   /**
@@ -99,8 +99,8 @@ public class MpackDAO {
   }
 
   @Transactional
-  public void removeById(Long mpackId) {
-    m_entityManagerProvider.get().remove(findById(mpackId));
+  public void removeById(Long id) {
+    m_entityManagerProvider.get().remove(findById(id));
   }
 
 }
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/MpackEntity.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/MpackEntity.java
index d3f6f28..879d24a 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/MpackEntity.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/MpackEntity.java
@@ -41,7 +41,7 @@ import org.slf4j.LoggerFactory;
 @Entity
 @TableGenerator(name = "mpack_id_generator", table = "ambari_sequences", 
pkColumnName = "sequence_name", valueColumnName = "sequence_value", 
pkColumnValue = "mpack_id_seq", initialValue = 1)
 @NamedQueries({
-        @NamedQuery(name = "MpackEntity.findById", query = "SELECT mpack FROM 
MpackEntity mpack where mpack.mpackId = :mpackId"),
+        @NamedQuery(name = "MpackEntity.findById", query = "SELECT mpack FROM 
MpackEntity mpack where mpack.id = :id"),
         @NamedQuery(name = "MpackEntity.findAll", query = "SELECT mpack FROM 
MpackEntity mpack"),
         @NamedQuery(name = "MpackEntity.findByNameVersion", query = "SELECT 
mpack FROM MpackEntity mpack where mpack.mpackName = :mpackName and 
mpack.mpackVersion = :mpackVersion")})
 
@@ -50,7 +50,7 @@ public class MpackEntity {
   @Id
   @GeneratedValue(strategy = GenerationType.TABLE, generator = 
"mpack_id_generator")
   @Column(name = "id", nullable = false, updatable = false)
-  private Long mpackId;
+  private Long id;
 
   @Column(name = "registry_id", nullable = true, insertable = true, updatable 
= false, length = 10)
   private Long registryId;
@@ -64,8 +64,8 @@ public class MpackEntity {
   @Column(name = "mpack_uri", nullable = false)
   private String mpackUri;
 
-  public Long getMpackId() {
-    return mpackId;
+  public Long getId() {
+    return id;
   }
 
   public Long getRegistryId() {
@@ -84,8 +84,8 @@ public class MpackEntity {
     return mpackUri;
   }
 
-  public void setMpackId(Long mpackId) {
-    this.mpackId = mpackId;
+  public void setId(Long id) {
+    this.id = id;
   }
 
   public void setRegistryId(Long registryId) {
@@ -121,7 +121,7 @@ public class MpackEntity {
     MpackEntity that = (MpackEntity) object;
     EqualsBuilder equalsBuilder = new EqualsBuilder();
 
-    equalsBuilder.append(mpackId, that.mpackId);
+    equalsBuilder.append(id, that.id);
     equalsBuilder.append(mpackName, that.mpackName);
     equalsBuilder.append(mpackVersion, that.mpackVersion);
     return equalsBuilder.isEquals();
@@ -130,7 +130,7 @@ public class MpackEntity {
   /**
    * Generates a hash for the mpack based on the following criteria:
    * <ul>
-   * <li>{@link #mpackId}
+   * <li>{@link #id}
    * </ul>
    * <p/>
    * <p/>
@@ -138,7 +138,7 @@ public class MpackEntity {
    */
   @Override
   public int hashCode() {
-    return Objects.hash(mpackId, mpackName, mpackVersion);
+    return Objects.hash(id, mpackName, mpackVersion);
   }
 
   /**
@@ -147,7 +147,7 @@ public class MpackEntity {
   @Override
   public String toString() {
     StringBuilder buffer = new StringBuilder("MpackEntity{");
-    buffer.append("mpackId=").append(mpackId);
+    buffer.append("id=").append(id);
     if (null != registryId) {
       buffer.append(", registryId=").append(registryId);
     }
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/registry/RegistryAdvisor.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/registry/RegistryAdvisor.java
index 9d772ec..e524618 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/registry/RegistryAdvisor.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/registry/RegistryAdvisor.java
@@ -34,8 +34,12 @@ import 
org.apache.ambari.server.registry.RegistryRecommendationResponse.Registry
 import 
org.apache.ambari.server.registry.RegistryRecommendationResponse.RegistryRecommendations;
 import 
org.apache.ambari.server.registry.RegistryValidationResponse.RegistryValidationResponseBuilder;
 import 
org.apache.ambari.server.registry.RegistryValidationResponse.RegistryValidationResult;
+import org.apache.ambari.server.utils.MpackVersion;
 import org.apache.ambari.server.utils.SetUtils;
+
 import org.apache.ambari.server.utils.VersionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -46,9 +50,12 @@ import com.google.inject.Singleton;
 @Singleton
 public class RegistryAdvisor {
 
+  private final static Logger LOG = 
LoggerFactory.getLogger(RegistryAdvisor.class);
+
   private AmbariManagementController managementController;
   private long requestId = 0;
 
+
   /**
    * Given list of all possible mpack bundles, check compatibility and return 
compatible mpack bundles.
    * @param mpackBundles  all possible mpack bundles
@@ -76,19 +83,24 @@ public class RegistryAdvisor {
     }
     for(MpackEntry mvr: mpackMap.values()) {
       RegistryMpackVersion rmv = mvr.getRegistryMpackVersion();
-      List<RegistryMpackCompatiblity> compatiblities = 
(List<RegistryMpackCompatiblity>) rmv.getCompatibleMpacks();
-      if(compatiblities != null && !compatiblities.isEmpty()) {
-        for(RegistryMpackCompatiblity compatiblity : compatiblities) {
-          if(mpackMap.containsKey(compatiblity.getName())) {
-            String selectedVersion = 
mpackMap.get(compatiblity.getName()).getMpackVersion();
-            String minVersion = compatiblity.getMinVersion();
-            String maxVersion = compatiblity.getMaxVersion();
-            if(minVersion != null && !minVersion.isEmpty()
-              && VersionUtils.compareVersions(selectedVersion, minVersion) < 
0) {
+      List<RegistryMpackDependency> dependencies = 
(List<RegistryMpackDependency>) rmv.getDependencies();
+      if(dependencies != null && !dependencies.isEmpty()) {
+        for(RegistryMpackDependency dependency : dependencies) {
+          if(mpackMap.containsKey(dependency.getName())) {
+            String selectedVersion = 
mpackMap.get(dependency.getName()).getMpackVersion();
+            MpackVersion selectedMpackVersion = 
MpackVersion.parse(selectedVersion);
+            if(selectedMpackVersion == null) {
+              LOG.error("Cannot validate compatibility of mpack as the mpack 
version is not known");
               return false;
             }
-            if(maxVersion != null && !maxVersion.isEmpty()
-              && VersionUtils.compareVersions(selectedVersion, maxVersion) >= 
0) {
+            String minVersion = dependency.getMinVersion();
+            String maxVersion = dependency.getMaxVersion();
+            MpackVersion minMpackVersion = MpackVersion.parse(minVersion, 
false);
+            MpackVersion maxMpackVersion = MpackVersion.parse(maxVersion, 
false);
+            if(minMpackVersion != null && 
VersionUtils.compareTo(selectedMpackVersion, minMpackVersion)  < 0) {
+              return false;
+            }
+            if(maxMpackVersion != null && 
VersionUtils.compareTo(selectedMpackVersion, maxMpackVersion) >= 0) {
               return false;
             }
           }
@@ -248,7 +260,9 @@ public class RegistryAdvisor {
         for(Map.Entry<String, MpackEntry> mapEntry : o1Map.entrySet()) {
           MpackEntry o1Entry = mapEntry.getValue();
           MpackEntry o2Entry = o2Map.get(mapEntry.getKey());
-          int compareResult = 
VersionUtils.compareVersions(o1Entry.getMpackVersion(), 
o2Entry.getMpackVersion());
+          MpackVersion v1 = MpackVersion.parse(o1Entry.getMpackVersion());
+          MpackVersion v2 = MpackVersion.parse(o2Entry.getMpackVersion());
+          int compareResult = VersionUtils.compareTo(v1, v2);
           if(compareResult > 0) {
             o1Wins++;
           } else if(compareResult < 0) {
@@ -314,11 +328,15 @@ public class RegistryAdvisor {
     registryMpackVersions.sort(new Comparator<RegistryMpackVersion>() {
       @Override
       public int compare(final RegistryMpackVersion o1, final 
RegistryMpackVersion o2) {
-        return -1 * VersionUtils.compareVersions(o1.getMpackVersion(), 
o2.getMpackVersion());
+        MpackVersion v1 = MpackVersion.parse(o1.getMpackVersion());
+        MpackVersion v2 = MpackVersion.parse(o2.getMpackVersion());
+        return -1 *  VersionUtils.compareTo(v1, v2);
       }
     });
     for(RegistryMpackVersion registryMpackVersion : registryMpackVersions) {
-      if(VersionUtils.compareVersions(registryMpackVersion.getMpackVersion(), 
minMpackEntry.getMpackVersion()) > 0) {
+      MpackVersion version = 
MpackVersion.parse(registryMpackVersion.getMpackVersion());
+      MpackVersion minMpackVersion = 
MpackVersion.parse(minMpackEntry.getMpackVersion());
+      if(VersionUtils.compareTo(version, minMpackVersion) > 0) {
         MpackEntry mpackEntry = new MpackEntry(selectedMpackName, 
registryMpackVersion.getMpackVersion());
         MpackBundle mpackBundle = new MpackBundle(rank++, 
Collections.singletonList(mpackEntry));
         mpackBundles.add(mpackBundle);
@@ -496,7 +514,9 @@ public class RegistryAdvisor {
           for(Map.Entry<String, MpackEntry> mapEntry : o1Map.entrySet()) {
             MpackEntry o1Entry = mapEntry.getValue();
             MpackEntry o2Entry = o2Map.get(mapEntry.getKey());
-            int compareResult = 
VersionUtils.compareVersions(o1Entry.getMpackVersion(), 
o2Entry.getMpackVersion());
+            MpackVersion v1 = MpackVersion.parse(o1Entry.getMpackVersion());
+            MpackVersion v2 = MpackVersion.parse(o2Entry.getMpackVersion());
+            int compareResult = VersionUtils.compareTo(v1, v2);
             if(compareResult > 0) {
               o1Wins++;
             } else if(compareResult < 0) {
@@ -514,9 +534,10 @@ public class RegistryAdvisor {
         for(Map.Entry<String, MpackEntry> selectedEntry : 
selectedMpacksMap.entrySet()) {
           String selectedKey = selectedEntry.getKey();
           MpackEntry selectedMpackEntry = selectedEntry.getValue();
-          if (!mpackBundleMap.containsKey(selectedKey) ||
-            
!VersionUtils.areVersionsEqual(selectedMpackEntry.getMpackVersion(),
-              mpackBundleMap.get(selectedKey).getMpackVersion(), true)) {
+          MpackVersion selectedVersion = 
MpackVersion.parse(selectedMpackEntry.getMpackVersion());
+          MpackVersion bundleMpackVersion = 
MpackVersion.parse(mpackBundleMap.get(selectedKey).getMpackVersion());
+
+          if (!mpackBundleMap.containsKey(selectedKey) || 
!selectedVersion.equals(bundleMpackVersion)) {
             isMatch = false;
           }
         }
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/registry/RegistryMpack.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/registry/RegistryMpack.java
index d15a146..4ccd8bf 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/registry/RegistryMpack.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/registry/RegistryMpack.java
@@ -25,17 +25,18 @@ import org.apache.ambari.server.AmbariException;
  * Represents a single instance of a software registry
  */
 public interface RegistryMpack {
+
   /**
-   * Get mpack name
+   * Get mpack id
    * @return
    */
-  public String getMpackName();
+  public String getMpackId();
 
   /**
-   * Get mpack display name
+   * Get mpack name
    * @return
    */
-  public String getMpackDisplayName();
+  public String getMpackName();
 
   /**
    * Get mpack description
@@ -44,10 +45,10 @@ public interface RegistryMpack {
   public String getMpackDescription();
 
   /**
-   * Get mpack logo url
+   * Get mpack logo uri
    * @return
    */
-  public String getMpackLogoUrl();
+  public String getMpackLogoUri();
 
   /**
    * Get list of mpack versions
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/registry/RegistryMpackCompatiblity.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/registry/RegistryMpackDependency.java
similarity index 79%
rename from 
ambari-server/src/main/java/org/apache/ambari/server/registry/RegistryMpackCompatiblity.java
rename to 
ambari-server/src/main/java/org/apache/ambari/server/registry/RegistryMpackDependency.java
index 2774e62..c3f2ce2 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/registry/RegistryMpackCompatiblity.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/registry/RegistryMpackDependency.java
@@ -20,25 +20,33 @@ package org.apache.ambari.server.registry;
 import org.codehaus.jackson.annotate.JsonProperty;
 
 /**
- * Represents a single instance of a software registry
+ * Represents registry mpack dependency
  */
-public interface RegistryMpackCompatiblity {
+public interface RegistryMpackDependency {
+
+  /**
+   * Get dependent mpack id
+   * @return
+   */
+  @JsonProperty("id")
+  public String getId();
+
   /**
-   * Get name
+   * Get dependent mpack name
    * @return
    */
   @JsonProperty("name")
   public String getName();
 
   /**
-   * Get min version
+   * Get min version of dependent mpack
    * @return
    */
   @JsonProperty("minVersion")
   public String getMinVersion();
 
   /**
-   * Get max version
+   * Get max version of dependent mpack
    * @return
    */
   @JsonProperty("maxVersion")
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/registry/RegistryMpackService.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/registry/RegistryMpackService.java
deleted file mode 100644
index 9c3f244..0000000
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/registry/RegistryMpackService.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * 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.
- */
-package org.apache.ambari.server.registry;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * Represents a single instance of a service in a registry mpack
- */
-public interface RegistryMpackService {
-
-  /**
-   * Get name
-   * @return
-   */
-  @JsonProperty("name")
-  public String getName();
-
-  /**
-   * Get version
-   * @return
-   */
-  @JsonProperty("version")
-  public String getVersion();
-
-}
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/registry/RegistryMpackVersion.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/registry/RegistryMpackVersion.java
index ed7abc2..005d256 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/registry/RegistryMpackVersion.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/registry/RegistryMpackVersion.java
@@ -19,6 +19,8 @@ package org.apache.ambari.server.registry;
 
 import java.util.List;
 
+import org.apache.ambari.server.state.Module;
+
 /**
  * Represents a single instance of a registry mpack version
  */
@@ -30,39 +32,22 @@ public interface RegistryMpackVersion {
   public String getMpackVersion();
 
   /**
-   * Get mpack build number
+   * Get mpack uri
    * @return
    */
-  public String getMpackBuildNumber();
+  public String getMpackUri();
 
   /**
-   * Get mpack url
+   * Get mpack doc uri
    * @return
    */
-  public String getMpackUrl();
+  public String getMpackDocUri();
 
   /**
-   * Get mpack doc url
+   * Get list of mpack dependencies
    * @return
    */
-  public String getMpackDocUrl();
-
+  List<? extends RegistryMpackDependency> getDependencies();
 
-  /**
-   * Get mpack stack id
-   * @return
-   */
-  public String getMpackStackId();
-
-  /**
-   * Get list of services in the mpack version
-   * @return
-   */
-  public List<? extends RegistryMpackService> getMpackServices();
-
-  /**
-   * Get list of compatible mpacks
-   * @return
-   */
-  public List<? extends RegistryMpackCompatiblity> getCompatibleMpacks();
+  List<Module> getModules();
 }
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/registry/json/JsonRegistryMpack.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/registry/json/JsonRegistryMpack.java
index d58a29d..decd695 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/registry/json/JsonRegistryMpack.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/registry/json/JsonRegistryMpack.java
@@ -32,28 +32,30 @@ import com.google.gson.annotations.SerializedName;
  */
 public class JsonRegistryMpack implements RegistryMpack {
 
+  @SerializedName("id")
+  private String id;
+
   @SerializedName("name")
   private String name;
 
-  @SerializedName("displayName")
-  private String displayName;
-
   @SerializedName("description")
   private String description;
 
-  @SerializedName("logoUrl")
-  private String logoUrl;
+  @SerializedName("logoUri")
+  private String logoUri;
 
-  @SerializedName("mpackVersions")
+  @SerializedName("versions")
   private ArrayList<JsonRegistryMpackVersion> mpackVersions;
 
   @Override
-  public String getMpackName() {
-    return name;
+  public String getMpackId() {
+    return id;
   }
 
   @Override
-  public String getMpackDisplayName() {return displayName;}
+  public String getMpackName() {
+    return name;
+  }
 
   @Override
   public String getMpackDescription() {
@@ -61,8 +63,8 @@ public class JsonRegistryMpack implements RegistryMpack {
   }
 
   @Override
-  public String getMpackLogoUrl() {
-    return logoUrl;
+  public String getMpackLogoUri() {
+    return logoUri;
   }
 
   @Override
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/registry/json/JsonRegistryMpackCompatibility.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/registry/json/JsonRegistryMpackDependency.java
similarity index 80%
rename from 
ambari-server/src/main/java/org/apache/ambari/server/registry/json/JsonRegistryMpackCompatibility.java
rename to 
ambari-server/src/main/java/org/apache/ambari/server/registry/json/JsonRegistryMpackDependency.java
index 1934b8a..e029d8e 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/registry/json/JsonRegistryMpackCompatibility.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/registry/json/JsonRegistryMpackDependency.java
@@ -17,14 +17,17 @@
  */
 package org.apache.ambari.server.registry.json;
 
-import org.apache.ambari.server.registry.RegistryMpackCompatiblity;
+import org.apache.ambari.server.registry.RegistryMpackDependency;
 
 import com.google.gson.annotations.SerializedName;
 
 /**
- * JSON implementation of {@link RegistryMpackCompatiblity}
+ * JSON implementation of {@link RegistryMpackDependency}
  */
-public class JsonRegistryMpackCompatibility implements 
RegistryMpackCompatiblity {
+public class JsonRegistryMpackDependency implements RegistryMpackDependency {
+
+  @SerializedName("id")
+  private String id;
 
   @SerializedName("name")
   private String name;
@@ -36,6 +39,11 @@ public class JsonRegistryMpackCompatibility implements 
RegistryMpackCompatiblity
   private String maxVersion;
 
   @Override
+  public String getId() {
+    return id;
+  }
+
+  @Override
   public String getName() {
     return name;
   }
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/registry/json/JsonRegistryMpackService.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/registry/json/JsonRegistryMpackService.java
deleted file mode 100644
index 9ae45d5..0000000
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/registry/json/JsonRegistryMpackService.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * 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.
- */
-package org.apache.ambari.server.registry.json;
-
-import org.apache.ambari.server.registry.RegistryMpackService;
-
-import com.google.gson.annotations.SerializedName;
-
-/**
- * JSON implementation of {@link RegistryMpackService}
- */
-public class JsonRegistryMpackService implements RegistryMpackService {
-
-  @SerializedName("name")
-  private String name;
-
-  @SerializedName("version")
-  private String version;
-
-  @Override public String getName() {
-    return name;
-  }
-
-  @Override public String getVersion() {
-    return version;
-  }
-}
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/registry/json/JsonRegistryMpackVersion.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/registry/json/JsonRegistryMpackVersion.java
index 51aa0ca..d946331 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/registry/json/JsonRegistryMpackVersion.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/registry/json/JsonRegistryMpackVersion.java
@@ -17,13 +17,21 @@
  */
 package org.apache.ambari.server.registry.json;
 
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.ambari.server.registry.RegistryMpackCompatiblity;
-import org.apache.ambari.server.registry.RegistryMpackService;
+import org.apache.ambari.server.registry.RegistryMpackDependency;
 import org.apache.ambari.server.registry.RegistryMpackVersion;
+import org.apache.ambari.server.state.Module;
+import org.apache.ambari.server.state.Mpack;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+import com.google.gson.Gson;
 import com.google.gson.annotations.SerializedName;
 
 /**
@@ -33,23 +41,16 @@ public class JsonRegistryMpackVersion implements 
RegistryMpackVersion {
   @SerializedName("version")
   private String version;
 
-  @SerializedName("buildNumber")
-  private String buildNumber;
+  @SerializedName("mpackUri")
+  private String mpackUri;
 
-  @SerializedName("mpackUrl")
-  private String mpackUrl;
+  @SerializedName("docUri")
+  private String docUri;
 
-  @SerializedName("docUrl")
-  private String docUrl;
+  @SerializedName("dependencies")
+  private ArrayList<JsonRegistryMpackDependency> dependencies;
 
-  @SerializedName("stack-id")
-  private String stackId;
-
-  @SerializedName("services")
-  private ArrayList<JsonRegistryMpackService> services;
-
-  @SerializedName("compatibleMpacks")
-  private ArrayList<JsonRegistryMpackCompatibility> compatibleMpacks;
+  private Mpack mpack = null;
 
   @Override
   public String getMpackVersion() {
@@ -57,32 +58,39 @@ public class JsonRegistryMpackVersion implements 
RegistryMpackVersion {
   }
 
   @Override
-  public String getMpackBuildNumber() {
-    return buildNumber;
+  public String getMpackUri() {
+    return mpackUri;
   }
 
   @Override
-  public String getMpackUrl() {
-    return mpackUrl;
+  public String getMpackDocUri() {
+    return docUri;
   }
 
   @Override
-  public String getMpackDocUrl() {
-    return docUrl;
+  public List<? extends RegistryMpackDependency> getDependencies() {
+    return dependencies;
   }
 
-  @Override
-  public List<? extends RegistryMpackService> getMpackServices() {
-    return services;
-  }
+  private final static Logger LOG = 
LoggerFactory.getLogger(JsonRegistryMpackVersion.class);
 
-  @Override
-  public List<? extends RegistryMpackCompatiblity> getCompatibleMpacks() {
-    return compatibleMpacks;
-  }
 
   @Override
-  public String getMpackStackId() {
-    return stackId;
+  public List<Module> getModules() {
+
+    if(mpack == null) {
+      try {
+        URL url = new URL(mpackUri);
+        InputStreamReader reader = new InputStreamReader(url.openStream());
+        Gson gson = new Gson();
+        mpack = gson.fromJson(reader, Mpack.class);
+      } catch (MalformedURLException e) {
+        LOG.warn("Failed to get list of modules, malformed mpack uri {}", 
mpackUri);
+      }
+      catch (IOException e) {
+        LOG.warn("Failed to get list of modules, mpack uri {} cannot be read", 
mpackUri);
+      }
+    }
+    return mpack == null? null: mpack.getModules();
   }
 }
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/Mpack.java 
b/ambari-server/src/main/java/org/apache/ambari/server/state/Mpack.java
index 62904f9..76e43d4 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/Mpack.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/Mpack.java
@@ -27,18 +27,25 @@ import com.google.gson.annotations.SerializedName;
  */
 public class Mpack {
 
-  private Long mpackId;
+  /**
+   * Mpack DB Id
+   */
+  private Long resourceId;
 
   private Long registryId;
 
+  /**
+   * Mpack id as defined in mpack.json
+   */
+  @SerializedName("id")
+  private String mpackId;
+
   @SerializedName("name")
   private String name;
 
   @SerializedName("version")
   private String version;
 
-  @SerializedName("artifacts-path")
-  private String artifactsPath;
 
   @SerializedName("prerequisites")
   private Map<String, String> prerequisites;
@@ -46,15 +53,6 @@ public class Mpack {
   @SerializedName("modules")
   private List<Module> modules;
 
-  @SerializedName("modules-path")
-  private String modulesPath;
-
-  @SerializedName("mpack-path")
-  private String mpackPath;
-
-  @SerializedName("stack-id")
-  private String stackId;
-
   @SerializedName("definition")
   private String definition;
 
@@ -63,12 +61,12 @@ public class Mpack {
 
   private String mpackUri;
 
-  public Long getMpackId() {
-    return mpackId;
+  public Long getResourceId() {
+    return resourceId;
   }
 
-  public void setMpackId(Long mpackId) {
-    this.mpackId = mpackId;
+  public void setResourceId(Long resourceId) {
+    this.resourceId = resourceId;
   }
 
   public Long getRegistryId() {
@@ -87,6 +85,14 @@ public class Mpack {
     this.mpackUri = mpackUri;
   }
 
+  public String getMpackId() {
+    return mpackId;
+  }
+
+  public void setMpackId(String mpackId) {
+    this.mpackId = mpackId;
+  }
+
   public String getName() {
     return name;
   }
@@ -127,37 +133,6 @@ public class Mpack {
     this.modules = modules;
   }
 
-  public String getStackId() {
-    return stackId;
-  }
-
-  public void setStackId(String stackId) {
-    this.stackId = stackId;
-  }
-
-  public String getArtifactsPath() {
-    return artifactsPath;
-  }
-
-  public void setArtifactsPath(String artifactsPath) {
-    this.artifactsPath = artifactsPath;
-  }
-
-  public String getModulesPath() {
-    return modulesPath;
-  }
-
-  public void setModulesPath(String modulesPath) {
-    this.modulesPath = modulesPath;
-  }
-
-  public String getMpackPath() {
-    return mpackPath;
-  }
-
-  public void setMpackPath(String mpackPath) {
-    this.mpackPath = mpackPath;
-  }
 
   public String getDefinition() {
     return definition;
@@ -174,16 +149,13 @@ public class Mpack {
 
     Mpack mpack = (Mpack) o;
 
-    if (!mpackId.equals(mpack.mpackId)) return false;
+    if (!resourceId.equals(mpack.resourceId)) return false;
     if (registryId != null ? !registryId.equals(mpack.registryId) : 
mpack.registryId != null) return false;
+    if (!mpackId.equals(mpack.mpackId)) return false;
     if (!name.equals(mpack.name)) return false;
     if (!version.equals(mpack.version)) return false;
-    if (!artifactsPath.equals(mpack.artifactsPath)) return false;
     if (!prerequisites.equals(mpack.prerequisites)) return false;
     if (!modules.equals(mpack.modules)) return false;
-    if (!modulesPath.equals(mpack.modulesPath)) return false;
-    if (!mpackPath.equals(mpack.mpackPath)) return false;
-    if (!stackId.equals(mpack.stackId)) return false;
     if (!definition.equals(mpack.definition)) return false;
     if (!description.equals(mpack.description)) return false;
     return mpackUri.equals(mpack.mpackUri);
@@ -191,16 +163,13 @@ public class Mpack {
 
   @Override
   public int hashCode() {
-    int result = mpackId.hashCode();
+    int result = resourceId.hashCode();
     result = 31 * result + (registryId != null ? registryId.hashCode() : 0);
+    result = 31 * result + mpackId.hashCode();
     result = 31 * result + name.hashCode();
     result = 31 * result + version.hashCode();
-    result = 31 * result + artifactsPath.hashCode();
     result = 31 * result + prerequisites.hashCode();
     result = 31 * result + modules.hashCode();
-    result = 31 * result + modulesPath.hashCode();
-    result = 31 * result + mpackPath.hashCode();
-    result = 31 * result + stackId.hashCode();
     result = 31 * result + definition.hashCode();
     result = 31 * result + description.hashCode();
     result = 31 * result + mpackUri.hashCode();
@@ -210,16 +179,13 @@ public class Mpack {
   @Override
   public String toString() {
     return "Mpack{" +
-            "mpackId=" + mpackId +
+            "id=" + resourceId +
             ", registryId=" + registryId +
+            ", mpackId='" + mpackId + '\'' +
             ", name='" + name + '\'' +
             ", version='" + version + '\'' +
-            ", artifactsPath='" + artifactsPath + '\'' +
             ", prerequisites=" + prerequisites +
             ", modules=" + modules +
-            ", modulesPath='" + modulesPath + '\'' +
-            ", mpackPath='" + mpackPath + '\'' +
-            ", stackId='" + stackId + '\'' +
             ", definition='" + definition + '\'' +
             ", description='" + description + '\'' +
             ", mpackUri='" + mpackUri + '\'' +
@@ -227,6 +193,9 @@ public class Mpack {
   }
 
   public void copyFrom(Mpack mpack) {
+    if (this.resourceId == null) {
+      this.resourceId = mpack.getResourceId();
+    }
     if (this.name == null) {
       this.name = mpack.getName();
     }
@@ -236,9 +205,6 @@ public class Mpack {
     if (this.version == null) {
       this.version = mpack.getVersion();
     }
-    if (this.stackId == null) {
-      this.stackId = mpack.getStackId();
-    }
     if (this.registryId == null) {
       this.registryId = mpack.getRegistryId();
     }
@@ -248,18 +214,9 @@ public class Mpack {
     if (this.modules == null) {
       this.modules = mpack.getModules();
     }
-    if (this.artifactsPath == null) {
-      this.artifactsPath = mpack.getArtifactsPath();
-    }
     if (this.prerequisites == null) {
       this.prerequisites = mpack.getPrerequisites();
     }
-    if (this.modulesPath == null) {
-      this.modulesPath = mpack.getModulesPath();
-    }
-    if (this.mpackPath == null) {
-      this.mpackPath = mpack.getMpackPath();
-    }
     if (this.definition == null) {
       this.definition = mpack.getDefinition();
     }
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/utils/MpackVersion.java 
b/ambari-server/src/main/java/org/apache/ambari/server/utils/MpackVersion.java
index ad3fdc8..31bb167 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/utils/MpackVersion.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/utils/MpackVersion.java
@@ -23,6 +23,9 @@ import java.util.regex.Pattern;
 
 import org.apache.commons.lang.StringUtils;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 /**
  * This class should be used to compare mpack and stack versions.
  * Base method which should be used is parse/parseStackVersion, depends
@@ -38,11 +41,15 @@ public class MpackVersion implements 
Comparable<MpackVersion> {
   private final static String VERSION_WITH_HOTFIX_AND_BUILD_PATTERN = 
"^([0-9]+).([0-9]+).([0-9]+)-h([0-9]+)-b([0-9]+)";
   private final static String VERSION_WITH_BUILD_PATTERN = 
"^([0-9]+).([0-9]+).([0-9]+)-b([0-9]+)";
   private final static String LEGACY_STACK_VERSION_PATTERN = 
"^([0-9]+).([0-9]+).([0-9]+).([0-9]+)-([0-9]+)";
+  private final static String FORMAT_VERSION_PATTERN = 
"^([0-9]+)(\\.)?([0-9]+)?(\\.)?([0-9]+)?(-h)?([0-9]+)?(-b)?([0-9]+)?";
 
   // Patterns for previous RE
   private final static Pattern PATTERN_WITH_HOTFIX = 
Pattern.compile(VERSION_WITH_HOTFIX_AND_BUILD_PATTERN);
   private final static Pattern PATTERN_LEGACY_STACK_VERSION = 
Pattern.compile(LEGACY_STACK_VERSION_PATTERN);
   private final static Pattern PATTERN_WITHOUT_HOTFIX = 
Pattern.compile(VERSION_WITH_BUILD_PATTERN);
+  private final static Pattern PATTERN_FORMAT_VERSION = 
Pattern.compile(FORMAT_VERSION_PATTERN);
+
+  private final static Logger LOG = 
LoggerFactory.getLogger(MpackVersion.class);
 
   // Parts of version
   private int major;
@@ -68,20 +75,59 @@ public class MpackVersion implements 
Comparable<MpackVersion> {
    * @return MpackVersion instance which contains parsed version
    * */
   public static MpackVersion parse(String mpackVersion) {
-    Matcher versionMatcher = validateMpackVersion(mpackVersion);
-    MpackVersion result = null;
+    return parse(mpackVersion, true);
+  }
 
+  public static MpackVersion parse(String mpackVersion, boolean strict) {
+
+    if(!strict) {
+      mpackVersion = format(mpackVersion);
+    }
+    Matcher versionMatcher = validateMpackVersion(mpackVersion);
+    if(versionMatcher == null) {
+      throw new IllegalArgumentException("Wrong format for mpack version");
+    }
     if (versionMatcher.pattern().pattern().equals(VERSION_WITH_BUILD_PATTERN)) 
{
-      result = new MpackVersion(Integer.parseInt(versionMatcher.group(1)), 
Integer.parseInt(versionMatcher.group(2)),
+      return new MpackVersion(Integer.parseInt(versionMatcher.group(1)), 
Integer.parseInt(versionMatcher.group(2)),
               Integer.parseInt(versionMatcher.group(3)), 0, 
Integer.parseInt(versionMatcher.group(4)));
-
-    } else {
-      result = new MpackVersion(Integer.parseInt(versionMatcher.group(1)), 
Integer.parseInt(versionMatcher.group(2)),
+    } else if 
(versionMatcher.pattern().pattern().equals(VERSION_WITH_HOTFIX_AND_BUILD_PATTERN))
 {
+      return new MpackVersion(Integer.parseInt(versionMatcher.group(1)), 
Integer.parseInt(versionMatcher.group(2)),
               Integer.parseInt(versionMatcher.group(3)), 
Integer.parseInt(versionMatcher.group(4)), 
Integer.parseInt(versionMatcher.group(5)));
-
+    } else {
+      throw new IllegalArgumentException("Wrong format for mpack version");
     }
+  }
 
-    return result;
+  /**
+   * Method to format an mpack version in 
{major}.{minor}.{maint}-h{hotfix}-b{build} format
+   * @param mpackVersion input mpack version string
+   * @return formatted mpack version string
+   */
+  public static String format(String mpackVersion) {
+    Matcher m = PATTERN_FORMAT_VERSION.matcher(mpackVersion);
+    if(m.matches()) {
+      String majorVersion = m.group(1);
+      String minorVersion = m.group(3);
+      String maintVersion = m.group(5);
+      String hotfixNum = m.group(7);
+      String buildNum = m.group(9);
+      if(hotfixNum != null || buildNum != null) {
+        if(minorVersion == null || maintVersion == null) {
+          // Both minorVersion and maintVersion should be specified
+          throw new IllegalArgumentException("Wrong format for mpack version");
+        }
+      }
+      minorVersion = minorVersion != null? minorVersion: "0";
+      maintVersion = maintVersion != null? maintVersion: "0";
+      hotfixNum = hotfixNum != null? hotfixNum: "0";
+      buildNum = buildNum != null? buildNum: "0";
+      String formattedMpackVersion = String.format("%s.%s.%s-h%s-b%s",
+        majorVersion, minorVersion, maintVersion, hotfixNum, buildNum);
+      return formattedMpackVersion;
+
+    } else {
+      throw new IllegalArgumentException("Wrong format for mpack version");
+    }
   }
 
   /**
@@ -93,10 +139,18 @@ public class MpackVersion implements 
Comparable<MpackVersion> {
    * */
   public static MpackVersion parseStackVersion(String stackVersion) {
     Matcher versionMatcher = validateStackVersion(stackVersion);
-    MpackVersion result = new 
MpackVersion(Integer.parseInt(versionMatcher.group(1)), 
Integer.parseInt(versionMatcher.group(2)),
-          Integer.parseInt(versionMatcher.group(3)), 
Integer.parseInt(versionMatcher.group(4)), 
Integer.parseInt(versionMatcher.group(5)));
+    if(versionMatcher == null) {
+      throw new IllegalArgumentException("Wrong format for mpack version");
+    }
 
-    return result;
+    
if(versionMatcher.pattern().pattern().equals(LEGACY_STACK_VERSION_PATTERN)) {
+      return new MpackVersion(Integer.parseInt(versionMatcher.group(1)),
+        Integer.parseInt(versionMatcher.group(2)),
+        Integer.parseInt(versionMatcher.group(3)), 
Integer.parseInt(versionMatcher.group(4)),
+        Integer.parseInt(versionMatcher.group(5)));
+    } else {
+      throw new IllegalArgumentException("Wrong format for mpack version");
+    }
   }
 
   /**
@@ -114,12 +168,9 @@ public class MpackVersion implements 
Comparable<MpackVersion> {
 
     String stackVersion = StringUtils.trim(version);
 
-    Matcher versionMatcher = PATTERN_WITH_HOTFIX.matcher(stackVersion);
+    Matcher versionMatcher = 
PATTERN_LEGACY_STACK_VERSION.matcher(stackVersion);
     if (!versionMatcher.find()) {
-      versionMatcher = PATTERN_LEGACY_STACK_VERSION.matcher(stackVersion);
-      if (!versionMatcher.find()) {
-        throw new IllegalArgumentException("Wrong format for stack version, 
should be N.N.N.N-N or N.N.N-hN-bN");
-      }
+      throw new IllegalArgumentException("Wrong format for stack version, 
should be N.N.N.N-N or N.N.N-hN-bN");
     }
 
     return versionMatcher;
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/utils/VersionUtils.java 
b/ambari-server/src/main/java/org/apache/ambari/server/utils/VersionUtils.java
index 6a3d81c..4d1e302 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/utils/VersionUtils.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/utils/VersionUtils.java
@@ -20,7 +20,10 @@ package org.apache.ambari.server.utils;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.annotation.Nullable;
+
 import org.apache.ambari.server.bootstrap.BootStrapImpl;
+
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.math.NumberUtils;
 
@@ -253,7 +256,15 @@ public class VersionUtils {
     compare = v2 - v1;
 
     return Integer.compare(compare, 0);
-
   }
 
+  /**
+   * Helper function to compare two comparable versions with null checks
+   * @param v1 The first version
+   * @param v2 The second version
+   * @return 0 if both are equal, <0 if first one is lower, >0 otherwise
+   */
+  public static int compareTo(@Nullable Comparable v1, @Nullable Comparable 
v2) {
+    return v1 == null ? (v2 == null ? 0 : -1) : v2 == null ? 1 : 
v1.compareTo(v2);
+  }
 }
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
index 85686e2..4b996e5 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerImplTest.java
@@ -2225,7 +2225,7 @@ public class AmbariManagementControllerImplTest {
     MpackRequest mpackRequest = createNiceMock(MpackRequest.class);
     RequestStatusResponse response = new RequestStatusResponse(new Long(201));
     Mpack mpack = new Mpack();
-    mpack.setMpackId((long)100);
+    mpack.setResourceId((long)100);
     mpack.setModules(new ArrayList<Module>());
     mpack.setPrerequisites(new HashMap<String, String>());
     mpack.setRegistryId(new Long(100));
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/MpackRequestTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/MpackRequestTest.java
index 694c499..6c48906 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/MpackRequestTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/MpackRequestTest.java
@@ -29,7 +29,7 @@ public class MpackRequestTest {
   public void testBasicGetAndSet() {
     MpackRequest mpackRequest =
             new MpackRequest(1L);
-    Assert.assertEquals((Long)1L, mpackRequest.getMpackId());
+    Assert.assertEquals((Long)1L, mpackRequest.getId());
     mpackRequest.setMpackUri("abc.tar.gz");
     mpackRequest.setRegistryId(1L);
     mpackRequest.setMpackVersion("3.0");
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/MpackResponseTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/MpackResponseTest.java
index 9273a04..0b60e10 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/MpackResponseTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/MpackResponseTest.java
@@ -32,7 +32,7 @@ public class MpackResponseTest {
   @Test
   public void testBasicGetAndSet() {
     MpackResponse mpackResponse = new MpackResponse(setupMpack());
-    Assert.assertEquals((Long)100L, mpackResponse.getMpackId());
+    Assert.assertEquals((Long)100L, mpackResponse.getId());
     Assert.assertEquals((Long)100L, mpackResponse.getRegistryId());
     Assert.assertEquals("3.0",mpackResponse.getMpackVersion());
     Assert.assertEquals("abc.tar.gz",mpackResponse.getMpackUri());
@@ -41,7 +41,7 @@ public class MpackResponseTest {
   }
   public Mpack setupMpack() {
     Mpack mpack = new Mpack();
-    mpack.setMpackId(100L);
+    mpack.setResourceId(100L);
     mpack.setModules(new ArrayList<Module>());
     mpack.setPrerequisites(new HashMap<String, String>());
     mpack.setRegistryId(100L);
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/RegistryRequestTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/RegistryRequestTest.java
index c61cafb..fb10760 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/RegistryRequestTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/RegistryRequestTest.java
@@ -28,9 +28,9 @@ public class RegistryRequestTest {
   @Test
   public void testBasicGetAndSet() {
     RegistryRequest registryRequest =
-            new RegistryRequest((Long) 1L, "hwx", RegistryType.JSON, 
"abc.tar.gz");
+            new RegistryRequest((Long) 1L, "hwx", RegistryType.JSON, 
"hwx-software-registry.json");
     Assert.assertEquals((Long) 1L, registryRequest.getRegistryId());
-    Assert.assertEquals("abc.tar.gz", registryRequest.getRegistryUri());
+    Assert.assertEquals("hwx-software-registry.json", 
registryRequest.getRegistryUri());
     Assert.assertEquals("hwx", registryRequest.getRegistryName());
     Assert.assertEquals(RegistryType.JSON, registryRequest.getRegistryType());
   }
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MpackResourceProviderTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MpackResourceProviderTest.java
index 6faec3a..bb1dbec 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MpackResourceProviderTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MpackResourceProviderTest.java
@@ -76,14 +76,14 @@ public class MpackResourceProviderTest {
     Resource.Type type = Resource.Type.Mpack;
 
     Resource resourceExpected1 = new ResourceImpl(Resource.Type.Mpack);
-    resourceExpected1.setProperty(MpackResourceProvider.MPACK_ID, (long)1);
+    resourceExpected1.setProperty(MpackResourceProvider.MPACK_RESOURCE_ID, 
(long)1);
     resourceExpected1.setProperty(MpackResourceProvider.MPACK_NAME, 
"TestMpack1");
     resourceExpected1.setProperty(MpackResourceProvider.MPACK_VERSION, "3.0");
     resourceExpected1.setProperty(MpackResourceProvider.MPACK_URI, 
"abcd.tar.gz");
     resourceExpected1.setProperty(MpackResourceProvider.REGISTRY_ID, null);
 
     Resource resourceExpected2 = new ResourceImpl(Resource.Type.Mpack);
-    resourceExpected2.setProperty(MpackResourceProvider.MPACK_ID, (long)2);
+    resourceExpected2.setProperty(MpackResourceProvider.MPACK_RESOURCE_ID, 
(long)2);
     resourceExpected2.setProperty(MpackResourceProvider.MPACK_NAME, 
"TestMpack2");
     resourceExpected2.setProperty(MpackResourceProvider.MPACK_VERSION, "3.0");
     resourceExpected2.setProperty(MpackResourceProvider.MPACK_URI, 
"abc.tar.gz");
@@ -91,14 +91,14 @@ public class MpackResourceProviderTest {
 
     List<MpackEntity> entities = new ArrayList<>();
     MpackEntity entity = new MpackEntity();
-    entity.setMpackId((long) 1);
+    entity.setId((long) 1);
     entity.setMpackUri("abcd.tar.gz");
     entity.setMpackName("TestMpack1");
     entity.setMpackVersion("3.0");
     entities.add(entity);
 
     entity = new MpackEntity();
-    entity.setMpackId((long) 2);
+    entity.setId((long) 2);
     entity.setMpackUri("abc.tar.gz");
     entity.setMpackName("TestMpack2");
     entity.setMpackVersion("3.0");
@@ -124,7 +124,7 @@ public class MpackResourceProviderTest {
     Assert.assertEquals(2, resources.size());
 
     for (Resource resource : resources) {
-      Long mpackId = (Long) 
resource.getPropertyValue(MpackResourceProvider.MPACK_ID);
+      Long mpackId = (Long) 
resource.getPropertyValue(MpackResourceProvider.MPACK_RESOURCE_ID);
       if (mpackId == (long) 1) {
         
Assert.assertEquals(resourceExpected1.getPropertyValue(MpackResourceProvider.MPACK_NAME),
 (String) resource.getPropertyValue(MpackResourceProvider.MPACK_NAME));
         
Assert.assertEquals(resourceExpected1.getPropertyValue(MpackResourceProvider.MPACK_VERSION),
 (String) resource.getPropertyValue(MpackResourceProvider.MPACK_VERSION));
@@ -149,11 +149,11 @@ public class MpackResourceProviderTest {
     Resource.Type type = Resource.Type.Mpack;
 
     Predicate predicate = new PredicateBuilder().property(
-            MpackResourceProvider.MPACK_ID).equals(
+            MpackResourceProvider.MPACK_RESOURCE_ID).equals(
             Long.valueOf(1).toString()).toPredicate();
 
     MpackEntity entity = new MpackEntity();
-    entity.setMpackId((long) 1);
+    entity.setId((long) 1);
     entity.setMpackUri("abcd.tar.gz");
     entity.setMpackName("TestMpack1");
     entity.setMpackVersion("3.0");
@@ -168,7 +168,7 @@ public class MpackResourceProviderTest {
     packletArrayList.add(module);
 
     Resource resourceExpected1 = new ResourceImpl(Resource.Type.Mpack);
-    resourceExpected1.setProperty(MpackResourceProvider.MPACK_ID, (long)1);
+    resourceExpected1.setProperty(MpackResourceProvider.MPACK_RESOURCE_ID, 
(long)1);
     resourceExpected1.setProperty(MpackResourceProvider.MPACK_NAME, 
"TestMpack1");
     resourceExpected1.setProperty(MpackResourceProvider.MPACK_VERSION, "3.0");
     resourceExpected1.setProperty(MpackResourceProvider.MPACK_URI, 
"abcd.tar.gz");
@@ -233,7 +233,7 @@ public class MpackResourceProviderTest {
 
     Assert.assertEquals(1,associatedResources.size());
     for(Resource r : associatedResources){
-      
Assert.assertEquals((long)100,r.getPropertyValue(MpackResourceProvider.MPACK_ID));
+      
Assert.assertEquals((long)100,r.getPropertyValue(MpackResourceProvider.MPACK_RESOURCE_ID));
       
Assert.assertEquals("testMpack",r.getPropertyValue(MpackResourceProvider.MPACK_NAME));
       
Assert.assertEquals("3.0",r.getPropertyValue(MpackResourceProvider.MPACK_VERSION));
       
Assert.assertEquals("../../../../../../../resources/mpacks-v2/abc.tar.gz",r.getPropertyValue(MpackResourceProvider.MPACK_URI));
@@ -250,7 +250,7 @@ public class MpackResourceProviderTest {
 
   public Mpack setupMpack() {
     Mpack mpack = new Mpack();
-    mpack.setMpackId((long)100);
+    mpack.setResourceId((long)100);
     mpack.setModules(new ArrayList<Module>());
     mpack.setPrerequisites(new HashMap<String, String>());
     mpack.setRegistryId(new Long(100));
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/MpackDAOTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/MpackDAOTest.java
index 64dae36..cc36b48 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/MpackDAOTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/MpackDAOTest.java
@@ -56,7 +56,7 @@ public class MpackDAOTest {
     // create 2 definitions
     for (int i = 1; i < 3; i++) {
       MpackEntity definition = new MpackEntity();
-      definition.setMpackId(new Long(100)+i);
+      definition.setId(new Long(100)+i);
       definition.setMpackName("testMpack" + i);
       definition.setRegistryId(Long.valueOf(i));
       definition.setMpackVersion("3.0.0.0-12"+i);
@@ -70,7 +70,7 @@ public class MpackDAOTest {
     assertEquals(2, definitions.size());
     definitions = m_dao.findByNameVersion("testMpack1","3.0.0.0-121");
     assertEquals(1, definitions.size());
-    assertEquals(new Long(101),(Long)definitions.get(0).getMpackId());
+    assertEquals(new Long(101),(Long)definitions.get(0).getId());
     MpackEntity entity = m_dao.findById(new Long(102));
     assertEquals(entity.getMpackName(),"testMpack2");
     assertEquals(entity.getMpackVersion(),"3.0.0.0-122");
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/MpackEntityTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/MpackEntityTest.java
index 87ac934..d2d2476 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/MpackEntityTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/MpackEntityTest.java
@@ -38,12 +38,12 @@ public class MpackEntityTest {
     Assert.assertEquals(entity1.hashCode(), entity2.hashCode());
     Assert.assertTrue(Objects.equals(entity1, entity2));
 
-    entity1.setMpackId(new Long(1));
-    entity2.setMpackId(new Long(2));
+    entity1.setId(new Long(1));
+    entity2.setId(new Long(2));
     Assert.assertNotSame(entity1.hashCode(), entity2.hashCode());
     Assert.assertFalse(Objects.equals(entity1, entity2));
 
-    entity2.setMpackId(new Long(1));
+    entity2.setId(new Long(1));
     Assert.assertEquals(entity1.hashCode(), entity2.hashCode());
     Assert.assertTrue(Objects.equals(entity1, entity2));
 
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/state/MpackTest.java 
b/ambari-server/src/test/java/org/apache/ambari/server/state/MpackTest.java
index 9184ca5..8523508 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/MpackTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/MpackTest.java
@@ -30,14 +30,14 @@ public class MpackTest {
   public void testMpacks() {
     Mpack mpack = new Mpack();
     mpack.setName("name");
-    mpack.setMpackId((long)100);
+    mpack.setResourceId((long)100);
     mpack.setDescription("desc");
     mpack.setVersion("3.0");
     mpack.setMpackUri("abc.tar.gz");
     mpack.setRegistryId(new Long(100));
 
     Assert.assertEquals("name", mpack.getName());
-    Assert.assertEquals(new Long(100), mpack.getMpackId());
+    Assert.assertEquals(new Long(100), mpack.getResourceId());
     Assert.assertEquals("desc", mpack.getDescription());
     Assert.assertEquals("abc.tar.gz", mpack.getMpackUri());
     Assert.assertEquals(new Long(100), mpack.getRegistryId());
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/utils/TestVersionUtils.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/utils/TestVersionUtils.java
index 08c0a06..ebb7278 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/utils/TestVersionUtils.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/utils/TestVersionUtils.java
@@ -277,17 +277,41 @@ public class TestVersionUtils {
     Assert.assertEquals(-1, 
MpackVersion.parse("1.2.3-h0-b10").compareTo(MpackVersion.parse("2.2.3-b10")));
     Assert.assertEquals(-1, 
MpackVersion.parse("1.2.3-h0-b10").compareTo(MpackVersion.parse("1.2.3-h1-b10")));
     Assert.assertEquals(-1, 
MpackVersion.parse("1.2.3-h0-b10").compareTo(MpackVersion.parse("1.2.3-h0-b11")));
+
+    Assert.assertEquals(0, MpackVersion.parse("1", 
false).compareTo(MpackVersion.parse("1.0.0-h0-b0")));
+    Assert.assertEquals(0, MpackVersion.parse("1.0", 
false).compareTo(MpackVersion.parse("1.0.0-h0-b0")));
+    Assert.assertEquals(0, MpackVersion.parse("1.0.0", 
false).compareTo(MpackVersion.parse("1.0.0-h0-b0")));
+    Assert.assertEquals(0, MpackVersion.parse("1.0.0-b0", 
false).compareTo(MpackVersion.parse("1.0.0-h0-b0")));
+    Assert.assertEquals(0, MpackVersion.parse("1.0.0-h0-b0", 
false).compareTo(MpackVersion.parse("1.0.0-h0-b0")));
+
+    Assert.assertEquals(-1, MpackVersion.parse("1", 
false).compareTo(MpackVersion.parse("1.0.0-h0-b111")));
+    Assert.assertEquals(-1, MpackVersion.parse("1.0", 
false).compareTo(MpackVersion.parse("1.0.0-h0-b111")));
+    Assert.assertEquals(-1, MpackVersion.parse("1.0.0", 
false).compareTo(MpackVersion.parse("1.0.0-h0-b111")));
+    Assert.assertEquals(-1, MpackVersion.parse("1.0.0-b0", 
false).compareTo(MpackVersion.parse("1.0.0-h0-b111")));
+    Assert.assertEquals(-1, MpackVersion.parse("1.0.0-h0-b0", 
false).compareTo(MpackVersion.parse("1.0.0-h0-b111")));
+
+    Assert.assertEquals(1, MpackVersion.parse("2", 
false).compareTo(MpackVersion.parse("1.0.0-h0-b111")));
+    Assert.assertEquals(1, MpackVersion.parse("1.1", 
false).compareTo(MpackVersion.parse("1.0.0-h0-b111")));
+    Assert.assertEquals(1, MpackVersion.parse("1.0.1", 
false).compareTo(MpackVersion.parse("1.0.0-h0-b111")));
   }
 
   @Test
   public void testStackVersionWithValidVersions() {
     Assert.assertEquals(1, 
MpackVersion.parse("1.2.3-h10-b10").compareTo(MpackVersion.parseStackVersion("1.2.3.4-888")));
-    Assert.assertEquals(1, 
MpackVersion.parseStackVersion("1.2.3-h10-b10").compareTo(MpackVersion.parseStackVersion("1.2.3.4-888")));
+    Assert.assertEquals(1, 
MpackVersion.parse("1.2.4-h1-b1").compareTo(MpackVersion.parseStackVersion("1.2.3.4-888")));
+    Assert.assertEquals(1, 
MpackVersion.parse("1.3.3-h1-b1").compareTo(MpackVersion.parseStackVersion("1.2.3.4-888")));
+    Assert.assertEquals(1, 
MpackVersion.parse("2.2.3-h1-b1").compareTo(MpackVersion.parseStackVersion("1.2.3.4-888")));
+
+    Assert.assertEquals(0, 
MpackVersion.parse("1.2.3-h4-b888").compareTo(MpackVersion.parseStackVersion("1.2.3.4-888")));
+
     Assert.assertEquals(-1, 
MpackVersion.parse("1.2.3-h10-b10").compareTo(MpackVersion.parseStackVersion("1.2.3.11-888")));
+    Assert.assertEquals(-1, 
MpackVersion.parse("1.2.3-h10-b10").compareTo(MpackVersion.parseStackVersion("1.2.4.1-1")));
+    Assert.assertEquals(-1, 
MpackVersion.parse("1.2.3-h10-b10").compareTo(MpackVersion.parseStackVersion("1.3.3.1-1")));
+    Assert.assertEquals(-1, 
MpackVersion.parse("1.2.3-h10-b10").compareTo(MpackVersion.parseStackVersion("2.2.3.1-1")));
+
     Assert.assertEquals(1, 
MpackVersion.parseStackVersion("1.2.3.4-999").compareTo(MpackVersion.parseStackVersion("1.2.3.4-888")));
-    Assert.assertEquals(0, 
MpackVersion.parseStackVersion("1.2.3-h10-b10").compareTo(MpackVersion.parseStackVersion("1.2.3-h10-b10")));
-    Assert.assertEquals(0, 
MpackVersion.parseStackVersion("1.2.3-h10-b10").compareTo(MpackVersion.parseStackVersion("1.2.3.10-10")));
-    Assert.assertEquals(-1, 
MpackVersion.parse("1.2.3-h10-b10").compareTo(MpackVersion.parseStackVersion("2.2.3.4-888")));
+    Assert.assertEquals(0, 
MpackVersion.parseStackVersion("1.2.3.4-999").compareTo(MpackVersion.parseStackVersion("1.2.3.4-999")));
+    Assert.assertEquals(-1, 
MpackVersion.parseStackVersion("1.2.3.1-999").compareTo(MpackVersion.parseStackVersion("1.2.3.4-888")));
   }
 
   @Test

-- 
To stop receiving notification emails like this one, please contact
jlun...@apache.org.

Reply via email to