             open: @state.open and @state.contacts?.length > 0
         current    = 0
 
-        # inChrome, we need to cancel some events for drop to work
-        cancelDragEvent = (event) ->
+        # in Chrome, we need to cancel some events for drop to work
+        cancelDragEvent = (event) =>
             event.preventDefault()
+            # To prevent removing the contact when dropped where it has been dragged,
+            # we must set dropEffect to 'none'
+            # if Chrome, we can only access types of data, not data themselves
+            # In Chrome, types are an array; in Firefox, a DOMStringList
+            types = Array.prototype.slice.call(event.dataTransfer.types)
+            if types.indexOf(@props.id) is -1
+                event.dataTransfer.dropEffect = 'move'
+            else
+                event.dataTransfer.dropEffect = 'none'
 
         div
             className: className,

        onChange = (event) =>
            value = event.target.value.split ','
            if value.length is 2
                @state.known.push(MessageUtils.parseAddress value[0])
                @props.valueLink.requestChange @state.known
                @setState unknown: value[1].trim()
            else
                @setState unknown: event.target.value

    onDrop: (event) ->
        event.preventDefault()
        event.stopPropagation()
        {name, address} = JSON.parse(event.dataTransfer.getData 'address')
        exists = @state.known.some (item) ->
            return item.name is name and item.address is address
        if address? and not exists
            address =
                name    : name
                address : address
            known = _.clone @state.known
            known.push address
            @props.valueLink.requestChange known
            @setState unknown: '', contacts: null, open: false
            event.dataTransfer.dropEffect = 'move'
        else
            event.dataTransfer.dropEffect = 'none'
