Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxMediaManagerDlg.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxMediaManagerDlg.cpp	(revision 23879)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxMediaManagerDlg.cpp	(revision 23880)
@@ -1265,8 +1265,8 @@
                 if (attachment.GetMedium().GetId() == aMedium.id())
                 {
-                    machine.DetachDevice (attachment.GetController(), attachment.GetPort(), attachment.GetDevice());
+                    CStorageController controller = attachment.GetController();
+                    machine.DetachDevice (controller.GetName(), attachment.GetPort(), attachment.GetDevice());
                     if (!machine.isOk())
                     {
-                        CStorageController controller = machine.GetStorageControllerByName (attachment.GetController());
                         vboxProblem().cannotDetachDevice (this, machine, VBoxDefs::MediumType_HardDisk, aMedium.location(),
                                                           controller.GetBus(), attachment.GetPort(), attachment.GetDevice());
@@ -1288,8 +1288,7 @@
                 if (medium.id() == aMedium.id())
                 {
-                    machine.MountMedium (attachment.GetController(), attachment.GetPort(), attachment.GetDevice(), QString());
+                    machine.MountMedium (attachment.GetController().GetName(), attachment.GetPort(), attachment.GetDevice(), QString());
                     if (!machine.isOk())
                     {
-                        CStorageController controller = machine.GetStorageControllerByName (attachment.GetController());
                         vboxProblem().cannotUnmountMedium (this, machine, aMedium);
                         success = false;
@@ -1310,8 +1309,7 @@
                 if (medium.id() == aMedium.id())
                 {
-                    machine.MountMedium (attachment.GetController(), attachment.GetPort(), attachment.GetDevice(), QString());
+                    machine.MountMedium (attachment.GetController().GetName(), attachment.GetPort(), attachment.GetDevice(), QString());
                     if (!machine.isOk())
                     {
-                        CStorageController controller = machine.GetStorageControllerByName (attachment.GetController());
                         vboxProblem().cannotUnmountMedium (this, machine, aMedium);
                         success = false;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxSelectorWnd.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxSelectorWnd.cpp	(revision 23879)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxSelectorWnd.cpp	(revision 23880)
@@ -911,13 +911,11 @@
             {
                 CMediumAttachment hda = vec [i];
-                const QString ctlName = hda.GetController();
-
-                machine.DetachDevice(ctlName, hda.GetPort(), hda.GetDevice());
+                CStorageController controller = hda.GetController();
+                machine.DetachDevice(controller.GetName(), hda.GetPort(), hda.GetDevice());
                 if (!machine.isOk())
                 {
-                    CStorageController ctl = machine.GetStorageControllerByName(ctlName);
                     vboxProblem().cannotDetachDevice (this, machine, VBoxDefs::MediumType_HardDisk,
                         vboxGlobal().getMedium (CMedium (hda.GetMedium())).location(),
-                        ctl.GetBus(), hda.GetPort(), hda.GetDevice());
+                        controller.GetBus(), hda.GetPort(), hda.GetDevice());
                 }
             }
Index: /trunk/src/VBox/Main/ApplianceImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/ApplianceImpl.cpp	(revision 23879)
+++ /trunk/src/VBox/Main/ApplianceImpl.cpp	(revision 23880)
@@ -4446,10 +4446,6 @@
             ComPtr<IMedium> pMedium;
             ComPtr<IStorageController> ctl;
-            Bstr controllerName;
-
-            rc = pHDA->COMGETTER(Controller)(controllerName.asOutParam());
-            if (FAILED(rc)) throw rc;
-
-            rc = GetStorageControllerByName(controllerName, ctl.asOutParam());
+
+            rc = pHDA->COMGETTER(Controller)(ctl.asOutParam());
             if (FAILED(rc)) throw rc;
 
Index: /trunk/src/VBox/Main/ConsoleImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/ConsoleImpl.cpp	(revision 23879)
+++ /trunk/src/VBox/Main/ConsoleImpl.cpp	(revision 23880)
@@ -2705,24 +2705,7 @@
     rc = mMachine->COMGETTER(StorageControllers)(ComSafeArrayAsOutParam(ctrls));
     AssertComRC(rc);
-    Bstr attCtrlName;
-    rc = aMediumAttachment->COMGETTER(Controller)(attCtrlName.asOutParam());
+    ComPtr<IStorageController> ctrl;
+    rc = aMediumAttachment->COMGETTER(Controller)(ctrl.asOutParam());
     AssertComRC(rc);
-    ComPtr<IStorageController> ctrl;
-    for (size_t i = 0; i < ctrls.size(); ++i)
-    {
-        Bstr ctrlName;
-        rc = ctrls[i]->COMGETTER(Name)(ctrlName.asOutParam());
-        AssertComRC(rc);
-        if (attCtrlName == ctrlName)
-        {
-            ctrl = ctrls[i];
-            break;
-        }
-    }
-    if (ctrl.isNull())
-    {
-        return setError(E_FAIL,
-                        tr("Could not find storage controller '%ls'"), attCtrlName.raw());
-    }
     StorageControllerType_T enmCtrlType;
     rc = ctrl->COMGETTER(ControllerType)(&enmCtrlType);
@@ -7226,5 +7209,4 @@
             {
                 ComPtr<IStorageController> controller;
-                BSTR controllerName;
                 ULONG lInstance;
                 StorageControllerType_T enmController;
@@ -7235,13 +7217,10 @@
                 * so we have to query needed values here and pass them.
                 */
-                rc = atts[i]->COMGETTER(Controller)(&controllerName);
-                if (FAILED(rc))
-                    break;
-
-                rc = that->mMachine->GetStorageControllerByName(controllerName, controller.asOutParam());
+                rc = atts[i]->COMGETTER(Controller)(controller.asOutParam());
                 if (FAILED(rc)) throw rc;
-
                 rc = controller->COMGETTER(ControllerType)(&enmController);
+                if (FAILED (rc)) throw rc;
                 rc = controller->COMGETTER(Instance)(&lInstance);
+                if (FAILED (rc)) throw rc;
 
                 /*
Index: /trunk/src/VBox/Main/MachineImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/MachineImpl.cpp	(revision 23879)
+++ /trunk/src/VBox/Main/MachineImpl.cpp	(revision 23880)
@@ -2358,8 +2358,5 @@
                          * descendant of medium will be used
                          */
-                        if (    (*it)->device() == aDevice
-                             && (*it)->port() == aControllerPort
-                             && (*it)->controller() == aControllerName
-                           )
+                        if (pAttach->matches(aControllerName, aControllerPort, aDevice))
                         {
                             foundIt = it;
@@ -2436,5 +2433,5 @@
     ComObjPtr<MediumAttachment> attachment;
     attachment.createObject();
-    rc = attachment->init(this, medium, aControllerName, aControllerPort, aDevice, aType, indirect);
+    rc = attachment->init(this, medium, ctl, aControllerPort, aDevice, aType, indirect);
     CheckComRCReturnRC(rc);
 
@@ -3561,5 +3558,5 @@
          ++it)
     {
-        if ((*it)->controller() == aName)
+        if (Bstr((*it)->controller()->name()) == aName)
             return setError(VBOX_E_OBJECT_IN_USE,
                             tr("Storage controller named '%ls' has still devices attached"),
@@ -5607,10 +5604,9 @@
             break;
 
-        const Bstr controllerName = aStorageController->name();
         ComObjPtr<MediumAttachment> pAttachment;
         pAttachment.createObject();
         rc = pAttachment->init(this,
                                medium,
-                               controllerName,
+                               aStorageController,
                                dev.lPort,
                                dev.lDevice,
@@ -5755,5 +5751,5 @@
          ++it)
     {
-        if ((*it)->controller() == aName)
+        if (Bstr((*it)->controller()->name()) == aName)
             atts.push_back(*it);
     }
Index: /trunk/src/VBox/Main/MediumAttachmentImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/MediumAttachmentImpl.cpp	(revision 23879)
+++ /trunk/src/VBox/Main/MediumAttachmentImpl.cpp	(revision 23880)
@@ -58,5 +58,5 @@
 HRESULT MediumAttachment::init(Machine *aParent,
                                Medium *aMedium,
-                               CBSTR aController,
+                               StorageController *aController,
                                LONG aPort,
                                LONG aDevice,
@@ -180,5 +180,5 @@
 }
 
-STDMETHODIMP MediumAttachment::COMGETTER(Controller)(BSTR *aController)
+STDMETHODIMP MediumAttachment::COMGETTER(Controller)(IStorageController **aController)
 {
     LogFlowThisFuncEnter();
@@ -190,5 +190,5 @@
 
     /* m->controller is constant during life time, no need to lock */
-    m->controller.cloneTo(aController);
+    m->controller.queryInterfaceTo(aController);
 
     LogFlowThisFuncLeave();
Index: /trunk/src/VBox/Main/idl/VirtualBox.xidl
===================================================================
--- /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 23879)
+++ /trunk/src/VBox/Main/idl/VirtualBox.xidl	(revision 23880)
@@ -8363,5 +8363,5 @@
   <interface
     name="IMediumAttachment" extends="$unknown"
-    uuid="0dcf987b-a024-453f-bace-7eb9f885a413"
+    uuid="ff554585-560a-489d-963c-cf6da6a826de"
     wsmap="struct"
   >
@@ -8384,8 +8384,6 @@
     </attribute>
 
-    <attribute name="controller" type="wstring" readonly="yes">
-      <desc>Name of the storage controller of this attachment; this
-        refers to one of the controllers in <link to="IMachine::storageControllers" />
-        by name.</desc>
+    <attribute name="controller" type="IStorageController" readonly="yes">
+      <desc>Storage controller object to which this attachment belongs.</desc>
     </attribute>
 
Index: /trunk/src/VBox/Main/include/MediumAttachmentImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/MediumAttachmentImpl.h	(revision 23879)
+++ /trunk/src/VBox/Main/include/MediumAttachmentImpl.h	(revision 23880)
@@ -26,4 +26,5 @@
 
 #include "MediumImpl.h"
+#include "StorageControllerImpl.h"
 
 class Machine;
@@ -53,5 +54,5 @@
     HRESULT init(Machine *aParent,
                  Medium *aMedium,
-                 CBSTR aController,
+                 StorageController *aController,
                  LONG aPort,
                  LONG aDevice,
@@ -68,5 +69,5 @@
     // IMediumAttachment properties
     STDMETHOD(COMGETTER(Medium))(IMedium **aMedium);
-    STDMETHOD(COMGETTER(Controller))(BSTR *aController);
+    STDMETHOD(COMGETTER(Controller))(IStorageController **aController);
     STDMETHOD(COMGETTER(Port))(LONG *aPort);
     STDMETHOD(COMGETTER(Device))(LONG *aDevice);
@@ -82,5 +83,5 @@
 
     const ComObjPtr<Medium> &medium() const { return m->medium; }
-    Bstr controller() const { return m->controller; }
+    const ComObjPtr<StorageController> &controller() const { return m->controller; }
     LONG port() const { return m->port; }
     LONG device() const { return m->device; }
@@ -90,5 +91,5 @@
     bool matches(CBSTR aController, LONG aPort, LONG aDevice)
     {
-        return (    aController == m->controller
+        return (    aController == m->controller->name()
                  && aPort == m->port
                  && aDevice == m->device);
@@ -124,5 +125,5 @@
 
         ComObjPtr<Medium> medium;
-        const Bstr controller;
+        ComObjPtr<StorageController> controller;
         const LONG port;
         const LONG device;
