public boolean umount() throws DBusException {
        /**
         * TODO: umount timeout problem: when there have been previous copy
         * operations, this call very often fails with the following exception:
         * org.freedesktop.DBus$Error$NoReply: No reply within specified time at
         * org.freedesktop.dbus.RemoteInvocationHandler.executeRemoteMethod(RemoteInvocationHandler.java:133)
         * at
         * org.freedesktop.dbus.RemoteInvocationHandler.invoke(RemoteInvocationHandler.java:188)
         * at $Proxy2.FilesystemUnmount(Unknown Source)
         */
        boolean success = false;
        for (int i = 0; !success && (i < 60); i++) {
            // it already happend that during the timeout
            // in handleUmountException() the umount call succeeded!
            // therefore we need to test for the mount status in every round
            // and act accordingly...
            List<String> mountPaths = getMountPaths();
            if ((mountPaths != null) && (!mountPaths.isEmpty())) {
                LOGGER.log(Level.INFO,
                        "/dev/{0} is mounted on {1}, calling umount...",
                        new Object[]{deviceAndNumber, mountPaths.get(0)});
                if (DbusTools.DBUS_VERSION == DbusTools.DbusVersion.V1) {
                    try {
                        Device dbusDevice = DbusTools.getDevice(deviceAndNumber);
                        dbusDevice.FilesystemUnmount(new ArrayList<String>());
                        success = true;
                    } catch (DBusException | DBusExecutionException ex) {
                        handleUmountException(ex);
                    }
                } else {
                    // creating a Java interface for
                    // org.freedestkop.UDisks2.Filesystem fails, see here:
                    // https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=777241
                    //
                    // So we have to call udisksctl directly.
                    // This utterly sucks but our options are limited...
                    ProcessExecutor processExecutor = new ProcessExecutor();
                    int returnValue = processExecutor.executeProcess(
                            true, true, "udisksctl", "unmount", "-b",
                            "/dev/" + deviceAndNumber);
                    if (returnValue == 0) {
                        success = true;
                    } else {
                        handleUmountException(new Exception("unmount failed"));
                    }
                }
            } else {
                LOGGER.log(Level.INFO,
                        "/dev/{0} was NOT mounted", deviceAndNumber);
                success = true;
            }
        }
        if (!success) {
            LOGGER.log(Level.SEVERE,
                    "Could not umount /dev/{0}", deviceAndNumber);
        }
        return success;
    }