DB_SCHEMA=/usr/share/openvswitch/vswitch.ovsschema
 DB_PID_FILE=/var/run/openvswitch/db.pid
 DB_LOG=/var/log/ovs-db.log
+DB_CTRL_SOCKET=/var/run/openvswitch/db-ctrl.sock
 ##
 DB_SOCKET=/var/run/openvswitch/db.sock
 ##
     ovs-appctl --target=$SWITCH_SOCKET version >& /dev/null
 }
 
+function is_db_running {
+    ovs-appctl --target=$DB_CTRL_SOCKET version >& /dev/null
+}
+
 function tapname () {
     IP=$1; shift
     echo $(ip addr show to "$IP/32" | perl -ne '/^\s*\d+:\s*([\w-]+):/ && print $1')
            --bootstrap-ca-cert=db:SSL,ca_cert \
            --pidfile=$DB_PID_FILE \
            --log-file=$DB_LOG \
+           --unixctl=$DB_CTRL_SOCKET \
            --detach >& /dev/null
     else
        echo 'ovsdb-server appears to be running already, *not* starting'
 
     [[ -n "$@" ]] && error "Usage: $COMMAND start-switch"
 
+    # ensure ovsdb-server is running
+    is_db_running || { echo "ovsdb-server not running" >&2 ; exit 1 ; }
+
     if [ ! -f "$SWITCH_PID_FILE" ] ; then
        ovs-vswitchd \
            --pidfile=$SWITCH_PID_FILE \
     # check whether the address is already assigned
     TAPNAME=$(tapname $IP)
     if [ ! -z "$TAPNAME" ]; then
-       if ovs-vsctl --db=$DB_SOCKET br-exists "$TAPNAME"; then
+       if ovs-vsctl --db=unix:$DB_SOCKET br-exists "$TAPNAME"; then
            echo $TAPNAME
            exit 0
        fi
     port=$1; shift
     [[ -n "$@" ]] || error "$COMMAND create-port <bridge> <port>"
 
+    # ensure ovs-vswitchd is running
+    is_switch_running || { echo "ovs-vswitchd not running" >&2 ; exit 1 ; }
+
     set -e
     if ! ovs-vsctl --db=$DB_SOCKET list-ports "$bridge" | grep -q "^$port\$"; then
        ovs-vsctl --db=$DB_SOCKET add-port "$bridge" "$port" -- set interface "$port" type=tunnel
     [[ -n "$@" ]] && error "Usage: ${COMMAND} del-bridge <bridge name>"
 
     W=
-    is_switch_running || W="--no-wait"
+    if ! is_switch_running; then
+       # we can delete the bridge even if ovs-vswitchd is not running,
+       # but we need a running ovsdb-server
+       is_db_running || { echo "ovsdb-server not running" >&2; exit 1; }
+       W="--no-wait"
+    fi
 
-    if ovs-vsctl --db=$DB_SOCKET br-exists "$bridge_name"; then
+    set -e
+    if ovs-vsctl --db=$DB_SOCKET $W br-exists "$bridge_name"; then
        ovs-vsctl --db=$DB_SOCKET $W del-br $bridge_name
     fi
     return 0
     bridge_name=$1; shift
     [[ -n "$@" ]] && error "Usage: ${COMMAND} del-port <port>"
 
+    W=
+    if ! is_switch_running; then
+       # we can delete the port even if ovs-vswitchd is not running,
+       # but we need a running ovsdb-server
+       is_db_running || { echo "ovsdb-server not running" >&2; exit 1; }
+       W="--no-wait"
+    fi
+
     set -e
-    if ovs-vsctl --db=$DB_SOCKET port-to-br "$1" >/dev/null 2>&1; then
-       ovs-vsctl --db=$DB_SOCKET del-port "$1"
+    if ovs-vsctl --db=$DB_SOCKET $W port-to-br "$1" >/dev/null 2>&1; then
+       ovs-vsctl --db=$DB_SOCKET $W del-port "$1"
     fi
     return 0
 }