diff --git a/src/Makefile b/src/Makefile
index c6f0a5bf31a..84f3a2b2ef2 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -357,6 +357,7 @@ TEST_XFAILS_X86 :=  test/run-pass/bind-obj-ctor.rs \
                     test/run-pass/vec-slice.rs \
                     test/run-pass/fn-lval.rs \
                     test/run-pass/generic-fn-infer.rs \
+                    test/run-pass/generic-tag-alt.rs \
                     test/run-pass/generic-recursive-tag.rs \
                     test/run-pass/iter-ret.rs \
                     test/run-pass/mlist-cycle.rs \
@@ -387,6 +388,7 @@ TEST_XFAILS_LLVM := $(addprefix test/run-pass/, \
                       bind-thunk.rs \
                       bind-trivial.rs \
                       bitwise.rs \
+                      box-in-tup.rs \
                       box-unbox.rs \
                       cast.rs \
                       clone-with-exterior.rs \
@@ -476,6 +478,7 @@ TEST_XFAILS_LLVM := $(addprefix test/run-pass/, \
                       vec-append.rs \
                       vec-concat.rs \
                       vec-drop.rs \
+                      vec-in-tup.rs \
                       vec-late-init.rs \
                       vec-lib.rs \
                       vec-slice.rs \
diff --git a/src/boot/me/trans.ml b/src/boot/me/trans.ml
index 4902c300640..cd59ff5dd2f 100644
--- a/src/boot/me/trans.ml
+++ b/src/boot/me/trans.ml
@@ -1248,12 +1248,16 @@ let trans_visitor
                  (sorted_htab_keys fns))
         end
 
-  and trans_init_str (dst:Ast.lval) (s:string) : unit =
+  and trans_init_str (initializing:bool) (dst:Ast.lval) (s:string) : unit =
     (* Include null byte. *)
     let init_sz = Int64.of_int ((String.length s) + 1) in
     let static = trans_static_string s in
-    let (dst, _) = trans_lval_init dst in
-      trans_upcall "upcall_new_str" dst [| static; imm init_sz |]
+    let (dst_cell, dst_ty) = trans_lval_maybe_init initializing dst in
+    let _ =
+      if not initializing
+      then drop_ty_in_current_frame dst_cell dst_ty
+    in
+      trans_upcall "upcall_new_str" dst_cell [| static; imm init_sz |]
 
   and trans_lit (lit:Ast.lit) : Il.operand =
     match lit with
@@ -2220,22 +2224,33 @@ let trans_visitor
                  trans_atom (Ast.ATOM_lval chan) |];
         end
 
-  and trans_init_port (dst:Ast.lval) : unit =
-    let (dstcell, dst_ty) = trans_lval_init dst in
+  and trans_init_port (initializing:bool) (dst:Ast.lval) : unit =
+    let (dst_cell, dst_ty) = trans_lval_maybe_init initializing dst in
+    let _ =
+      if not initializing
+      then drop_ty_in_current_frame dst_cell dst_ty
+    in
     let unit_ty = match dst_ty with
         Ast.TY_port t -> t
       | _ -> bug () "init dst of port-init has non-port type"
     in
     let unit_sz = ty_sz abi unit_ty in
-      trans_upcall "upcall_new_port" dstcell [| imm unit_sz |]
+      trans_upcall "upcall_new_port" dst_cell [| imm unit_sz |]
 
   and trans_del_port (port:Il.cell) : unit =
     trans_void_upcall "upcall_del_port" [| Il.Cell port |]
 
-  and trans_init_chan (dst:Ast.lval) (port:Ast.lval) : unit =
-    let (dstcell, _) = trans_lval_init dst
+  and trans_init_chan
+      (initializing:bool)
+      (dst:Ast.lval)
+      (port:Ast.lval)
+      : unit =
+    let (dst_cell, dst_ty) = trans_lval_maybe_init initializing dst in
+    let _ =
+      if not initializing
+      then drop_ty_in_current_frame dst_cell dst_ty
     in
-      trans_upcall "upcall_new_chan" dstcell
+      trans_upcall "upcall_new_chan" dst_cell
         [| trans_atom (Ast.ATOM_lval port) |]
 
   and trans_del_chan (chan:Il.cell) : unit =
@@ -2258,8 +2273,16 @@ let trans_visitor
    * part out for reuse in string code.
    *)
 
-  and trans_init_vec (dst:Ast.lval) (atoms:Ast.atom array) : unit =
-    let (dst_cell, dst_ty) = trans_lval_init dst in
+  and trans_init_vec
+      (initializing:bool)
+      (dst:Ast.lval)
+      (atoms:Ast.atom array)
+      : unit =
+    let (dst_cell, dst_ty) = trans_lval_maybe_init initializing dst in
+    let _ =
+      if not initializing
+      then drop_ty_in_current_frame dst_cell dst_ty
+    in
     let gc_ctrl =
       if (ty_mem_ctrl dst_ty) = MEM_gc
       then Il.Cell (get_tydesc None dst_ty)
@@ -2292,17 +2315,26 @@ let trans_visitor
             mov (get_element_ptr vec Abi.vec_elt_fill) (Il.Cell fill);
 
 
-  and trans_init_box (dst:Ast.lval) (src:Ast.atom) : unit =
+  and trans_init_box
+      (initializing:bool)
+      (dst:Ast.lval)
+      (src:Ast.atom)
+      : unit =
     let src_op = trans_atom src in
     let src_cell = Il.Mem (force_to_mem src_op) in
     let src_ty = simplified_ty (atom_type cx src) in
-    let dst_sloti = lval_base_to_slot cx dst in
-    let dst_cell = cell_of_block_slot dst_sloti.id in
-    let dst_cell = deref_slot true dst_cell dst_sloti.node in
-    let dst_ty = slot_ty dst_sloti.node in
+    let (dst_cell, dst_ty) = trans_lval_maybe_init initializing dst in
+    let _ =
+      if not initializing
+      then drop_ty_in_current_frame dst_cell dst_ty
+    in
+    let dst_ty = strip_mutable_or_constrained_ty dst_ty in
     let (dst_cell, dst_ty) =
       deref_ty DEREF_one_box true dst_cell dst_ty
     in
+    let _ = log cx "init_box: dst ty %a, src ty %a"
+      Ast.sprintf_ty dst_ty Ast.sprintf_ty src_ty
+    in
     let _ = assert (dst_ty = src_ty) in
       trans_copy_ty (get_ty_params_of_current_frame()) true
         dst_cell dst_ty src_cell src_ty None
@@ -2868,6 +2900,12 @@ let trans_visitor
       : unit =
       drop_slot (get_ty_params_of_current_frame()) cell slot curr_iso
 
+  and drop_ty_in_current_frame
+      (cell:Il.cell)
+      (ty:Ast.ty)
+      : unit =
+    drop_ty (get_ty_params_of_current_frame()) cell ty None
+
   and null_check (cell:Il.cell) : quad_idx =
     emit (Il.cmp (Il.Cell cell) zero);
     let j = mark() in
@@ -4338,7 +4376,7 @@ let trans_visitor
 
 
   and trans_copy_binop dst binop a_src =
-    let (dst_cell, dst_ty) = trans_lval_maybe_init false dst in
+    let (dst_cell, dst_ty) = trans_lval dst in
     let src_oper = trans_atom a_src in
       match dst_ty with
           Ast.TY_str
@@ -4440,7 +4478,8 @@ let trans_visitor
           end
 
       | Ast.STMT_init_rec (dst, atab, base) ->
-          let (slot_cell, ty) = trans_lval_init dst in
+          let init = maybe_init stmt.id "rec-init" dst in
+          let (dst_cell, ty) = trans_lval_maybe_init init dst in
           let (trec, dst_tys) =
             match ty with
                 Ast.TY_rec trec -> (trec, Array.map snd trec)
@@ -4448,7 +4487,6 @@ let trans_visitor
                   bugi cx stmt.id
                     "non-rec destination type in stmt_init_rec"
           in
-          let (dst_cell, _) = deref_ty DEREF_none true slot_cell ty in
             begin
               match base with
                   None ->
@@ -4461,42 +4499,52 @@ let trans_visitor
             end
 
       | Ast.STMT_init_tup (dst, elems) ->
-          let (slot_cell, ty) = trans_lval_init dst in
+          let init = maybe_init stmt.id "tup-init" dst in
+          let (dst_cell, dst_ty) = trans_lval_maybe_init init dst in
+          let _ =
+            if not init
+            then drop_ty_in_current_frame dst_cell dst_ty
+          in
           let dst_tys =
-            match ty with
+            match dst_ty with
                 Ast.TY_tup ttup -> ttup
               | _ ->
                   bugi cx stmt.id
                     "non-tup destination type in stmt_init_tup"
           in
           let atoms = Array.map snd elems in
-          let (dst_cell, _) = deref_ty DEREF_none true slot_cell ty in
+          let (dst_cell, _) = deref_ty DEREF_none init dst_cell dst_ty in
             trans_init_structural_from_atoms dst_cell dst_tys atoms
 
 
       | Ast.STMT_init_str (dst, s) ->
-          trans_init_str dst s
+          let init = maybe_init stmt.id "str-init" dst in
+            trans_init_str init dst s
 
       | Ast.STMT_init_vec (dst, _, atoms) ->
-          trans_init_vec dst atoms
+          let init = maybe_init stmt.id "vec-init" dst in
+            trans_init_vec init dst atoms
 
       | Ast.STMT_init_port dst ->
-          trans_init_port dst
+          let init = maybe_init stmt.id "port-init" dst in
+            trans_init_port init dst
 
       | Ast.STMT_init_chan (dst, port) ->
+          let init = maybe_init stmt.id "chan-init" dst in
           begin
             match port with
                 None ->
                   let (dst_cell, _) =
-                    trans_lval_init dst
+                    trans_lval_maybe_init init dst
                   in
                     mov dst_cell imm_false
               | Some p ->
-                  trans_init_chan dst p
+                  trans_init_chan init dst p
           end
 
       | Ast.STMT_init_box (dst, _, src) ->
-          trans_init_box dst src
+          let init = maybe_init stmt.id "box-init" dst in
+            trans_init_box init dst src
 
       | Ast.STMT_block block ->
           trans_block block
diff --git a/src/test/run-pass/mlist-cycle.rs b/src/test/run-pass/mlist-cycle.rs
index c41cd5f5bc4..09221ea3e2c 100644
--- a/src/test/run-pass/mlist-cycle.rs
+++ b/src/test/run-pass/mlist-cycle.rs
@@ -6,9 +6,9 @@ type cell = tup(mutable @list);
 type list = tag(link(@cell), nil());
 
 fn main() {
-  let @cell first = tup(@nil());
-  let @cell second = tup(@link(first));
+  let @cell first = @tup(mutable @nil());
+  let @cell second = @tup(mutable @link(first));
   first._0 = @link(second);
   std.sys.rustrt.gc();
-  let @cell third = tup(@nil());
+  let @cell third = @tup(mutable @nil());
 }