diff --git a/src/comp/middle/tstate/states.rs b/src/comp/middle/tstate/states.rs
index de367a256af..56dca058c5e 100644
--- a/src/comp/middle/tstate/states.rs
+++ b/src/comp/middle/tstate/states.rs
@@ -620,6 +620,7 @@ fn find_pre_post_state_expr(fcx: &fn_ctxt, pres: &prestate, e: @expr) ->
           none. { ret pure_exp(fcx.ccx, e.id, pres); }
         }
       }
+      expr_uniq(_) { ret pure_exp(fcx.ccx, e.id, pres); }
     }
 }
 
diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs
index fbb69c226ed..161ad281158 100644
--- a/src/comp/middle/typeck.rs
+++ b/src/comp/middle/typeck.rs
@@ -2467,6 +2467,11 @@ fn check_expr_with_unifier(fcx: &@fn_ctxt, expr: &@ast::expr,
         // Now remove the info from the stack.
         ivec::pop[obj_info](fcx.ccx.obj_infos);
       }
+      ast::expr_uniq(x) {
+        let t = next_ty_var(fcx);
+        check_expr_with(fcx, x, ty::mk_uniq(tcx, t));
+        write::ty_only_fixup(fcx, id, ty::mk_uniq(tcx, t));
+      }
       _ { tcx.sess.unimpl("expr type in typeck::check_expr"); }
     }
     if bot {
diff --git a/src/comp/syntax/ast.rs b/src/comp/syntax/ast.rs
index d2ad2cd0f08..152fb38157c 100644
--- a/src/comp/syntax/ast.rs
+++ b/src/comp/syntax/ast.rs
@@ -336,6 +336,7 @@ tag expr_ {
     expr_chan(@expr);
     expr_anon_obj(anon_obj);
     expr_mac(mac);
+    expr_uniq(@expr);
 }
 
 type mac = spanned[mac_];
diff --git a/src/comp/syntax/fold.rs b/src/comp/syntax/fold.rs
index 77ec93c809b..956373da964 100644
--- a/src/comp/syntax/fold.rs
+++ b/src/comp/syntax/fold.rs
@@ -433,6 +433,7 @@ fn noop_fold_expr(e: &expr_, fld: ast_fold) -> expr_ {
           expr_chan(e) { expr_chan(fld.fold_expr(e)) }
           expr_anon_obj(ao) { expr_anon_obj(fold_anon_obj(ao)) }
           expr_mac(mac) { expr_mac(fold_mac(mac)) }
+          expr_uniq(e) { expr_uniq(fld.fold_expr(e)) }
         }
 }
 
diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs
index 27ded6cdc25..7f8a3aae0bf 100644
--- a/src/comp/syntax/parse/parser.rs
+++ b/src/comp/syntax/parse/parser.rs
@@ -870,7 +870,7 @@ fn parse_bottom_expr(p: &parser) -> @ast::expr {
                   span: p.get_span()};
             ex = ast::expr_lit(lit);
           }
-          _ { p.fatal("unimplemented: unique pointer creation"); }
+          _ { ex = ast::expr_uniq(parse_expr(p)); }
         }
     } else if (eat_word(p, "obj")) {
         // Anonymous object
diff --git a/src/comp/syntax/print/pprust.rs b/src/comp/syntax/print/pprust.rs
index de0e459c650..98e91a7f41f 100644
--- a/src/comp/syntax/print/pprust.rs
+++ b/src/comp/syntax/print/pprust.rs
@@ -1037,6 +1037,10 @@ fn print_expr(s: &ps, expr: &@ast::expr) {
         }
         bclose(s, expr.span);
       }
+      ast::expr_uniq(expr) {
+        word(s.s, "~");
+        print_expr(s, expr);
+      }
     }
     s.ann.post(ann_node);
     end(s);
diff --git a/src/comp/syntax/visit.rs b/src/comp/syntax/visit.rs
index 5f160d88e6f..735daf0b1b4 100644
--- a/src/comp/syntax/visit.rs
+++ b/src/comp/syntax/visit.rs
@@ -341,6 +341,7 @@ fn visit_expr[E](ex: &@expr, e: &E, v: &vt[E]) {
         }
       }
       expr_mac(mac) { visit_mac(mac, e, v); }
+      expr_uniq(x) { v.visit_expr(x, e, v); }
     }
 }