diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp
index 048d1dc..0b99cb1 100644
--- a/media/mtp/MtpServer.cpp
+++ b/media/mtp/MtpServer.cpp
@@ -14,8 +14,6 @@
  * limitations under the License.
  */
 
-#define LOG_TAG "MtpServer"
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/types.h>
@@ -27,11 +25,11 @@
 #include <cutils/properties.h>
 
 #include "MtpDebug.h"
+#include "MtpDatabase.h"
+#include "MtpProperty.h"
 #include "MtpServer.h"
 #include "MtpStorage.h"
 #include "MtpStringBuffer.h"
-#include "MtpDatabase.h"
-#include "MtpDebug.h"
 
 #include "f_mtp.h"
 
@@ -126,6 +124,8 @@
 {
     mDatabase = new MtpDatabase();
     mDatabase->open(databasePath, true);
+
+    initObjectProperties();
 }
 
 MtpServer::~MtpServer() {
@@ -157,7 +157,7 @@
 void MtpServer::run() {
     int fd = mFD;
 
-    LOGD("MtpServer::run fd: %d", fd);
+    LOGV("MtpServer::run fd: %d\n", fd);
 
     while (1) {
         int ret = mRequest.read(fd);
@@ -222,11 +222,37 @@
                 break;
             }
         } else {
-            LOGV("skipping response");
+            LOGV("skipping response\n");
         }
     }
 }
 
+MtpProperty* MtpServer::getObjectProperty(MtpPropertyCode propCode) {
+    for (int i = 0; i < mObjectProperties.size(); i++) {
+        MtpProperty* property = mObjectProperties[i];
+        if (property->getPropertyCode() == propCode)
+            return property;
+    }
+    return NULL;
+}
+
+MtpProperty* MtpServer::getDeviceProperty(MtpPropertyCode propCode) {
+    for (int i = 0; i < mDeviceProperties.size(); i++) {
+        MtpProperty* property = mDeviceProperties[i];
+        if (property->getPropertyCode() == propCode)
+            return property;
+    }
+    return NULL;
+}
+
+void MtpServer::initObjectProperties() {
+    mObjectProperties.push(new MtpProperty(MTP_PROPERTY_STORAGE_ID, MTP_TYPE_UINT16));
+    mObjectProperties.push(new MtpProperty(MTP_PROPERTY_OBJECT_FORMAT, MTP_TYPE_UINT16));
+    mObjectProperties.push(new MtpProperty(MTP_PROPERTY_OBJECT_SIZE, MTP_TYPE_UINT64));
+    mObjectProperties.push(new MtpProperty(MTP_PROPERTY_OBJECT_FILE_NAME, MTP_TYPE_STR));
+    mObjectProperties.push(new MtpProperty(MTP_PROPERTY_PARENT_OBJECT, MTP_TYPE_UINT32));
+}
+
 bool MtpServer::handleRequest() {
     MtpOperationCode operation = mRequest.getOperationCode();
     MtpResponseCode response;
@@ -280,6 +306,8 @@
             response = doDeleteObject();
             break;
         case MTP_OPERATION_GET_OBJECT_PROP_DESC:
+            response = doGetObjectPropDesc();
+            break;
         default:
             response = MTP_RESPONSE_OPERATION_NOT_SUPPORTED;
             break;
@@ -489,9 +517,6 @@
     time_t modifiedTime;
     if (!parseDateTime(modified, modifiedTime))
         modifiedTime = 0;
-    LOGV("SendObjectInfo format: %04X size: %d name: %s, created: %s, modified: %s",
-            format, mSendObjectFileSize, (const char*)name, (const char*)created,
-            (const char*)modified);
 
     if (path[path.size() - 1] != '/')
         path += "/";
@@ -589,10 +614,14 @@
 }
 
 MtpResponseCode MtpServer::doGetObjectPropDesc() {
-    MtpObjectProperty property = mRequest.getParameter(1);
+    MtpObjectProperty propCode = mRequest.getParameter(1);
     MtpObjectFormat format = mRequest.getParameter(2);
+    MtpProperty* property = getObjectProperty(propCode);
+    if (!property)
+        return MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED;
 
-    return -1;
+    property->write(mData);
+    return MTP_RESPONSE_OK;
 }
 
 }  // namespace android
