diff --git a/lustre/cmm/cmm_object.c b/lustre/cmm/cmm_object.c
index dac4ed30db8f332d5f7709ca8d91668ada391a46..13176b31583c37d1ac9b4ed10abf5981b8d2061c 100644
--- a/lustre/cmm/cmm_object.c
+++ b/lustre/cmm/cmm_object.c
@@ -344,6 +344,14 @@ static int cml_capa_get(const struct lu_env *env, struct md_object *mo,
         RETURN(rc);
 }
 
+static int cml_object_sync(const struct lu_env *env, struct md_object *mo)
+{
+        int rc;
+        ENTRY;
+        rc = mo_object_sync(env, md_object_next(mo));
+        RETURN(rc);
+}
+
 static struct md_object_operations cml_mo_ops = {
         .moo_permission    = cml_permission,
         .moo_attr_get      = cml_attr_get,
@@ -359,7 +367,8 @@ static struct md_object_operations cml_mo_ops = {
         .moo_close         = cml_close,
         .moo_readpage      = cml_readpage,
         .moo_readlink      = cml_readlink,
-        .moo_capa_get      = cml_capa_get
+        .moo_capa_get      = cml_capa_get,
+        .moo_object_sync   = cml_object_sync,
 };
 
 /* md_dir operations */
@@ -939,6 +948,11 @@ static int cmr_capa_get(const struct lu_env *env, struct md_object *mo,
         return -EFAULT;
 }
 
+static int cmr_object_sync(const struct lu_env *env, struct md_object *mo)
+{
+        return -EFAULT;
+}
+
 static struct md_object_operations cmr_mo_ops = {
         .moo_permission    = cmr_permission,
         .moo_attr_get      = cmr_attr_get,
@@ -954,7 +968,8 @@ static struct md_object_operations cmr_mo_ops = {
         .moo_close         = cmr_close,
         .moo_readpage      = cmr_readpage,
         .moo_readlink      = cmr_readlink,
-        .moo_capa_get      = cmr_capa_get
+        .moo_capa_get      = cmr_capa_get,
+        .moo_object_sync   = cmr_object_sync,
 };
 
 /* remote part of md_dir operations */
diff --git a/lustre/include/dt_object.h b/lustre/include/dt_object.h
index 7416e4821417cae08b593f5ed3c86b4cebfc5563..6ac622df84948d30618fa381da5f03726fda6f00 100644
--- a/lustre/include/dt_object.h
+++ b/lustre/include/dt_object.h
@@ -308,6 +308,7 @@ struct dt_object_operations {
                                         struct dt_object *dt,
                                         struct lustre_capa *old,
                                         __u64 opc);
+        int (*do_object_sync)(const struct lu_env *, struct dt_object *);
 };
 
 /*
diff --git a/lustre/include/md_object.h b/lustre/include/md_object.h
index 1f383a65ef6e0e07d4960b11280616a633e7a66b..b543013b00a56ce3c48a1b7cf75880f823849fdd 100644
--- a/lustre/include/md_object.h
+++ b/lustre/include/md_object.h
@@ -235,6 +235,7 @@ struct md_object_operations {
         
         int (*moo_capa_get)(const struct lu_env *, struct md_object *,
                             struct lustre_capa *, int renewal);
+        int (*moo_object_sync)(const struct lu_env *, struct md_object *);
 };
 
 /*
@@ -550,6 +551,12 @@ static inline int mo_capa_get(const struct lu_env *env,
         return m->mo_ops->moo_capa_get(env, m, c, renewal);
 }
 
+static inline int mo_object_sync(const struct lu_env *env, struct md_object *m)
+{
+        LASSERT(m->mo_ops->moo_object_sync);
+        return m->mo_ops->moo_object_sync(env, m);
+}
+
 static inline int mdo_lookup(const struct lu_env *env,
                              struct md_object *p,
                              const struct lu_name *lname,
diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c
index 1bea083a7fc28a958844b3387dd663368a658d1f..74b628b21fd0b1503db0d18f8a17a9d034d1a9a0 100644
--- a/lustre/mdd/mdd_object.c
+++ b/lustre/mdd/mdd_object.c
@@ -1602,6 +1602,16 @@ out_unlock:
         return rc;
 }
 
+static int mdd_object_sync(const struct lu_env *env, struct md_object *obj)
+{
+        struct mdd_object *mdd_obj = md2mdd_obj(obj);
+        struct dt_object *next;
+
+        LASSERT(mdd_object_exists(mdd_obj));
+        next = mdd_object_child(mdd_obj);
+        return next->do_ops->do_object_sync(env, next);
+}
+
 struct md_object_operations mdd_obj_ops = {
         .moo_permission    = mdd_permission,
         .moo_attr_get      = mdd_attr_get,
@@ -1617,5 +1627,6 @@ struct md_object_operations mdd_obj_ops = {
         .moo_close         = mdd_close,
         .moo_readpage      = mdd_readpage,
         .moo_readlink      = mdd_readlink,
-        .moo_capa_get      = mdd_capa_get
+        .moo_capa_get      = mdd_capa_get,
+        .moo_object_sync   = mdd_object_sync,
 };
diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c
index 271a0735f9e7865382b85839de13295ac6ea7038..d746f0ef976034b0ff5c490760316d8fbf5057ec 100644
--- a/lustre/mdt/mdt_handler.c
+++ b/lustre/mdt/mdt_handler.c
@@ -1545,18 +1545,33 @@ static int mdt_reint(struct mdt_thread_info *info)
         RETURN(rc);
 }
 
-/* TODO these two methods not available now. */
-
 /* this should sync the whole device */
-static int mdt_device_sync(struct mdt_thread_info *info)
+static int mdt_device_sync(const struct lu_env *env, struct mdt_device *mdt)
 {
-        return 0;
+        struct dt_device *dt = mdt->mdt_bottom;
+        int rc;
+        ENTRY;
+
+        rc = dt->dd_ops->dt_sync(env, dt);
+        RETURN(rc);
 }
 
 /* this should sync this object */
 static int mdt_object_sync(struct mdt_thread_info *info)
 {
-        return 0;
+        struct md_object *next;
+        int rc;
+        ENTRY;
+
+        if (!mdt_object_exists(info->mti_object)) {
+                CWARN("Non existing object  "DFID"!\n",
+                      PFID(mdt_object_fid(info->mti_object)));
+                RETURN(-ESTALE);
+        }
+        next = mdt_object_child(info->mti_object);
+        rc = mo_object_sync(info->mti_env, next);
+
+        RETURN(rc);
 }
 
 static int mdt_sync(struct mdt_thread_info *info)
@@ -1580,7 +1595,7 @@ static int mdt_sync(struct mdt_thread_info *info)
                 /* sync the whole device */
                 rc = req_capsule_server_pack(pill);
                 if (rc == 0)
-                        rc = mdt_device_sync(info);
+                        rc = mdt_device_sync(info->mti_env, info->mti_mdt);
                 else
                         rc = err_serious(rc);
         } else {
@@ -4646,7 +4661,7 @@ static int mdt_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
 
         switch (cmd) {
         case OBD_IOC_SYNC:
-                rc = dt->dd_ops->dt_sync(&env, dt);
+                rc = mdt_device_sync(&env, mdt);
                 break;
         case OBD_IOC_SET_READONLY:
                 rc = dt->dd_ops->dt_sync(&env, dt);
diff --git a/lustre/osd/osd_handler.c b/lustre/osd/osd_handler.c
index 4422aeae57d2edd7e662b166f065d7f8122d50b5..dc9679048302b9e7e62076f947dbf65f339e7d32 100644
--- a/lustre/osd/osd_handler.c
+++ b/lustre/osd/osd_handler.c
@@ -1521,6 +1521,26 @@ static struct obd_capa *osd_capa_get(const struct lu_env *env,
         RETURN(oc);
 }
 
+static int osd_object_sync(const struct lu_env *env, struct dt_object *dt)
+{
+        int rc;
+        struct osd_object      *obj    = osd_dt_obj(dt);
+        struct inode           *inode  = obj->oo_inode;
+        struct osd_thread_info *info   = osd_oti_get(env);
+        struct dentry          *dentry = &info->oti_dentry;
+        struct file            *file   = &info->oti_file;
+        ENTRY;
+
+        dentry->d_inode = inode;
+        file->f_dentry = dentry;
+        file->f_mapping = inode->i_mapping;
+        file->f_op = inode->i_fop;
+        mutex_lock(&inode->i_mutex);
+        rc = file->f_op->fsync(file, dentry, 0);
+        mutex_unlock(&inode->i_mutex);
+        RETURN(rc);
+}
+
 static struct dt_object_operations osd_obj_ops = {
         .do_read_lock    = osd_object_read_lock,
         .do_write_lock   = osd_object_write_lock,
@@ -1538,6 +1558,7 @@ static struct dt_object_operations osd_obj_ops = {
         .do_xattr_del    = osd_xattr_del,
         .do_xattr_list   = osd_xattr_list,
         .do_capa_get     = osd_capa_get,
+        .do_object_sync  = osd_object_sync,
 };
 
 /*
diff --git a/lustre/osd/osd_internal.h b/lustre/osd/osd_internal.h
index 359c19f8ad6fb9edc569f7bab4f88e563c9d2a1a..f325119f45bc1c2ba522b338cda96bf83988f607 100644
--- a/lustre/osd/osd_internal.h
+++ b/lustre/osd/osd_internal.h
@@ -127,6 +127,10 @@ struct osd_thread_info {
          */
         struct dentry          oti_dentry;
         struct timespec        oti_time;
+        /*
+         * XXX temporary: fake struct file for osd_object_sync
+         */
+        struct file            oti_file;
         /*
          * XXX temporary: for capa operations.
          */