Inline unsafety token
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 3132fd4..b052989 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -353,8 +353,6 @@
 fn fold_type_tuple(&mut self, i: TypeTuple) -> TypeTuple { fold_type_tuple(self, i) }
 
 fn fold_un_op(&mut self, i: UnOp) -> UnOp { fold_un_op(self, i) }
-
-fn fold_unsafety(&mut self, i: Unsafety) -> Unsafety { fold_unsafety(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn fold_use_glob(&mut self, i: UseGlob) -> UseGlob { fold_use_glob(self, i) }
 # [ cfg ( feature = "full" ) ]
@@ -514,7 +512,7 @@
 
 pub fn fold_bare_fn_type<V: Folder + ?Sized>(_visitor: &mut V, _i: BareFnType) -> BareFnType {
     BareFnType {
-        unsafety: _visitor.fold_unsafety(_i . unsafety),
+        unsafety: (_i . unsafety).map(|it| { Token ! [ unsafe ](tokens_helper(_visitor, &(it).0)) }),
         abi: (_i . abi).map(|it| { _visitor.fold_abi(it) }),
         fn_token: Token ! [ fn ](tokens_helper(_visitor, &(_i . fn_token).0)),
         lifetimes: (_i . lifetimes).map(|it| { _visitor.fold_bound_lifetimes(it) }),
@@ -1695,7 +1693,7 @@
 pub fn fold_item_default_impl<V: Folder + ?Sized>(_visitor: &mut V, _i: ItemDefaultImpl) -> ItemDefaultImpl {
     ItemDefaultImpl {
         attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
-        unsafety: _visitor.fold_unsafety(_i . unsafety),
+        unsafety: (_i . unsafety).map(|it| { Token ! [ unsafe ](tokens_helper(_visitor, &(it).0)) }),
         impl_token: Token ! [ impl ](tokens_helper(_visitor, &(_i . impl_token).0)),
         path: _visitor.fold_path(_i . path),
         for_token: Token ! [ for ](tokens_helper(_visitor, &(_i . for_token).0)),
@@ -1736,7 +1734,7 @@
         attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
         vis: _visitor.fold_visibility(_i . vis),
         constness: (_i . constness).map(|it| { Token ! [ const ](tokens_helper(_visitor, &(it).0)) }),
-        unsafety: _visitor.fold_unsafety(_i . unsafety),
+        unsafety: (_i . unsafety).map(|it| { Token ! [ unsafe ](tokens_helper(_visitor, &(it).0)) }),
         abi: (_i . abi).map(|it| { _visitor.fold_abi(it) }),
         ident: _visitor.fold_ident(_i . ident),
         decl: Box::new(_visitor.fold_fn_decl(* _i . decl)),
@@ -1757,7 +1755,7 @@
     ItemImpl {
         attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
         defaultness: (_i . defaultness).map(|it| { Token ! [ default ](tokens_helper(_visitor, &(it).0)) }),
-        unsafety: _visitor.fold_unsafety(_i . unsafety),
+        unsafety: (_i . unsafety).map(|it| { Token ! [ unsafe ](tokens_helper(_visitor, &(it).0)) }),
         impl_token: Token ! [ impl ](tokens_helper(_visitor, &(_i . impl_token).0)),
         generics: _visitor.fold_generics(_i . generics),
         trait_: (_i . trait_).map(|it| { (
@@ -1836,7 +1834,7 @@
     ItemTrait {
         attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
         vis: _visitor.fold_visibility(_i . vis),
-        unsafety: _visitor.fold_unsafety(_i . unsafety),
+        unsafety: (_i . unsafety).map(|it| { Token ! [ unsafe ](tokens_helper(_visitor, &(it).0)) }),
         auto_token: (_i . auto_token).map(|it| { Token ! [ auto ](tokens_helper(_visitor, &(it).0)) }),
         trait_token: Token ! [ trait ](tokens_helper(_visitor, &(_i . trait_token).0)),
         ident: _visitor.fold_ident(_i . ident),
@@ -1977,7 +1975,7 @@
 pub fn fold_method_sig<V: Folder + ?Sized>(_visitor: &mut V, _i: MethodSig) -> MethodSig {
     MethodSig {
         constness: (_i . constness).map(|it| { Token ! [ const ](tokens_helper(_visitor, &(it).0)) }),
-        unsafety: _visitor.fold_unsafety(_i . unsafety),
+        unsafety: (_i . unsafety).map(|it| { Token ! [ unsafe ](tokens_helper(_visitor, &(it).0)) }),
         abi: (_i . abi).map(|it| { _visitor.fold_abi(it) }),
         ident: _visitor.fold_ident(_i . ident),
         decl: _visitor.fold_fn_decl(_i . decl),
@@ -2597,18 +2595,6 @@
         }
     }
 }
-
-pub fn fold_unsafety<V: Folder + ?Sized>(_visitor: &mut V, _i: Unsafety) -> Unsafety {
-    use ::Unsafety::*;
-    match _i {
-        Unsafe(_binding_0, ) => {
-            Unsafe (
-                Token ! [ unsafe ](tokens_helper(_visitor, &(_binding_0).0)),
-            )
-        }
-        Normal => { Normal }
-    }
-}
 # [ cfg ( feature = "full" ) ]
 pub fn fold_use_glob<V: Folder + ?Sized>(_visitor: &mut V, _i: UseGlob) -> UseGlob {
     UseGlob {
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index 9ab94cb..e06c758 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -349,8 +349,6 @@
 fn visit_type_tuple(&mut self, i: &'ast TypeTuple) { visit_type_tuple(self, i) }
 
 fn visit_un_op(&mut self, i: &'ast UnOp) { visit_un_op(self, i) }
-
-fn visit_unsafety(&mut self, i: &'ast Unsafety) { visit_unsafety(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn visit_use_glob(&mut self, i: &'ast UseGlob) { visit_use_glob(self, i) }
 # [ cfg ( feature = "full" ) ]
@@ -475,7 +473,7 @@
 }
 
 pub fn visit_bare_fn_type<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast BareFnType) {
-    _visitor.visit_unsafety(& _i . unsafety);
+    if let Some(ref it) = _i . unsafety { tokens_helper(_visitor, &(it).0) };
     if let Some(ref it) = _i . abi { _visitor.visit_abi(it) };
     tokens_helper(_visitor, &(& _i . fn_token).0);
     if let Some(ref it) = _i . lifetimes { _visitor.visit_bound_lifetimes(it) };
@@ -1327,7 +1325,7 @@
 # [ cfg ( feature = "full" ) ]
 pub fn visit_item_default_impl<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ItemDefaultImpl) {
     for it in & _i . attrs { _visitor.visit_attribute(it) };
-    _visitor.visit_unsafety(& _i . unsafety);
+    if let Some(ref it) = _i . unsafety { tokens_helper(_visitor, &(it).0) };
     tokens_helper(_visitor, &(& _i . impl_token).0);
     _visitor.visit_path(& _i . path);
     tokens_helper(_visitor, &(& _i . for_token).0);
@@ -1362,7 +1360,7 @@
     for it in & _i . attrs { _visitor.visit_attribute(it) };
     _visitor.visit_visibility(& _i . vis);
     if let Some(ref it) = _i . constness { tokens_helper(_visitor, &(it).0) };
-    _visitor.visit_unsafety(& _i . unsafety);
+    if let Some(ref it) = _i . unsafety { tokens_helper(_visitor, &(it).0) };
     if let Some(ref it) = _i . abi { _visitor.visit_abi(it) };
     _visitor.visit_ident(& _i . ident);
     _visitor.visit_fn_decl(& * _i . decl);
@@ -1379,7 +1377,7 @@
 pub fn visit_item_impl<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ItemImpl) {
     for it in & _i . attrs { _visitor.visit_attribute(it) };
     if let Some(ref it) = _i . defaultness { tokens_helper(_visitor, &(it).0) };
-    _visitor.visit_unsafety(& _i . unsafety);
+    if let Some(ref it) = _i . unsafety { tokens_helper(_visitor, &(it).0) };
     tokens_helper(_visitor, &(& _i . impl_token).0);
     _visitor.visit_generics(& _i . generics);
     if let Some(ref it) = _i . trait_ { 
@@ -1446,7 +1444,7 @@
 pub fn visit_item_trait<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast ItemTrait) {
     for it in & _i . attrs { _visitor.visit_attribute(it) };
     _visitor.visit_visibility(& _i . vis);
-    _visitor.visit_unsafety(& _i . unsafety);
+    if let Some(ref it) = _i . unsafety { tokens_helper(_visitor, &(it).0) };
     if let Some(ref it) = _i . auto_token { tokens_helper(_visitor, &(it).0) };
     tokens_helper(_visitor, &(& _i . trait_token).0);
     _visitor.visit_ident(& _i . ident);
@@ -1562,7 +1560,7 @@
 # [ cfg ( feature = "full" ) ]
 pub fn visit_method_sig<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast MethodSig) {
     if let Some(ref it) = _i . constness { tokens_helper(_visitor, &(it).0) };
-    _visitor.visit_unsafety(& _i . unsafety);
+    if let Some(ref it) = _i . unsafety { tokens_helper(_visitor, &(it).0) };
     if let Some(ref it) = _i . abi { _visitor.visit_abi(it) };
     _visitor.visit_ident(& _i . ident);
     _visitor.visit_fn_decl(& _i . decl);
@@ -2012,16 +2010,6 @@
         }
     }
 }
-
-pub fn visit_unsafety<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Unsafety) {
-    use ::Unsafety::*;
-    match *_i {
-        Unsafe(ref _binding_0, ) => {
-            tokens_helper(_visitor, &(_binding_0).0);
-        }
-        Normal => { }
-    }
-}
 # [ cfg ( feature = "full" ) ]
 pub fn visit_use_glob<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast UseGlob) {
     tokens_helper(_visitor, &(& _i . star_token).0);
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index e879222..34543d7 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -349,8 +349,6 @@
 fn visit_type_tuple_mut(&mut self, i: &mut TypeTuple) { visit_type_tuple_mut(self, i) }
 
 fn visit_un_op_mut(&mut self, i: &mut UnOp) { visit_un_op_mut(self, i) }
-
-fn visit_unsafety_mut(&mut self, i: &mut Unsafety) { visit_unsafety_mut(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn visit_use_glob_mut(&mut self, i: &mut UseGlob) { visit_use_glob_mut(self, i) }
 # [ cfg ( feature = "full" ) ]
@@ -475,7 +473,7 @@
 }
 
 pub fn visit_bare_fn_type_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut BareFnType) {
-    _visitor.visit_unsafety_mut(& mut _i . unsafety);
+    if let Some(ref mut it) = _i . unsafety { tokens_helper(_visitor, &mut (it).0) };
     if let Some(ref mut it) = _i . abi { _visitor.visit_abi_mut(it) };
     tokens_helper(_visitor, &mut (& mut _i . fn_token).0);
     if let Some(ref mut it) = _i . lifetimes { _visitor.visit_bound_lifetimes_mut(it) };
@@ -1327,7 +1325,7 @@
 # [ cfg ( feature = "full" ) ]
 pub fn visit_item_default_impl_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ItemDefaultImpl) {
     for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
-    _visitor.visit_unsafety_mut(& mut _i . unsafety);
+    if let Some(ref mut it) = _i . unsafety { tokens_helper(_visitor, &mut (it).0) };
     tokens_helper(_visitor, &mut (& mut _i . impl_token).0);
     _visitor.visit_path_mut(& mut _i . path);
     tokens_helper(_visitor, &mut (& mut _i . for_token).0);
@@ -1362,7 +1360,7 @@
     for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
     _visitor.visit_visibility_mut(& mut _i . vis);
     if let Some(ref mut it) = _i . constness { tokens_helper(_visitor, &mut (it).0) };
-    _visitor.visit_unsafety_mut(& mut _i . unsafety);
+    if let Some(ref mut it) = _i . unsafety { tokens_helper(_visitor, &mut (it).0) };
     if let Some(ref mut it) = _i . abi { _visitor.visit_abi_mut(it) };
     _visitor.visit_ident_mut(& mut _i . ident);
     _visitor.visit_fn_decl_mut(& mut * _i . decl);
@@ -1379,7 +1377,7 @@
 pub fn visit_item_impl_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ItemImpl) {
     for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
     if let Some(ref mut it) = _i . defaultness { tokens_helper(_visitor, &mut (it).0) };
-    _visitor.visit_unsafety_mut(& mut _i . unsafety);
+    if let Some(ref mut it) = _i . unsafety { tokens_helper(_visitor, &mut (it).0) };
     tokens_helper(_visitor, &mut (& mut _i . impl_token).0);
     _visitor.visit_generics_mut(& mut _i . generics);
     if let Some(ref mut it) = _i . trait_ { 
@@ -1446,7 +1444,7 @@
 pub fn visit_item_trait_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ItemTrait) {
     for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
     _visitor.visit_visibility_mut(& mut _i . vis);
-    _visitor.visit_unsafety_mut(& mut _i . unsafety);
+    if let Some(ref mut it) = _i . unsafety { tokens_helper(_visitor, &mut (it).0) };
     if let Some(ref mut it) = _i . auto_token { tokens_helper(_visitor, &mut (it).0) };
     tokens_helper(_visitor, &mut (& mut _i . trait_token).0);
     _visitor.visit_ident_mut(& mut _i . ident);
@@ -1562,7 +1560,7 @@
 # [ cfg ( feature = "full" ) ]
 pub fn visit_method_sig_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut MethodSig) {
     if let Some(ref mut it) = _i . constness { tokens_helper(_visitor, &mut (it).0) };
-    _visitor.visit_unsafety_mut(& mut _i . unsafety);
+    if let Some(ref mut it) = _i . unsafety { tokens_helper(_visitor, &mut (it).0) };
     if let Some(ref mut it) = _i . abi { _visitor.visit_abi_mut(it) };
     _visitor.visit_ident_mut(& mut _i . ident);
     _visitor.visit_fn_decl_mut(& mut _i . decl);
@@ -2012,16 +2010,6 @@
         }
     }
 }
-
-pub fn visit_unsafety_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut Unsafety) {
-    use ::Unsafety::*;
-    match *_i {
-        Unsafe(ref mut _binding_0, ) => {
-            tokens_helper(_visitor, &mut (_binding_0).0);
-        }
-        Normal => { }
-    }
-}
 # [ cfg ( feature = "full" ) ]
 pub fn visit_use_glob_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut UseGlob) {
     tokens_helper(_visitor, &mut (& mut _i . star_token).0);
diff --git a/src/item.rs b/src/item.rs
index 1151ed4..74ed612 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -70,7 +70,7 @@
             pub attrs: Vec<Attribute>,
             pub vis: Visibility,
             pub constness: Option<Token![const]>,
-            pub unsafety: Unsafety,
+            pub unsafety: Option<Token![unsafe]>,
             pub abi: Option<Abi>,
             pub ident: Ident,
             pub decl: Box<FnDecl>,
@@ -150,7 +150,7 @@
         pub Trait(ItemTrait {
             pub attrs: Vec<Attribute>,
             pub vis: Visibility,
-            pub unsafety: Unsafety,
+            pub unsafety: Option<Token![unsafe]>,
             pub auto_token: Option<Token![auto]>,
             pub trait_token: Token![trait],
             pub ident: Ident,
@@ -165,7 +165,7 @@
         /// E.g. `impl Trait for .. {}` or `impl<T> Trait<T> for .. {}`
         pub DefaultImpl(ItemDefaultImpl {
             pub attrs: Vec<Attribute>,
-            pub unsafety: Unsafety,
+            pub unsafety: Option<Token![unsafe]>,
             pub impl_token: Token![impl],
             pub path: Path,
             pub for_token: Token![for],
@@ -178,7 +178,7 @@
         pub Impl(ItemImpl {
             pub attrs: Vec<Attribute>,
             pub defaultness: Option<Token![default]>,
-            pub unsafety: Unsafety,
+            pub unsafety: Option<Token![unsafe]>,
             pub impl_token: Token![impl],
             pub generics: Generics,
             /// Trait this impl implements.
@@ -400,7 +400,7 @@
     /// or in an implementation.
     pub struct MethodSig {
         pub constness: Option<Token![const]>,
-        pub unsafety: Unsafety,
+        pub unsafety: Option<Token![unsafe]>,
         pub abi: Option<Abi>,
         pub ident: Ident,
         pub decl: FnDecl,
@@ -678,7 +678,7 @@
         outer_attrs: many0!(Attribute::parse_outer) >>
         vis: syn!(Visibility) >>
         constness: option!(keyword!(const)) >>
-        unsafety: syn!(Unsafety) >>
+        unsafety: option!(keyword!(unsafe)) >>
         abi: option!(syn!(Abi)) >>
         fn_: keyword!(fn) >>
         ident: syn!(Ident) >>
@@ -955,7 +955,7 @@
     impl_synom!(ItemTrait "trait item" do_parse!(
         attrs: many0!(Attribute::parse_outer) >>
         vis: syn!(Visibility) >>
-        unsafety: syn!(Unsafety) >>
+        unsafety: option!(keyword!(unsafe)) >>
         auto_: option!(keyword!(auto)) >>
         trait_: keyword!(trait) >>
         ident: syn!(Ident) >>
@@ -986,7 +986,7 @@
 
     impl_synom!(ItemDefaultImpl "default impl item" do_parse!(
         attrs: many0!(Attribute::parse_outer) >>
-        unsafety: syn!(Unsafety) >>
+        unsafety: option!(keyword!(unsafe)) >>
         impl_: keyword!(impl) >>
         path: syn!(Path) >>
         for_: keyword!(for) >>
@@ -1035,7 +1035,7 @@
     impl_synom!(TraitItemMethod "method trait item" do_parse!(
         outer_attrs: many0!(Attribute::parse_outer) >>
         constness: option!(keyword!(const)) >>
-        unsafety: syn!(Unsafety) >>
+        unsafety: option!(keyword!(unsafe)) >>
         abi: option!(syn!(Abi)) >>
         fn_: keyword!(fn) >>
         ident: syn!(Ident) >>
@@ -1128,7 +1128,7 @@
     impl_synom!(ItemImpl "impl item" do_parse!(
         attrs: many0!(Attribute::parse_outer) >>
         defaultness: option!(keyword!(default)) >>
-        unsafety: syn!(Unsafety) >>
+        unsafety: option!(keyword!(unsafe)) >>
         impl_: keyword!(impl) >>
         generics: syn!(Generics) >>
         polarity_path: alt!(
@@ -1200,7 +1200,7 @@
         vis: syn!(Visibility) >>
         defaultness: option!(keyword!(default)) >>
         constness: option!(keyword!(const)) >>
-        unsafety: syn!(Unsafety) >>
+        unsafety: option!(keyword!(unsafe)) >>
         abi: option!(syn!(Abi)) >>
         fn_: keyword!(fn) >>
         ident: syn!(Ident) >>
diff --git a/src/lib.rs b/src/lib.rs
index 38303f9..dc869c0 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -91,7 +91,7 @@
              GenericArgument, MutType, ParenthesizedGenericArguments, Path,
              PathArguments, PathSegment, PolyTraitRef, QSelf, ReturnType, Type, TypeArray,
              TypeBareFn, TypeBinding, TypeGroup, TypeImplTrait, TypeInfer, TypeNever, TypeParen,
-             TypePath, TypePtr, TypeReference, TypeSlice, TypeTraitObject, TypeTuple, Unsafety};
+             TypePath, TypePtr, TypeReference, TypeSlice, TypeTraitObject, TypeTuple};
 #[cfg(feature = "printing")]
 pub use ty::PathTokens;
 
diff --git a/src/ty.rs b/src/ty.rs
index e780540..01fd7bc 100644
--- a/src/ty.rs
+++ b/src/ty.rs
@@ -268,7 +268,7 @@
 
 ast_struct! {
     pub struct BareFnType {
-        pub unsafety: Unsafety,
+        pub unsafety: Option<Token![unsafe]>,
         pub abi: Option<Abi>,
         pub fn_token: Token![fn],
         pub lifetimes: Option<BoundLifetimes>,
@@ -279,14 +279,6 @@
     }
 }
 
-ast_enum! {
-    #[cfg_attr(feature = "clone-impls", derive(Copy))]
-    pub enum Unsafety {
-        Unsafe(Token![unsafe]),
-        Normal,
-    }
-}
-
 ast_struct! {
     pub struct Abi {
         pub extern_token: Token![extern],
@@ -460,7 +452,7 @@
     impl Synom for TypeBareFn {
         named!(parse -> Self, do_parse!(
             lifetimes: option!(syn!(BoundLifetimes)) >>
-            unsafety: syn!(Unsafety) >>
+            unsafety: option!(keyword!(unsafe)) >>
             abi: option!(syn!(Abi)) >>
             fn_: keyword!(fn) >>
             parens: parens!(do_parse!(
@@ -801,14 +793,6 @@
         ));
     }
 
-    impl Synom for Unsafety {
-        named!(parse -> Self, alt!(
-            keyword!(unsafe) => { Unsafety::Unsafe }
-            |
-            epsilon!() => { |_| Unsafety::Normal }
-        ));
-    }
-
     impl Synom for Abi {
         named!(parse -> Self, do_parse!(
             extern_: keyword!(extern) >>
@@ -1108,17 +1092,6 @@
         }
     }
 
-    impl ToTokens for Unsafety {
-        fn to_tokens(&self, tokens: &mut Tokens) {
-            match *self {
-                Unsafety::Unsafe(ref t) => t.to_tokens(tokens),
-                Unsafety::Normal => {
-                    // nothing
-                }
-            }
-        }
-    }
-
     impl ToTokens for Abi {
         fn to_tokens(&self, tokens: &mut Tokens) {
             self.extern_token.to_tokens(tokens);