have nodetool && have cqlsh &&
{

    show_keyspaces()
    {
        local ks=$(get_keyspaces)
        COMPREPLY=( $(compgen -W "$ks" -- "$1") )
    }

    get_keyspaces()
    {
        [ -z "$keyspaces" ] && keyspaces=$(echo "DESCRIBE KEYSPACES" | cqlsh | egrep -v '^$')
        echo $keyspaces
    }

    show_datacenters()
    {
        cur=$1
        set|grep -q ^dcs || dcs=$(echo "select data_center from system.peers;"|cqlsh |tail -n +4|sort|uniq|awk '{if(length($1)>1) print $1}'|xargs)
        COMPREPLY=( $(compgen -W "$dcs" -- "$cur") )
    }

    show_cfs()
    {
        local cur prev cfs
        prev=$1
        cur=$2
        cfs=$(get_cfs $1 $2)
        COMPREPLY=( $(compgen -W "$cfs" -- "$cur") )
    }

    get_cfs()
    {
        local prev
        prev=$1
        [ -z "${cf[$prev]}" ] && cf[$prev]=$(echo "DESCRIBE COLUMNFAMILIES" | cqlsh -k ${prev} | egrep -v '^$')
        echo ${cf[$prev]}
    }

    show_last_cfs()
    {
        local cur cfs re
        cur=$1
        re=$(echo ${COMP_WORDS[@]:3:$(($COMP_CWORD - 3))} | sed -e 's/ /\\|/g')
        cfs=$(get_cfs ${COMP_WORDS[2]} | sed -e "s/$re//g")
        COMPREPLY=( $(compgen -W "$cfs" -- "${cur}") )
    }

    _nodetool()
    {
        local cur prev ks
        COMPREPLY=()
        _get_comp_words_by_ref cur prev

        local shopt='
            bootstrap
            compactionhistory
            compactionstats
            decommission
            describecluster
            disablebackup
            disablebinary
            disablegossip
            disablehandoff
            disablehintsfordc
            disablethrift
            drain
            enablebackup
            enablebinary
            enablegossip
            enablehandoff
            enablethrift
            enablehintsfordc
            failuredetector
            gcstats
            getcompactionthroughput
            getconcurrentcompactors
            getinterdcstreamthroughput
            getlogginglevels
            getstreamthroughput
            gettimeout
            gettraceprobability
            gossipinfo
            help
            invalidatecountercache
            invalidatekeycache
            invalidaterowcache
            join
            listsnapshots
            pausehandoff
            proxyhistograms
            rangekeysample
            refreshsizeestimates
            reloadlocalschema
            reloadtriggers
            replaybatchlog
            resetlocalschema
            resumehandoff
            ring
            setconcurrentcompactors
            sethintedhandoffthrottlekb
            setinterdcstreamthroughput
            setlogginglevel
            settimeout
            status
            statusbackup
            statusbinary
            statusthrift
            statusgossip
            statushandoff
            stopdaemon
            tablestats
            tpstats
            version
            '

        local lngopt='
            assassinate
            cleanup
            clearsnapshot
            compact
            describering
            disableautocompaction
            enableautocompaction
            flush
            garbagecollect
            getcompactionthreshold
            getendpoints
            getsstables
            info
            move
            netstats
            rebuild
            rebuild_index
            refresh
            relocatesstables
            removenode
            repair
            scrub
            setcachecapacity
            setcachekeystosave
            setcompactionthreshold
            setcompactionthroughput
            setstreamthroughput
            settraceprobability
            snapshot
            stop
            tablehistograms
            toppartitions
            truncatehints
            upgradesstables
            verify
            viewbuildstatus
	    '

        local optwks='
            cleanup
            clearsnapshot
            compact
            describering
            flush
            garbagecollect
            getcompactionthreshold
            getendpoints
            getsstables
            rebuild_index
            refresh
            relocatesstables
            repair
            scrub
            setcompactionthreshold
            snapshot
            tablehistograms
            toppartitions
            verify
            viewbuildstatus
            '

        local optwcfs='
            cleanup
            compact
            disableautocompaction
            enableautocompaction
            flush
            garbagecollect
            relocatesstables
            repair
            scrub
            toppartitions
            upgradesstables
            verify
            '

        if [[ $COMP_CWORD -eq 1 ]] ; then
            COMPREPLY=( $(compgen -W "${lngopt} ${shopt}" -- "${cur}") )
        elif [[ $(echo "${lngopt}"|egrep -c "\b${prev}\b") -gt 0 ]] ; then
            if echo $optwks|grep -q "\b$prev\b" ; then
                show_keyspaces "${cur}"
            else
                case "${prev}" in
                    removenode)
                        # we don't want to lose time using nodetool status a 2nd time
                        # in case of force or status
                        if [[ "${cur}" =~ ^(f|s) ]] ; then
                            COMPREPLY=( $(compgen -W "status force" -- "${cur}") )
                        else
                            [ -z "$IDS" ] && IDS=$(nodetool status|grep %|awk '{print $7}'|xargs)
                            COMPREPLY=( $(compgen -W "status force $IDS" -- "${cur}") )
                        fi
                        return 0
                        ;;
                    stop)
                        COMPREPLY=( $(compgen -W "COMPACTION VALIDATION CLEANUP SCRUB VERIFY INDEX_BUILD" -- "${cur}") )
                        return 0
                        ;;
                    info)
                        COMPREPLY=( $(compgen -W "-T --tokens" -- "${cur}") )
                        return 0
                        ;;
                    rebuild|disablehintsfordc|enablehintsfordc)
                        show_datacenters "${cur}"
                        return 0
                        ;;
                    upgradesstables)
                        ks=$(get_keyspaces)
                        COMPREPLY=( $(compgen -W "-a --include-all-sstables $ks" -- "${cur}") )
                        return 0
                        ;;
                esac
            fi
        elif [[ $COMP_CWORD -eq 3 ]] ; then
            case "${COMP_WORDS[1]}" in
                cleanup|compact|flush|garbagecollect|getcompactionthreshold|getendpoints|getsstables|rebuild_index|refresh|relocatesstables|repair|scrub|setcompactionthreshold|tablehistograms|toppartitions|verify)
                    show_cfs ${prev} ${cur}
                    return 0
                    ;;
                upgradesstables)
                    if [[ ! ${prev} == -* ]]; then
                        show_cfs ${prev} ${cur}
                    fi
                    return 0
                    ;;
                snapshot)
                    COMPREPLY=( $(compgen -W "-cf" -- "${cur}") )
                    return 0
                    ;;
            esac
        elif [[ "${optwcfs}" == *${COMP_WORDS[1]}* ]] ; then
            show_last_cfs ${cur}
        elif [[ $COMP_CWORD -eq 4 && ${COMP_WORDS[1]} == "snapshot" ]] ; then
            show_cfs ${COMP_WORDS[2]} ${cur}
        elif [[ $COMP_CWORD -eq 5 && ${COMP_WORDS[1]} == "snapshot" ]] ; then
            COMPREPLY=( $(compgen -W "-t" -- "${cur}") )
        fi
    }
    complete -F _nodetool nodetool
}
