diff --git a/web-world/dwarves/dwarves.rkt b/web-world/dwarves/dwarves.rkt
index 27e572d..88187a9 100644
--- a/web-world/dwarves/dwarves.rkt
+++ b/web-world/dwarves/dwarves.rkt
@@ -23,8 +23,8 @@
 ;; until we're all done.
 (define (draw w v)
   (cond [(< w (length dwarf-names))
-         (view-append (view-focus v "ul")
-                      (make-item (list-ref dwarf-names w)))]
+         (view-append-child (view-focus v "ul")
+                            (make-item (list-ref dwarf-names w)))]
         [else
          v]))
 
diff --git a/web-world/impl.rkt b/web-world/impl.rkt
index a53202f..af69961 100644
--- a/web-world/impl.rkt
+++ b/web-world/impl.rkt
@@ -45,4 +45,5 @@
 
                     view-form-value
                     update-view-form-value
+                    view-append-child
                     ))
diff --git a/web-world/js-impl.js b/web-world/js-impl.js
index 6be34d7..edaf813 100644
--- a/web-world/js-impl.js
+++ b/web-world/js-impl.js
@@ -322,6 +322,30 @@
     };
 
 
+    MockView.prototype.appendChild = function(domNode) {
+        return this.act(
+            function(cursor) {
+                if (cursor.canDown()) {
+                    cursor = cursor.down();
+                    while (cursor.canRight()) {
+                        cursor = cursor.right();
+                    }
+                    return cursor.insertRight(domNode);
+                } else {
+                    return cursor.insertDown(domNode);
+                }
+            },
+            function(eventHandlers) { return eventHandlers; },
+            function(view) {
+                var clone = $(domNode).clone(true);
+                clone.appendTo(view.focus);
+                view.focus = clone;
+            }
+        )
+    };
+
+
+
 
     //////////////////////////////////////////////////////////////////////
 
@@ -444,6 +468,40 @@
     };
 
 
+    var coerseToDomNode = function(x, onSuccess, onFail) {
+        var dom;
+        if (isDomNode(x)) { 
+            return onSuccess(x); 
+        } else  if (isResource(x)) {
+            try {
+                dom = $(resourceContent(x).toString())
+                    .css("margin", "0px")
+                    .css("padding", "0px")
+                    .css("border", "0px");
+            } catch (exn) {
+                return onFail(exn);
+            }
+            return onSuccess(dom);
+        } else if (isMockView(x)) {
+            return onSuccess(x.cursor.top().node);
+        } else {
+            try {
+                dom = $(plt.baselib.format.toDomNode(x))
+            } catch (exn) {
+                return onFail(exn);
+            }
+            return onSuccess(dom);
+        }
+    };
+
+
+    var isDomNode = function(x) {
+        if (return x.hasOwnProperty(nodeType) &&
+            x.nodeType === 1);
+    };
+
+
+
 
 
 
@@ -1166,6 +1224,15 @@
         });
 
 
+    
+    EXPORTS['view-append-child'] = makePrimitiveProcedure(
+        'view-append-child',
+        2,
+        function(MACHINE) {
+            var view = checkMockView(MACHINE, 'view-append-child', 1);
+            var dom = coerseToDomNode(MACHINE.env[MACHINE.env.length - 2]);
+            return view.appendChild(dom);
+        });
 
 
 
diff --git a/web-world/racket-impl.rkt b/web-world/racket-impl.rkt
index c0be1d2..e31f88d 100644
--- a/web-world/racket-impl.rkt
+++ b/web-world/racket-impl.rkt
@@ -13,6 +13,7 @@
 
          view-show
          view-hide
+         view-append-child
          )
 
 
@@ -86,3 +87,7 @@
 
 (define (view-hide)
   (error 'view-hide "Please run in JavaScript context."))
+
+
+(define (view-append-child dom)
+  (error 'view-append "Please run in JavaScript context."))