Roughly parse 2.0 macro syntax
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index e92937f..722c1a1 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -244,6 +244,8 @@
 # [ cfg ( feature = "full" ) ]
 fn fold_item_macro(&mut self, i: ItemMacro) -> ItemMacro { fold_item_macro(self, i) }
 # [ cfg ( feature = "full" ) ]
+fn fold_item_macro2(&mut self, i: ItemMacro2) -> ItemMacro2 { fold_item_macro2(self, i) }
+# [ cfg ( feature = "full" ) ]
 fn fold_item_mod(&mut self, i: ItemMod) -> ItemMod { fold_item_mod(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn fold_item_static(&mut self, i: ItemStatic) -> ItemStatic { fold_item_static(self, i) }
@@ -1700,6 +1702,11 @@
                 _visitor.fold_item_macro(_binding_0),
             )
         }
+        Macro2(_binding_0, ) => {
+            Macro2 (
+                _visitor.fold_item_macro2(_binding_0),
+            )
+        }
     }
 }
 # [ cfg ( feature = "full" ) ]
@@ -1797,6 +1804,17 @@
     }
 }
 # [ cfg ( feature = "full" ) ]
+pub fn fold_item_macro2<V: Folder + ?Sized>(_visitor: &mut V, _i: ItemMacro2) -> ItemMacro2 {
+    ItemMacro2 {
+        attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
+        vis: _visitor.fold_visibility(_i . vis),
+        macro_token: _i . macro_token,
+        ident: _i . ident,
+        args: _i . args,
+        body: _i . body,
+    }
+}
+# [ cfg ( feature = "full" ) ]
 pub fn fold_item_mod<V: Folder + ?Sized>(_visitor: &mut V, _i: ItemMod) -> ItemMod {
     ItemMod {
         attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index 6e167b1..06697aa 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -217,6 +217,8 @@
 # [ cfg ( feature = "full" ) ]
 fn visit_item_macro(&mut self, i: &'ast ItemMacro) { visit_item_macro(self, i) }
 # [ cfg ( feature = "full" ) ]
+fn visit_item_macro2(&mut self, i: &'ast ItemMacro2) { visit_item_macro2(self, i) }
+# [ cfg ( feature = "full" ) ]
 fn visit_item_mod(&mut self, i: &'ast ItemMod) { visit_item_mod(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn visit_item_static(&mut self, i: &'ast ItemStatic) { visit_item_static(self, i) }
@@ -1309,6 +1311,9 @@
         Macro(ref _binding_0, ) => {
             _visitor.visit_item_macro(&* _binding_0);
         }
+        Macro2(ref _binding_0, ) => {
+            _visitor.visit_item_macro2(&* _binding_0);
+        }
     }
 }
 # [ cfg ( feature = "full" ) ]
@@ -1390,6 +1395,15 @@
     _visitor.visit_macro(&_i . mac);
 }
 # [ cfg ( feature = "full" ) ]
+pub fn visit_item_macro2<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ItemMacro2) {
+    for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
+    _visitor.visit_visibility(&_i . vis);
+    // Skipped field _i . macro_token;
+    // Skipped field _i . ident;
+    // Skipped field _i . args;
+    // Skipped field _i . body;
+}
+# [ cfg ( feature = "full" ) ]
 pub fn visit_item_mod<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ItemMod) {
     for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
     _visitor.visit_visibility(&_i . vis);
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index d0c5113..3a91cd4 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -217,6 +217,8 @@
 # [ cfg ( feature = "full" ) ]
 fn visit_item_macro_mut(&mut self, i: &mut ItemMacro) { visit_item_macro_mut(self, i) }
 # [ cfg ( feature = "full" ) ]
+fn visit_item_macro2_mut(&mut self, i: &mut ItemMacro2) { visit_item_macro2_mut(self, i) }
+# [ cfg ( feature = "full" ) ]
 fn visit_item_mod_mut(&mut self, i: &mut ItemMod) { visit_item_mod_mut(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn visit_item_static_mut(&mut self, i: &mut ItemStatic) { visit_item_static_mut(self, i) }
@@ -1309,6 +1311,9 @@
         Macro(ref mut _binding_0, ) => {
             _visitor.visit_item_macro_mut(&mut * _binding_0);
         }
+        Macro2(ref mut _binding_0, ) => {
+            _visitor.visit_item_macro2_mut(&mut * _binding_0);
+        }
     }
 }
 # [ cfg ( feature = "full" ) ]
@@ -1390,6 +1395,15 @@
     _visitor.visit_macro_mut(&mut _i . mac);
 }
 # [ cfg ( feature = "full" ) ]
+pub fn visit_item_macro2_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ItemMacro2) {
+    for mut it in (_i . attrs).iter_mut() { _visitor.visit_attribute_mut(&mut it) };
+    _visitor.visit_visibility_mut(&mut _i . vis);
+    // Skipped field _i . macro_token;
+    // Skipped field _i . ident;
+    // Skipped field _i . args;
+    // Skipped field _i . body;
+}
+# [ cfg ( feature = "full" ) ]
 pub fn visit_item_mod_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ItemMod) {
     for mut it in (_i . attrs).iter_mut() { _visitor.visit_attribute_mut(&mut it) };
     _visitor.visit_visibility_mut(&mut _i . vis);
diff --git a/src/item.rs b/src/item.rs
index 476bfbb..f7e3e91 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -189,6 +189,15 @@
             pub ident: Option<Ident>,
             pub mac: Macro,
         }),
+        /// FIXME will need to revisit what this looks like in the AST.
+        pub Macro2(ItemMacro2 {
+            pub attrs: Vec<Attribute>,
+            pub vis: Visibility,
+            pub macro_token: Token![macro],
+            pub ident: Ident,
+            pub args: TokenTree,
+            pub body: TokenTree,
+        }),
     }
 }
 
@@ -483,6 +492,8 @@
         syn!(ItemImpl) => { Item::Impl }
         |
         syn!(ItemMacro) => { Item::Macro }
+        |
+        syn!(ItemMacro2) => { Item::Macro2 }
     ));
 
     impl_synom!(ItemMacro "macro item" do_parse!(
@@ -490,7 +501,7 @@
         what: syn!(Path) >>
         bang: punct!(!) >>
         ident: option!(syn!(Ident)) >>
-        body: call!(::TokenTree::parse_delimited) >>
+        body: call!(TokenTree::parse_delimited) >>
         cond!(!body.is_braced(), punct!(;)) >>
         (ItemMacro {
             attrs: attrs,
@@ -503,6 +514,24 @@
         })
     ));
 
+    // TODO: figure out the actual grammar; is body required to be braced?
+    impl_synom!(ItemMacro2 "macro2 item" do_parse!(
+        attrs: many0!(call!(Attribute::parse_outer)) >>
+        vis: syn!(Visibility) >>
+        macro_: keyword!(macro) >>
+        ident: syn!(Ident) >>
+        args: call!(TokenTree::parse_delimited) >>
+        body: call!(TokenTree::parse_delimited) >>
+        (ItemMacro2 {
+            attrs: attrs,
+            vis: vis,
+            macro_token: macro_,
+            ident: ident,
+            args: args,
+            body: body,
+        })
+    ));
+
     impl_synom!(ItemExternCrate "extern crate item" do_parse!(
         attrs: many0!(call!(Attribute::parse_outer)) >>
         vis: syn!(Visibility) >>
@@ -1551,6 +1580,17 @@
         }
     }
 
+    impl ToTokens for ItemMacro2 {
+        fn to_tokens(&self, tokens: &mut Tokens) {
+            tokens.append_all(self.attrs.outer());
+            self.vis.to_tokens(tokens);
+            self.macro_token.to_tokens(tokens);
+            self.ident.to_tokens(tokens);
+            self.args.to_tokens(tokens);
+            self.body.to_tokens(tokens);
+        }
+    }
+
     impl ToTokens for PathSimple {
         fn to_tokens(&self, tokens: &mut Tokens) {
             self.path.to_tokens(tokens);
diff --git a/src/lib.rs b/src/lib.rs
index 92f3386..40472c5 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -55,7 +55,7 @@
 pub use item::{Constness, Defaultness, FnArg, FnDecl, ForeignItem, ItemForeignMod,
                ImplItem, ImplPolarity, Item, MethodSig, PathListItem,
                TraitItem, ViewPath, ItemExternCrate, ItemUse,
-               ItemStatic, ItemConst, ItemFn, ItemMacro, ItemMod, ItemType, ItemEnum,
+               ItemStatic, ItemConst, ItemFn, ItemMacro, ItemMacro2, ItemMod, ItemType, ItemEnum,
                ItemStruct, ItemUnion, ItemTrait, ItemDefaultImpl, ItemImpl,
                PathSimple, PathGlob, PathList, ForeignItemFn, ForeignItemStatic, ForeignItemType,
                TraitItemConst, TraitItemMacro, TraitItemMethod, TraitItemType,
diff --git a/synom/src/tokens.rs b/synom/src/tokens.rs
index 269da93..f2f1a89 100644
--- a/synom/src/tokens.rs
+++ b/synom/src/tokens.rs
@@ -185,6 +185,7 @@
         (pub struct In                      => "in"),
         (pub struct Let                     => "let"),
         (pub struct Loop                    => "loop"),
+        (pub struct Macro                   => "macro"),
         (pub struct Match                   => "match"),
         (pub struct Mod                     => "mod"),
         (pub struct Move                    => "move"),
@@ -277,6 +278,7 @@
     (in)       => { $crate::tokens::In };
     (let)      => { $crate::tokens::Let };
     (loop)     => { $crate::tokens::Loop };
+    (macro)    => { $crate::tokens::Macro };
     (match)    => { $crate::tokens::Match };
     (mod)      => { $crate::tokens::Mod };
     (move)     => { $crate::tokens::Move };
@@ -370,6 +372,7 @@
     ($i:expr, in)       => { call!($i, <$crate::tokens::In as $crate::Synom>::parse) };
     ($i:expr, let)      => { call!($i, <$crate::tokens::Let as $crate::Synom>::parse) };
     ($i:expr, loop)     => { call!($i, <$crate::tokens::Loop as $crate::Synom>::parse) };
+    ($i:expr, macro)    => { call!($i, <$crate::tokens::Macro as $crate::Synom>::parse) };
     ($i:expr, match)    => { call!($i, <$crate::tokens::Match as $crate::Synom>::parse) };
     ($i:expr, mod)      => { call!($i, <$crate::tokens::Mod as $crate::Synom>::parse) };
     ($i:expr, move)     => { call!($i, <$crate::tokens::Move as $crate::Synom>::parse) };