if [ ! -d "${LOCAL_STORE}" ]; then
     abort "Aborting, no local storage directory at ${LOCAL_STORE}."
 fi
-if echo "${SELECTION}" | grep -v "^${PATTERN_HASH_CHAR}*\$" > /dev/null; then
-    abort "Bad SELECTION format: ${SELECTION}"
-fi
+
+
 
 prefixed_msg 'Collecting known media …'
 OVERVIEW_LOCAL=
 cd "${LOCAL_STORE}"
 parse_line() {
     local TITLE="$1"
-    local HASH='?'
-    local SIZE='?'
+    local HASH=${PLACEHOLDER_HASH}
+    local SIZE=${PLACEHOLDER_SIZE}
     local STATUS='?'
     local PATH_DOWNLOAD="${TITLE}/${DIRNAME_DOWNLOAD}"
     local PATH_SESSION="${TITLE}/${DIRNAME_SESSION}"
     if [ -d "${PATH_DOWNLOAD}" ]; then
-        SIZE=$(du --bytes --human-readable --summarize "${PATH_DOWNLOAD}" | cut -f 1)
+       SIZE=$(du --bytes --human-readable --summarize "${PATH_DOWNLOAD}" | cut -f 1)
+       STATUS='D'
     fi
     if [ -d "${PATH_SESSION}" ]; then
         local SESSION_FILES_LISTING=$(ls -1 "${PATH_SESSION}")
         if [ $(echo "${SESSION_FILES_LISTING}" | wc -l) -eq 3 ]; then
             local MAYBE_HASH=$(basename $(echo "${SESSION_FILES_LISTING}" | head -1) "${EXT_TORRENT}" | grep -E "${PATTERN_HASH_ONLY}")
-            if [ ! -z "${MAYBE_HASH}" ] && expected_rtorrent_files "${PATH_SESSION}/${MAYBE_HASH}${EXT_TORRENT}"; then
+            if [ ! -z "${MAYBE_HASH}" ] \
+                    && expected_rtorrent_files "${PATH_SESSION}/${MAYBE_HASH}${EXT_TORRENT}"
+                then
                 HASH="${MAYBE_HASH}"
+                test "${STATUS}" = '?'&& STATUS='S'
+                test "${STATUS}" = 'D'&& STATUS='+'
             fi
         fi
     fi
-    if [ "${SIZE}" != "?" -a "${HASH}" != "?" ]; then
-       STATUS='+'
-    fi
     OVERVIEW_LOCAL=$(printf '%s %s %s %s\n%s' "${STATUS}" "${HASH}" "${SIZE}" "${TITLE}" "${OVERVIEW_LOCAL}")
 }
 for_line_in "$(ls -1)" parse_line
 cd - > /dev/null
 OVERVIEW_REMOTE=$(ssh -t -q "${SERVER}" "sh -cl ${CMD_PRINT_TORRENTS}")
 
+
+
+prefixed_msg 'Comparing presence here vs there …'
 OVERVIEW_BOTH=
 OVERVIEW_ONLY_REMOTE=
 OVERVIEW_ONLY_LOCAL="${OVERVIEW_LOCAL}"
     OVERVIEW_ONLY_LOCAL="${NEXT_UNUSED}"
 }
 for_line_in "${OVERVIEW_REMOTE}" compare_overviews
-
 if [ -z "${SELECTION}" ]; then
     list_overview() {
-        local MSG="$1"
-        local OVERVIEW="$2"
+        local MSG=$1
+       local OVERVIEW=$(echo "$2" | sort -k 4)
         prefixed_msg "${MSG}"
         if [ -z "${OVERVIEW}" ]; then
             prefixed_msg '(none)'
     exit 0
 fi
 
-FOUND=
+
+
+prefixed_msg "Analyzing selection: ${SELECTION}"
 find_match() {
-    local LINE_CUT=$(printf '%s' "$1" | cut -c 3-)
-    local HASH_START=$(printf '%s' "${LINE_CUT}" | cut -c -${#SELECTION})
-    if [ "${HASH_START}" = "${SELECTION}" ]; then
-        if [ ! -z "${FOUND}" ]; then
-            abort "Ambiguous selection, more than one hash starting with: ${SELECTION}"
+    local LINE=$1
+    local LOCAL_HASH=$(echo "${LINE}" | cut -d' ' -f 2)
+    local LOCAL_TITLE=$(echo "${LINE}" | cut -d' ' -f 4)
+    if $(echo "${LOCAL_HASH}" | grep -iqv "${SELECTION}")\
+        && $(echo "${LOCAL_TITLE}" | grep -iqv "${SELECTION}")
+    then
+        return
+    fi
+    local MSG_AMBIGUITY='Ambiguous selection, more than one selectable match found.'
+    if [ ! -z "${TITLE}" ] && [ "${LOCAL_TITLE}" != "${TITLE}" ]; then
+        abort "${MSG_AMBIGUITY}"
+    fi
+    TITLE="${LOCAL_TITLE}"
+    if [ "${LOCAL_HASH}" != "${PLACEHOLDER_HASH}" ]; then
+        if [ -z "${HASH}" ]; then
+            HASH="${LOCAL_HASH}"
+        elif [ "${LOCAL_HASH}" != "${HASH}" ]; then
+            abort "${MSG_AMBIGUITY}"
         fi
-        FOUND=1
-        HASH=$(printf '%s' "${LINE_CUT}" | cut -d' ' -f 1)
-        TITLE=$(printf '%s' "${LINE_CUT}" | cut -d' ' -f 3-)
     fi
+    STATUS=$(echo "${LINE}" | cut -d' ' -f 1)
+    if [ "${STATUS}" = '?' ]; then
+        abort "Confounded by status for title: ${TITLE}"
+    elif [ "${STATUS}" = '+' ]; then
+        STORING='DS'
+    elif [ "${STATUS}" = '+' ]; then
+        STORING=${STATUS}
+    fi
+    STORES=$(echo "${STORES}:${STORING}")
 }
-SYNC_DOWN=
-BOTHSIDED=
-for_line_in "${OVERVIEW_BOTH}" find_match
-if [ ! -z "${FOUND}" ]; then
-    BOTHSIDED=1
-fi
+HASH=
+TITLE=
+STATUS=
 for_line_in "${OVERVIEW_ONLY_REMOTE}" find_match
-if [ ! -z "${FOUND}" ]; then
-    SYNC_DOWN=1
-fi
+STATUS_REMOTE=${STATUS}
+STATUS=
 for_line_in "${OVERVIEW_ONLY_LOCAL}" find_match
-if [ -z "${FOUND}" ]; then
-    abort "No known hash starting with: ${SELECTION}"
-elif [ ! -z "${BOTHSIDED}" ]; then
-    abort 'Target present on both sides, nothing to do.'
+STATUS_LOCAL=${STATUS}
+if [ -z "${TITLE}" ]; then
+    abort 'No matching selectable found.'
 fi
-prefixed_msg_no_nl "Hash ${HASH} selected for "
-if [ -z "${SYNC_DOWN}" ]; then printf 'LOCAL'; else printf 'REMOTE'; fi
-printf ' media: %s\n' "${TITLE}"
+
+
+
+prefixed_msg "Selected hash, title: ${HASH} ${TITLE}"
+calc_what_to_sync() {
+    local STATUS_THIS=$1  # S
+    local STATUS_THAT=$2  # D
+    local SYNC=
+    if [ "${STATUS_THIS}" = '' ]; then
+        SYNC='+'
+    elif [ "${STATUS_THIS}" = 'D' ]; then
+        SYNC='S'
+    elif [ "${STATUS_THIS}" = 'S' ]; then
+        SYNC='D'
+    fi
+    if [ ! -z "${SYNC}" ] && [ '+' != "${STATUS_THAT}" ]; then
+        if [ -z "${STATUS_THAT}" ] || [ "${STATUS_THAT}" != "${SYNC}" ]; then
+            abort 'Not enough stored data on both sides for sync.'
+        fi
+    fi
+    echo "${SYNC}"
+}
+SYNC_UP=$(calc_what_to_sync "${STATUS_REMOTE}" "${STATUS_LOCAL}")
+SYNC_DOWN=$(calc_what_to_sync "${STATUS_LOCAL}" "${STATUS_REMOTE}")
+prefixed_msg_no_nl 'Task: '
+print_task() {
+    local SYNC=$1
+    local DIRECTION=$2
+    local TARGET='nothing'
+    if [ "${SYNC}" = '+' ]; then
+        TARGET='ALL'
+    elif [ "${SYNC}" = 'S' ]; then
+        TARGET='SESSION'
+    elif [ "${SYNC}" = 'D' ]; then
+        TARGET='CONTENT'
+    fi
+    printf '%sloading %s' "${DIRECTION}" "${TARGET}"
+
+}
+print_task "${SYNC_UP}" 'up'
+printf ', '
+print_task "${SYNC_DOWN}" 'down'
+printf '\n'
+
+
 
 TARGET_DIR="${LOCAL_STORE}/${TITLE}"
-if [ -z "${SYNC_DOWN}" ]; then
+if [ ! -z "${SYNC_UP}" ]; then
     prefixed_msg 'Uploading …'
     TMP_STORE=$(ssh -t -q "${SERVER}" "TMPDIR=~/tmp mktemp -d" | tr -d "\r")
-else
+    handle_subdir() {
+        local SUBDIR_LOCAL=$1
+        local SUBDIR_REMOTE=$2
+        local TMP_STORE_SUBDIR="${TMP_STORE}/${SUBDIR_LOCAL}"
+
+        local SUBDIR=$1
+        local TMP_STORE_SUBDIR="${TMP_STORE}/${SUBDIR}"
+        scp -r "${TARGET_DIR}/${SUBDIR_LOCAL}" "${SERVER}:${TMP_STORE}/"
+        ssh -t -q "${SERVER}" "mv -i ${TMP_STORE_SUBDIR}/* ~/${SUBDIR_REMOTE}/"
+        ssh -t -q "${SERVER}" "rmdir ${TMP_STORE_SUBDIR}"
+    }
+    if [ "${SYNC_UP}" = '+' -o "${SYNC_UP}" = 'D' ]; then
+        handle_subdir "${DIRNAME_DOWNLOAD}" "${DIRNAME_DOWNLOADS}"
+    fi
+    if [ "${SYNC_UP}" = '+' -o "${SYNC_UP}" = 'S' ]; then
+        handle_subdir "${DIRNAME_SESSION}" "${DIRNAME_SESSION}"
+    fi
+    ssh -t -q "${SERVER}" "rmdir ${TMP_STORE}"
+    ssh -t -q "${SERVER}" 'sh -cl kill_rtorrent'
+fi
+if [ ! -z "${SYNC_DOWN}" ]; then
     prefixed_msg 'Downloading …'
-    abort_if_exists "${TARGET_DIR}"
     TMP_STORE=$(mktemp -d)
     trapp "prefixed_msg 'With abortion, removing'${TMP_STORE}; rm -rf ${TMP_STORE}"
-fi
-TMP_STORE_DOWNLOAD="${TMP_STORE}/${DIRNAME_DOWNLOAD}"
-TMP_STORE_SESSION="${TMP_STORE}/${DIRNAME_SESSION}"
-if [ -z "${SYNC_DOWN}" ]; then
-    scp -r "${TARGET_DIR}/"* "${SERVER}:${TMP_STORE}/"
-    ssh -t -q "${SERVER}" "mv -i ${TMP_STORE_DOWNLOAD}/* ~/${DIRNAME_DOWNLOADS}/"
-    ssh -t -q "${SERVER}" "mv -i ${TMP_STORE_SESSION}/* ~/${DIRNAME_SESSION}/"
-    ssh -t -q "${SERVER}" "rmdir ${TMP_STORE_SESSION} && rmdir ${TMP_STORE_DOWNLOAD} && rmdir ${TMP_STORE}"
-    ssh -t -q "${SERVER}" 'sh -cl kill_rtorrent'
-else
-    mkdir "${TMP_STORE_SESSION}"
-    mkdir "${TMP_STORE_DOWNLOAD}"
-    scp "${SERVER}:~/${DIRNAME_SESSION}/${HASH}"* "${TMP_STORE_SESSION}/"
-    scp -r "${SERVER}:~/${DIRNAME_DOWNLOADS}/${TITLE}" "${TMP_STORE_DOWNLOAD}/"
-    prefixed_msg "Storing in: ${TARGET_DIR}"
-    mv -i "${TMP_STORE}" "${TARGET_DIR}"
+    handle_subdir() {
+        local SUBDIR_LOCAL=$1
+        local SUBDIR_REMOTE=$2
+        local TMP_STORE_SUBDIR="${TMP_STORE}/${SUBDIR_LOCAL}"
+        local TO_COPY_PATTERN=$3
+        local GLOB=$4
+        mkdir "${TMP_STORE_SUBDIR}"
+        scp -r "${SERVER}:~/${SUBDIR_REMOTE}/${TO_COPY_PATTERN}"${GLOB} "${TMP_STORE_SUBDIR}/"
+        if [ "${SYNC_DOWN}" != '+'  ]; then
+            mv -i "${TMP_STORE_SUBDIR}" "${TARGET_DIR}/"
+        fi
+    }
+    if [ "${SYNC_DOWN}" = '+' -o "${SYNC_DOWN}" = 'D' ]; then
+        handle_subdir "${DIRNAME_DOWNLOAD}" "${DIRNAME_DOWNLOADS}" "${TITLE}"
+    fi
+    if [ "${SYNC_DOWN}" = '+' -o "${SYNC_DOWN}" = 'S' ]; then
+        handle_subdir "${DIRNAME_SESSION}" "${DIRNAME_SESSION}"  "${HASH}" '*'
+    fi
+    if [ "${SYNC_DOWN}" = '+'  ]; then
+        mv -i "${TMP_STORE}" "${TARGET_DIR}"
+    fi
     trapp
 fi
+prefixed_msg 'Success!'
 
 prefixed_msg_exit