diff --git a/examples/app.rs b/examples/app.rs
index a5690dd36e35597a57a57eef48859908c4d5e310..c848e54255db9c7de5c55722ccf9f3c04bcd71b0 100644
--- a/examples/app.rs
+++ b/examples/app.rs
@@ -4,7 +4,9 @@ extern crate parsetest;
 use parsetest::app;
 
 app!{
-    id1, id2
+    id1 ,
+    id2 ,
+    id2 ,
 }
 
 fn main() {
diff --git a/src/lib.rs b/src/lib.rs
index b8d51aa7afede22323ad11a2f250264dc3d5f355..4aea5bd046f63baa5c0ba8d2506435b196e52088 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,6 +1,7 @@
 #![feature(proc_macro)]
 
 extern crate proc_macro;
+extern crate proc_macro2 as pm2;
 #[macro_use]
 extern crate quote;
 #[macro_use]
@@ -24,10 +25,7 @@ pub fn lit(input: TokenStream) -> TokenStream {
     if !(10 <= value && value < 100) {
         v.span()
             .unstable()
-            .error(format!(
-                "expected literal 10 <= x < 100, got {}",
-                value,
-            ))
+            .error(format!("expected literal 10 <= x < 100, got {}", value,))
             .emit();
     }
     From::from(v.into_tokens())
@@ -43,10 +41,7 @@ pub fn lite(input: TokenStream) -> TokenStream {
             if !(10 <= value && value < 100) {
                 v.span()
                     .unstable()
-                    .error(format!(
-                        "expected literal 10 <= x < 100, got {}",
-                        value,
-                    ))
+                    .error(format!("expected literal 10 <= x < 100, got {}", value,))
                     .emit();
             }
             From::from(v.into_tokens())
@@ -61,8 +56,6 @@ pub fn lite(input: TokenStream) -> TokenStream {
     }
 }
 
-use syn::Path;
-
 enum AppKeys {
     Device,
     Resources,
@@ -107,24 +100,35 @@ fn to_app_keys(id: Ident) -> Option<AppKeys> {
 // }
 
 use syn::punctuated::Punctuated;
-struct AppK {}
 
 struct KeyVal {
-    kv: Punctuated<Ident, Token![,]>,
+    key: Ident,
+    val: pm2::TokenStream,
 }
 
 impl Synom for KeyVal {
     named!(parse -> Self, do_parse!(
-        kv: call!(Punctuated::parse_terminated_nonempty) >> 
-        (KeyVal { kv })
+        key: call!(Ident::parse) >> 
+        val: call!(pm2::TokenStream::parse) >> (KeyVal { key, val })
+    ));
+}
+
+struct KeyVals {
+    keyvals: Punctuated<Ident, Token![,]>,
+}
+
+impl Synom for KeyVals {
+    named!(parse -> Self, do_parse!(
+        keyvals: call!(Punctuated::parse_terminated_nonempty) >> 
+        (KeyVals { keyvals })
     ));
 }
 
 #[proc_macro]
 pub fn app(input: TokenStream) -> TokenStream {
     println!("-- app --");
-    let k: KeyVal = syn::parse(input).unwrap();
-    for k in k.kv.into_iter() {
+    let k: KeyVals = syn::parse(input).unwrap();
+    for k in k.keyvals.into_iter() {
         println!("{:?}", k.as_ref());
     }
     //  {