diff --git a/src/librustdoc/clean.rs b/src/librustdoc/clean.rs
index cabfb05cb6f..cabfe695df7 100644
--- a/src/librustdoc/clean.rs
+++ b/src/librustdoc/clean.rs
@@ -152,6 +152,21 @@ impl Item {
         return None;
     }
 
+    pub fn is_hidden_from_doc(&self) -> bool {
+        match self.doc_list() {
+            Some(ref l) => {
+                for innerattr in l.iter() {
+                    match *innerattr {
+                        Word(ref s) if "hidden" == *s => return true,
+                        _ => (),
+                    }
+                }
+            },
+            None => ()
+        }
+        return false;
+    }
+
     pub fn is_mod(&self) -> bool {
         match self.inner { ModuleItem(..) => true, _ => false }
     }
@@ -736,7 +751,7 @@ impl Clean<Type> for ast::Ty {
 
 #[deriving(Clone, Encodable, Decodable)]
 pub enum StructField {
-    HiddenStructField,
+    HiddenStructField, // inserted later by strip passes
     TypedStructField(Type),
 }
 
diff --git a/src/librustdoc/passes.rs b/src/librustdoc/passes.rs
index 9b6d04f2ca4..f8a2382c028 100644
--- a/src/librustdoc/passes.rs
+++ b/src/librustdoc/passes.rs
@@ -33,23 +33,24 @@ pub fn strip_hidden(krate: clean::Crate) -> plugins::PluginResult {
         };
         impl<'a> fold::DocFolder for Stripper<'a> {
             fn fold_item(&mut self, i: Item) -> Option<Item> {
-                for attr in i.attrs.iter() {
-                    match attr {
-                        &clean::List(ref x, ref l) if "doc" == *x => {
-                            for innerattr in l.iter() {
-                                match innerattr {
-                                    &clean::Word(ref s) if "hidden" == *s => {
-                                        debug!("found one in strip_hidden; removing");
-                                        self.stripped.insert(i.id);
-                                        return None;
-                                    },
-                                    _ => (),
-                                }
-                            }
-                        },
-                        _ => ()
+                if i.is_hidden_from_doc() {
+                    debug!("found one in strip_hidden; removing");
+                    self.stripped.insert(i.id);
+
+                    // use a dedicated hidden item for given item type if any
+                    match i.inner {
+                        clean::StructFieldItem(..) => {
+                            return Some(clean::Item {
+                                inner: clean::StructFieldItem(clean::HiddenStructField),
+                                ..i
+                            });
+                        }
+                        _ => {
+                            return None;
+                        }
                     }
                 }
+
                 self.fold_item_recur(i)
             }
         }