diff --git a/stack.sh b/stack.sh
index 44665c40ae..28aa4b7161 100755
--- a/stack.sh
+++ b/stack.sh
@@ -408,10 +408,33 @@ function screen_it {
 screen -d -m -S nova -t nova
 sleep 1
 
-screen_it g-api "cd $GLANCE_DIR; bin/glance-api --config-file=etc/glance-api.conf"
-screen_it g-reg "cd $GLANCE_DIR; bin/glance-registry --config-file=etc/glance-registry.conf"
-screen_it key "$KEYSTONE_DIR/bin/keystone --config-file $KEYSTONE_CONF"
-screen_it n-api "$NOVA_DIR/bin/nova-api"
+if [[ "$ENABLED_SERVICES" =~ "g-reg" ]]; then
+    screen_it g-reg "cd $GLANCE_DIR; bin/glance-registry --config-file=etc/glance-registry.conf"
+fi
+
+if [[ "$ENABLED_SERVICES" =~ "g-api" ]]; then
+    screen_it g-api "cd $GLANCE_DIR; bin/glance-api --config-file=etc/glance-api.conf"
+    while ! wget -q -O- http://$GLANCE_HOSTPORT; do
+        echo "Waiting for g-api ($GLANCE_HOSTPORT) to start..."
+        sleep 1
+    done
+fi
+
+if [[ "$ENABLED_SERVICES" =~ "key" ]]; then
+    screen_it key "$KEYSTONE_DIR/bin/keystone --config-file $KEYSTONE_CONF"
+    while ! wget -q -O- http://127.0.0.1:5000; do
+        echo "Waiting for keystone to start..."
+        sleep 1
+    done
+fi
+
+if [[ "$ENABLED_SERVICES" =~ "n-api" ]]; then
+    screen_it n-api "$NOVA_DIR/bin/nova-api"
+    while ! wget -q -O- http://127.0.0.1:8774; do
+        echo "Waiting for nova-api to start..."
+        sleep 1
+    done
+fi
 # Launching nova-compute should be as simple as running ``nova-compute`` but 
 # have to do a little more than that in our script.  Since we add the group 
 # ``libvirtd`` to our user in this script, when nova-compute is run it is