diff --git a/src/bindgen/config.rs b/src/bindgen/config.rs
index 004b9901e0f980472c961c49d3a1ef05e49480c3..e33af99fc2b1568810a400974ed1107e77d9e6fc 100644
--- a/src/bindgen/config.rs
+++ b/src/bindgen/config.rs
@@ -110,6 +110,8 @@ pub struct Config {
     pub tab_width: usize,
     /// The language to output bindings for
     pub language: Language,
+    /// The names of crates to parse with `rustc --pretty=expanded`
+    pub expand: Vec<String>,
     /// The configuration options for functions
     #[serde(rename = "fn")]
     pub function: FunctionConfig,
@@ -133,6 +135,7 @@ impl Default for Config {
             line_length: 100,
             tab_width: 2,
             language: Language::Cxx,
+            expand: Vec::new(),
             function: FunctionConfig::default(),
             structure: StructConfig::default(),
             enumeration: EnumConfig::default(),
diff --git a/src/bindgen/library.rs b/src/bindgen/library.rs
index adb151304188e431f4e4d5e2f90401783a43e6d4..c92ce6d1c6847ac8e299ec9d60e00cf9795de2e0 100644
--- a/src/bindgen/library.rs
+++ b/src/bindgen/library.rs
@@ -305,7 +305,10 @@ impl<'a> Library<'a> {
     {
         let mut library = Library::blank(bindings_crate_name, config);
 
-        rust_lib::parse_lib(crate_dir, bindings_crate_name, &mut |crate_name, items| {
+        rust_lib::parse_lib(crate_dir,
+                            bindings_crate_name,
+                            &config.expand,
+                            &mut |crate_name, items| {
             library.parse_crate_mod(&crate_name, items);
         });
 
diff --git a/src/bindgen/rust_lib.rs b/src/bindgen/rust_lib.rs
index 6c873ff844c442674e5a626e80a82a0288cffdf8..b8a81f73bdde6768967b22f8385a2b232fb73d20 100644
--- a/src/bindgen/rust_lib.rs
+++ b/src/bindgen/rust_lib.rs
@@ -36,6 +36,7 @@ pub fn parse_src<F>(src_file: &Path,
 /// command to find the location of dependencies.
 pub fn parse_lib<F>(crate_path: &Path,
                     binding_crate_name: &str,
+                    expand: &[String],
                     items_callback: &mut F)
     where F: FnMut(&str, &Vec<syn::Item>)
 {
@@ -50,6 +51,7 @@ pub fn parse_lib<F>(crate_path: &Path,
     let mut context = ParseLibContext {
       manifest_path: manifest_path,
       metadata: metadata,
+      expand: expand.to_owned(),
       cache_src: HashMap::new(),
       cache_expanded_crate: HashMap::new(),
       items_callback: items_callback,
@@ -63,6 +65,7 @@ struct ParseLibContext<F>
 {
   manifest_path: PathBuf,
   metadata: cargo_metadata::Metadata,
+  expand: Vec<String>,
   cache_src: HashMap<PathBuf, Vec<syn::Item>>,
   cache_expanded_crate: HashMap<String, Vec<syn::Item>>,
 
@@ -95,6 +98,11 @@ fn parse_crate<F>(crate_name: &str, context: &mut ParseLibContext<F>)
         return;
     }
 
+    if context.expand.contains(&crate_name.to_owned()) {
+      parse_expand_crate(crate_name, context);
+      return;
+    }
+
     let crate_src = context.find_crate_src(crate_name);
 
     match crate_src {
@@ -155,8 +163,8 @@ fn process_expanded_mod<F>(crate_name: &str,
                 warn!("external mod found in expanded source");
             }
             syn::ItemKind::ExternCrate(_) => {
-                parse_expand_crate(&item.ident.to_string(),
-                                   context);
+                parse_crate(&item.ident.to_string(),
+                            context);
             }
             _ => {}
         }
@@ -227,8 +235,8 @@ fn process_mod<F>(crate_name: &str,
                 }
             }
             syn::ItemKind::ExternCrate(_) => {
-                parse_expand_crate(&item.ident.to_string(),
-                                   context);
+                parse_crate(&item.ident.to_string(),
+                            context);
             }
             _ => {}
         }