diff --git a/lustre/include/lustre/lustre_idl.h b/lustre/include/lustre/lustre_idl.h
index f314110747c71120985ce52a45f3876004b60c74..193ce82dc4473b6f264a651f95cbb19089abcd45 100644
--- a/lustre/include/lustre/lustre_idl.h
+++ b/lustre/include/lustre/lustre_idl.h
@@ -722,6 +722,9 @@ extern void lustre_swab_obdo (struct obdo *o);
 #define LOV_PATTERN_FIRST 0x100   /* first stripe is not in round-robin */
 #define LOV_PATTERN_CMOBD 0x200
 
+#define LOV_OBJECT_GROUP_DEFAULT ~0ULL
+#define LOV_OBJECT_GROUP_CLEAR 0ULL
+
 #define lov_ost_data lov_ost_data_v1
 struct lov_ost_data_v1 {          /* per-stripe data structure (little-endian)*/
         __u64 l_object_id;        /* OST object ID */
diff --git a/lustre/include/md_object.h b/lustre/include/md_object.h
index 7fa59b25a12613c62049b53067da8272ab43d42c..42fbe90b9e58f7d1756e36a40ede0ff07e6a4a15 100644
--- a/lustre/include/md_object.h
+++ b/lustre/include/md_object.h
@@ -101,7 +101,8 @@ enum ma_valid {
         MA_COOKIE    = (1 << 2),
         MA_FLAGS     = (1 << 3),
         MA_LMV       = (1 << 4),
-        MA_ACL_DEF   = (1 << 5)
+        MA_ACL_DEF   = (1 << 5),
+        MA_LOV_DEF   = (1 << 6)
 };
 
 typedef enum {
diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c
index be1235849f296b8a596d71b27ea9ea068983dcb1..c10d4bc6f7baf01215ac4e3c717bc000fab6d46a 100644
--- a/lustre/mdd/mdd_object.c
+++ b/lustre/mdd/mdd_object.c
@@ -285,6 +285,29 @@ int mdd_iattr_get(const struct lu_env *env, struct mdd_object *mdd_obj,
         RETURN(rc);
 }
 
+static int mdd_get_default_md(struct mdd_object *mdd_obj,
+                struct lov_mds_md *lmm, int *size)
+{
+        struct lov_desc *ldesc;
+        struct mdd_device *mdd = mdo2mdd(&mdd_obj->mod_obj);
+        ENTRY;
+
+        ldesc = &mdd->mdd_obd_dev->u.mds.mds_lov_desc;
+        LASSERT(ldesc != NULL);
+
+        if (!lmm)
+                RETURN(0);
+
+        lmm->lmm_magic = LOV_MAGIC_V1;
+        lmm->lmm_object_gr = LOV_OBJECT_GROUP_DEFAULT;
+        lmm->lmm_pattern = ldesc->ld_pattern;
+        lmm->lmm_stripe_size = ldesc->ld_default_stripe_size;
+        lmm->lmm_stripe_count = ldesc->ld_default_stripe_count;
+        *size = sizeof(struct lov_mds_md);
+
+        RETURN(sizeof(struct lov_mds_md));
+}
+
 /* get lov EA only */
 static int __mdd_lmm_get(const struct lu_env *env,
                          struct mdd_object *mdd_obj, struct md_attr *ma)
@@ -297,6 +320,12 @@ static int __mdd_lmm_get(const struct lu_env *env,
 
         rc = mdd_get_md(env, mdd_obj, ma->ma_lmm, &ma->ma_lmm_size,
                         MDS_LOV_MD_NAME);
+
+        if (rc == 0 && (ma->ma_need & MA_LOV_DEF)) {
+                rc = mdd_get_default_md(mdd_obj, ma->ma_lmm,
+                                &ma->ma_lmm_size);
+        }
+
         if (rc > 0) {
                 ma->ma_valid |= MA_LOV;
                 rc = 0;
diff --git a/lustre/mdt/mdt_handler.c b/lustre/mdt/mdt_handler.c
index f4d0262df41e9a643be65717a4095199af82238b..206b5bde87fd199a8625e860d5918f5d923264e9 100644
--- a/lustre/mdt/mdt_handler.c
+++ b/lustre/mdt/mdt_handler.c
@@ -449,6 +449,12 @@ static int mdt_getattr_internal(struct mdt_thread_info *info,
                 ma->ma_need = MA_LOV | MA_INODE;
         }
 
+        if (S_ISDIR(lu_object_attr(&next->mo_lu)) &&
+            reqbody->valid & OBD_MD_FLDIREA  &&
+            lustre_msg_get_opc(req->rq_reqmsg) == MDS_GETATTR) {
+                /* get default stripe info for this dir. */
+                ma->ma_need |= MA_LOV_DEF;
+        }
         rc = mo_attr_get(env, next, ma);
         if (unlikely(rc)) {
                 CERROR("getattr error for "DFID": %d\n",
diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh
index 764e4133b7cd2f566ee659403686eb8d03a008ab..bae08630e029923020e293fc170ef6db3f75277a 100644
--- a/lustre/tests/sanity.sh
+++ b/lustre/tests/sanity.sh
@@ -2811,7 +2811,7 @@ test_65e() {
 	mkdir -p $DIR/d65
 
 	$SETSTRIPE $DIR/d65 || error "setstripe"
-        $GETSTRIPE -v $DIR/d65 | grep "has no stripe info" || error "no stripe info failed"
+        $GETSTRIPE -v $DIR/d65 | grep "Default" || error "no stripe info failed"
 	touch $DIR/d65/f6
 	$LVERIFY $DIR/d65 $DIR/d65/f6 || error "lverify failed"
 }
@@ -2827,7 +2827,7 @@ test_65g() {
         mkdir -p $DIR/d65
         $SETSTRIPE $DIR/d65 -s $(($STRIPESIZE * 2)) -i 0 -c 1 || error "setstripe"
         $SETSTRIPE -d $DIR/d65 || error "setstripe"
-        $GETSTRIPE -v $DIR/d65 | grep "has no stripe info" || \
+        $GETSTRIPE -v $DIR/d65 | grep "Default" || \
 		error "delete default stripe failed"
 }
 run_test 65g "directory setstripe -d ==========================="
diff --git a/lustre/utils/liblustreapi.c b/lustre/utils/liblustreapi.c
index 8efe2db20dc1caa714ff6a53b4363251ba17b54d..185be04120a5e1babb925a19dd64dec090265d06 100644
--- a/lustre/utils/liblustreapi.c
+++ b/lustre/utils/liblustreapi.c
@@ -518,8 +518,12 @@ void lov_dump_user_lmm_v1(struct lov_user_md_v1 *lum, char *path, int is_dir,
         /* if it's a directory */
         if (is_dir) {
                 if (obdstripe == 1) {
+                        if (lum->lmm_object_gr == LOV_OBJECT_GROUP_DEFAULT) {
+                                llapi_printf(LLAPI_MSG_NORMAL, "(Default) ");
+                                lum->lmm_object_gr = LOV_OBJECT_GROUP_CLEAR;
+                        }
                         llapi_printf(LLAPI_MSG_NORMAL, 
-                                     "default stripe_count: %d stripe_size: %u "
+                                     "stripe_count: %d stripe_size: %u "
                                      "stripe_offset: %d\n",
                                      lum->lmm_stripe_count == (__u16)-1 ? -1 :
                                      lum->lmm_stripe_count,