Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 39660)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 39661)
@@ -15987,5 +15987,5 @@
   <interface
     name="IExtPackBase" extends="$unknown"
-    uuid="5ffb0b64-0ad6-467d-af62-1157e7dc3c99"
+    uuid="f79b75d8-2890-4f34-ffff-ffffa144e82c"
     wsmap="suppress"
     >
@@ -16002,12 +16002,21 @@
     <attribute name="version" type="wstring" readonly="yes">
       <desc>
-        The extension pack version string.  This is on the same form as
-        other VirtualBox version strings, i.e.: "1.2.3", "1.2.3_BETA1",
-        "1.2.3-OSE", "1.2.3r45678", "1.2.3r45678-OSE", "1.2.3_BETA1-r45678"
-        or "1.2.3_BETA1-r45678-OSE"
+        The extension pack version string.  This is restricted to the dotted
+	version number and a build indicator.  No tree revision or tag will be
+	included in the string as those things are available as separate
+	properties.  Examples: "1.2.3", "1.2.3_BETA1" and "1.2.3_RC2".
       </desc>
     </attribute>
     <attribute name="revision" type="unsigned long" readonly="yes">
       <desc>The extension pack internal revision number.</desc>
+    </attribute>
+    <attribute name="edition" type="wstring" readonly="yes">
+      <desc>
+	Edition indicator.  This is usually empty.
+
+	Can for instance be used to help distinguishing between two editions
+	of the same extension pack where only the license, service contract or
+	something differs.
+      </desc>
     </attribute>
     <attribute name="VRDEModule" type="wstring" readonly="yes">
Index: /trunk/src/VBox/Main/include/ExtPackManagerImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/ExtPackManagerImpl.h	(revision 39660)
+++ /trunk/src/VBox/Main/include/ExtPackManagerImpl.h	(revision 39661)
@@ -55,4 +55,5 @@
     STDMETHOD(COMGETTER(Version))(BSTR *a_pbstrVersion);
     STDMETHOD(COMGETTER(Revision))(ULONG *a_puRevision);
+    STDMETHOD(COMGETTER(Edition))(BSTR *a_pbstrEdition);
     STDMETHOD(COMGETTER(VRDEModule))(BSTR *a_pbstrVrdeModule);
     STDMETHOD(COMGETTER(PlugIns))(ComSafeArrayOut(IExtPackPlugIn *, a_paPlugIns));
@@ -118,4 +119,5 @@
     STDMETHOD(COMGETTER(Version))(BSTR *a_pbstrVersion);
     STDMETHOD(COMGETTER(Revision))(ULONG *a_puRevision);
+    STDMETHOD(COMGETTER(Edition))(BSTR *a_pbstrEdition);
     STDMETHOD(COMGETTER(VRDEModule))(BSTR *a_pbstrVrdeModule);
     STDMETHOD(COMGETTER(PlugIns))(ComSafeArrayOut(IExtPackPlugIn *, a_paPlugIns));
Index: /trunk/src/VBox/Main/include/ExtPackUtil.h
===================================================================
--- /trunk/src/VBox/Main/include/ExtPackUtil.h	(revision 39660)
+++ /trunk/src/VBox/Main/include/ExtPackUtil.h	(revision 39661)
@@ -113,12 +113,12 @@
 
 void                VBoxExtPackInitDesc(PVBOXEXTPACKDESC a_pExtPackDesc);
-RTCString   *VBoxExtPackLoadDesc(const char *a_pszDir, PVBOXEXTPACKDESC a_pExtPackDesc, PRTFSOBJINFO a_pObjInfo);
-RTCString   *VBoxExtPackLoadDescFromVfsFile(RTVFSFILE hVfsFile, PVBOXEXTPACKDESC a_pExtPackDesc, PRTFSOBJINFO a_pObjInfo);
-RTCString   *VBoxExtPackExtractNameFromTarballPath(const char *pszTarball);
+RTCString          *VBoxExtPackLoadDesc(const char *a_pszDir, PVBOXEXTPACKDESC a_pExtPackDesc, PRTFSOBJINFO a_pObjInfo);
+RTCString          *VBoxExtPackLoadDescFromVfsFile(RTVFSFILE hVfsFile, PVBOXEXTPACKDESC a_pExtPackDesc, PRTFSOBJINFO a_pObjInfo);
+RTCString          *VBoxExtPackExtractNameFromTarballPath(const char *pszTarball);
 void                VBoxExtPackFreeDesc(PVBOXEXTPACKDESC a_pExtPackDesc);
 bool                VBoxExtPackIsValidName(const char *pszName);
 bool                VBoxExtPackIsValidMangledName(const char *pszMangledName, size_t cchMax = RTSTR_MAX);
-RTCString   *VBoxExtPackMangleName(const char *pszName);
-RTCString   *VBoxExtPackUnmangleName(const char *pszMangledName, size_t cbMax);
+RTCString          *VBoxExtPackMangleName(const char *pszName);
+RTCString          *VBoxExtPackUnmangleName(const char *pszMangledName, size_t cbMax);
 int                 VBoxExtPackCalcDir(char *pszExtPackDir, size_t cbExtPackDir, const char *pszParentDir, const char *pszName);
 bool                VBoxExtPackIsValidVersionString(const char *pszVersion);
Index: /trunk/src/VBox/Main/src-all/ExtPackManagerImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-all/ExtPackManagerImpl.cpp	(revision 39660)
+++ /trunk/src/VBox/Main/src-all/ExtPackManagerImpl.cpp	(revision 39661)
@@ -390,20 +390,20 @@
     if (SUCCEEDED(hrc))
     {
-        /* HACK ALERT: This is for easing backporting to 4.1. The edition stuff
-           will be changed into a separate */
-        if (m->Desc.strEdition.isEmpty())
-        {
-            Bstr str(m->Desc.strVersion);
-            str.cloneTo(a_pbstrVersion);
-        }
-        else
-        {
-            RTCString strHack(m->Desc.strVersion);
-            strHack.append('-');
-            strHack.append(m->Desc.strEdition);
-
-            Bstr str(strHack);
-            str.cloneTo(a_pbstrVersion);
-        }
+        Bstr str(m->Desc.strVersion);
+        str.cloneTo(a_pbstrVersion);
+    }
+    return hrc;
+}
+
+STDMETHODIMP ExtPackFile::COMGETTER(Edition)(BSTR *a_pbstrEdition)
+{
+    CheckComArgOutPointerValid(a_pbstrEdition);
+
+    AutoCaller autoCaller(this);
+    HRESULT hrc = autoCaller.rc();
+    if (SUCCEEDED(hrc))
+    {
+        Bstr str(m->Desc.strEdition);
+        str.cloneTo(a_pbstrEdition);
     }
     return hrc;
@@ -1624,20 +1624,6 @@
     if (SUCCEEDED(hrc))
     {
-        /* HACK ALERT: This is for easing backporting to 4.1. The edition stuff
-           will be changed into a separate */
-        if (m->Desc.strEdition.isEmpty())
-        {
-            Bstr str(m->Desc.strVersion);
-            str.cloneTo(a_pbstrVersion);
-        }
-        else
-        {
-            RTCString strHack(m->Desc.strVersion);
-            strHack.append('-');
-            strHack.append(m->Desc.strEdition);
-
-            Bstr str(strHack);
-            str.cloneTo(a_pbstrVersion);
-        }
+        Bstr str(m->Desc.strVersion);
+        str.cloneTo(a_pbstrVersion);
     }
     return hrc;
@@ -1652,4 +1638,18 @@
     if (SUCCEEDED(hrc))
         *a_puRevision = m->Desc.uRevision;
+    return hrc;
+}
+
+STDMETHODIMP ExtPack::COMGETTER(Edition)(BSTR *a_pbstrEdition)
+{
+    CheckComArgOutPointerValid(a_pbstrEdition);
+
+    AutoCaller autoCaller(this);
+    HRESULT hrc = autoCaller.rc();
+    if (SUCCEEDED(hrc))
+    {
+        Bstr str(m->Desc.strEdition);
+        str.cloneTo(a_pbstrEdition);
+    }
     return hrc;
 }
