diff --git a/maud/src/lib.rs b/maud/src/lib.rs
index 0f6b83f..c31b50d 100644
--- a/maud/src/lib.rs
+++ b/maud/src/lib.rs
@@ -19,7 +19,6 @@
 //!
 //! ```rust
 //! #![feature(plugin)]
-//! #![allow(unstable)]
 //!
 //! extern crate maud;
 //! #[plugin] #[no_link] extern crate maud_macros;
@@ -154,7 +153,7 @@
 //! As with literals, expression values are escaped by default. Use a
 //! `$$` prefix to disable this behavior.
 
-#![allow(unstable)]
+#![feature(core, io)]
 
 use std::fmt;
 use std::old_io::{IoError, IoErrorKind, IoResult};
diff --git a/maud_macros/src/lib.rs b/maud_macros/src/lib.rs
index bffbc47..4c5b8f5 100644
--- a/maud_macros/src/lib.rs
+++ b/maud_macros/src/lib.rs
@@ -1,6 +1,6 @@
 #![crate_type = "dylib"]
 #![feature(plugin_registrar, quote)]
-#![allow(unstable)]
+#![feature(core, rustc_private)]
 
 extern crate syntax;
 extern crate rustc;
diff --git a/maud_macros/src/parse.rs b/maud_macros/src/parse.rs
index 445c3ba..052c363 100644
--- a/maud_macros/src/parse.rs
+++ b/maud_macros/src/parse.rs
@@ -109,7 +109,7 @@ impl<'cx, 's, 'i, 'r> Parser<'cx, 's, 'i, 'r> {
             // Block
             [TtDelimited(_, ref d), ..] if d.delim == token::DelimToken::Brace => {
                 self.shift(1);
-                self.block(d.tts.as_slice())
+                self.block(&d.tts)
             },
             // ???
             _ => {
@@ -127,7 +127,7 @@ impl<'cx, 's, 'i, 'r> Parser<'cx, 's, 'i, 'r> {
     fn literal(&mut self, tt: &TokenTree, minus: bool) {
         let lit = self.new_rust_parser(vec![tt.clone()]).parse_lit();
         match lit_to_string(self.render.cx, lit, minus) {
-            Some(s) => self.render.string(s.as_slice(), Escape::Escape),
+            Some(s) => self.render.string(&s, Escape::Escape),
             None => {},
         }
     }
@@ -234,7 +234,7 @@ fn lit_to_string(cx: &ExtCtxt, lit: Lit, minus: bool) -> Option<String> {
             return None;
         },
         LitChar(c) => result.push(c),
-        LitInt(x, _) => result.push_str(x.to_string().as_slice()),
+        LitInt(x, _) => result.push_str(&x.to_string()),
         LitFloat(s, _) | LitFloatUnsuffixed(s) => result.push_str(s.get()),
         LitBool(b) => result.push_str(if b { "true" } else { "false" }),
     };
diff --git a/maud_macros/src/render.rs b/maud_macros/src/render.rs
index 8143835..ffed877 100644
--- a/maud_macros/src/render.rs
+++ b/maud_macros/src/render.rs
@@ -7,7 +7,7 @@ use syntax::ptr::P;
 
 use maud;
 
-#[derive(Copy, PartialEq, Show)]
+#[derive(Copy)]
 pub enum Escape {
     PassThru,
     Escape,
@@ -68,7 +68,7 @@ impl<'cx, 's> Renderer<'cx, 's> {
             Escape::PassThru => s.into_cow(),
             Escape::Escape => maud::escape(s).into_cow(),
         };
-        self.write(s.as_slice());
+        self.write(&s);
     }
 
     /// Append the result of an expression, with the specified escaping method.
diff --git a/maud_macros/tests/tests.rs b/maud_macros/tests/tests.rs
index 6834094..164e862 100644
--- a/maud_macros/tests/tests.rs
+++ b/maud_macros/tests/tests.rs
@@ -1,5 +1,4 @@
 #![feature(plugin)]
-#![allow(unstable)]
 
 extern crate maud;
 #[plugin] #[no_link] extern crate maud_macros;