diff --git a/src/freedombone b/src/freedombone
index 8542e108cb7d5c413c12f0ff71745f9dfe925255..a668cd3cead2e9cbb1029c167becd01d13231756 100755
--- a/src/freedombone
+++ b/src/freedombone
@@ -3819,7 +3819,7 @@ function backup_to_friends_servers {
       echo '        if [ $REMOTE_DOMAIN ]; then' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
       echo "            cd /home/$MY_USERNAME/.gnupg_fragments" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
       echo '            no_of_shares=$(ls -afq keyshare* | wc -l)' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
-      echo '            no_of_shares=$((no_of_fragments - 2))' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
+      echo '            no_of_shares=$((no_of_shares - 2))' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
       echo '            if [[ ${no_of_shares} > 0 ]]; then' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
       echo '                # Pick a share index based on the domain name' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
       echo '                # This ensures that the same share is always given to the same domain' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
diff --git a/src/freedombone-config b/src/freedombone-config
index 06be374236b6e0dd73748cd6e55591716c18574b..13efa82e54d25ebaa8470fca2baca9503c55f1a4 100755
--- a/src/freedombone-config
+++ b/src/freedombone-config
@@ -271,65 +271,136 @@ function interactive_gpg_from_remote {
   return 0
 }
 
+function reconstruct_key {
+    if [ ! -d /home/$MY_USERNAME/.gnupg_fragments ]; then
+        return
+    fi
+    cd /home/$MY_USERNAME/.gnupg_fragments
+    no_of_shares=$(ls -afq keyshare* | wc -l)
+    no_of_shares=$((no_of_shares - 2))
+    if [[ ${no_of_shares} < 4 ]]; then
+        dialog --title "Encryption keys" --msgbox 'Not enough fragments to reconstruct the key' 6 70
+        exit 7348
+    fi
+    gfcombine /home/$MY_USERNAME/.gnupg_fragments/keyshare*
+    if [ ! "$?" = "0" ]; then
+        dialog --title "Encryption keys" --msgbox 'Unable to reconstruct the key' 6 70
+        exit 7348
+    fi
+
+    KEYS_FILE=/home/$MY_USERNAME/.gnupg_fragments/keyshare.asc
+    if [ ! -f $KEYS_FILE ]; then
+        dialog --title "Encryption keys" --msgbox 'Unable to reconstruct the key' 6 70
+    fi
+
+    su -c "gpg --allow-secret-key-import --import $KEYS_FILE" - $MY_USERNAME
+    if [ ! "$?" = "0" ]; then
+        echo 'Unable to import gpg key'
+        shred -zu $KEYS_FILE
+        rm -rf /home/$MY_USERNAME/.tempgnupg
+        exit 9654
+    fi
+
+    dialog --title "Encryption keys" --msgbox 'Key has been reconstructed' 6 70
+}
+
 function interactive_gpg_from_usb {
-  dialog --title "Encryption keys" --msgbox 'Plug in a USB drive containing a copy of your .gnupg directory' 6 70
+  dialog --title "Encryption keys" --msgbox 'Plug in a USB drive containing a copy of your full key or key fragment' 6 70
 
-  if [[ $INSTALLING_ON_BBB == "yes" ]]; then
-      GPG_USB_DRIVE='/dev/sda1'
-      if [ ! -b $GPG_USB_DRIVE ]; then
-          dialog --title "Encryption keys" --msgbox 'No USB drive found' 6 30
-          exit 739836
-      fi
-  else
-      GPG_USB_DRIVE='/dev/sdb1'
-      if [ ! -b $GPG_USB_DRIVE ]; then
-          GPG_USB_DRIVE='/dev/sdc1'
+  GPG_LOADING="yes"
+  GPG_CTR=0
+  while [[ $GPG_LOADING == "yes" ]]
+  do
+      if [[ $INSTALLING_ON_BBB == "yes" ]]; then
+          GPG_USB_DRIVE='/dev/sda1'
           if [ ! -b $GPG_USB_DRIVE ]; then
-              GPG_USB_DRIVE='/dev/sdd1'
+              if [[ ${GPG_CTR} > 0 ]]; then
+                  reconstruct_key
+                  return 0
+              fi
+              dialog --title "Encryption keys" --msgbox 'No USB drive found' 6 30
+              exit 739836
+          fi
+      else
+          GPG_USB_DRIVE='/dev/sdb1'
+          if [ ! -b $GPG_USB_DRIVE ]; then
+              GPG_USB_DRIVE='/dev/sdc1'
               if [ ! -b $GPG_USB_DRIVE ]; then
-                  dialog --title "Encryption keys" --msgbox 'No USB drive found' 6 30
-                  exit 27852
+                  GPG_USB_DRIVE='/dev/sdd1'
+                  if [ ! -b $GPG_USB_DRIVE ]; then
+                      if [[ ${GPG_CTR} > 0 ]]; then
+                          reconstruct_key
+                          return 0
+                      fi
+                      dialog --title "Encryption keys" --msgbox 'No USB drive found' 6 30
+                      exit 27852
+                  fi
               fi
           fi
       fi
-  fi
 
-  GPG_USB_MOUNT='/mnt/usb'
-  umount -f $GPG_USB_MOUNT
-  if [ ! -d $GPG_USB_MOUNT ]; then
-      mkdir -p $GPG_USB_MOUNT
-  fi
+      GPG_USB_MOUNT='/mnt/usb'
+      umount -f $GPG_USB_MOUNT
+      if [ ! -d $GPG_USB_MOUNT ]; then
+          mkdir -p $GPG_USB_MOUNT
+      fi
 
-  if [ -f /dev/mapper/encrypted_usb ]; then
-      rm -rf /dev/mapper/encrypted_usb
-  fi
-  cryptsetup luksClose encrypted_usb
-  cryptsetup luksOpen $GPG_USB_DRIVE encrypted_usb
-  if [ "$?" = "0" ]; then
-      GPG_USB_DRIVE=/dev/mapper/encrypted_usb
-  fi
-  mount $GPG_USB_DRIVE $GPG_USB_MOUNT
-  if [ ! "$?" = "0" ]; then
-      dialog --title "Encryption keys" --msgbox "There was a problem mounting the USB drive to $GPG_USB_MOUNT" 6 70
-      rm -rf $GPG_USB_MOUNT
-      exit 74393
-  fi
+      if [ -f /dev/mapper/encrypted_usb ]; then
+          rm -rf /dev/mapper/encrypted_usb
+      fi
+      cryptsetup luksClose encrypted_usb
+      cryptsetup luksOpen $GPG_USB_DRIVE encrypted_usb
+      if [ "$?" = "0" ]; then
+          GPG_USB_DRIVE=/dev/mapper/encrypted_usb
+      fi
+      mount $GPG_USB_DRIVE $GPG_USB_MOUNT
+      if [ ! "$?" = "0" ]; then
+          if [[ ${GPG_CTR} > 0 ]]; then
+              rm -rf $GPG_USB_MOUNT
+              reconstruct_key
+              return 0
+          fi
+          dialog --title "Encryption keys" \
+                 --msgbox "There was a problem mounting the USB drive to $GPG_USB_MOUNT" 6 70
+          rm -rf $GPG_USB_MOUNT
+          exit 74393
+      fi
 
-  if [ ! -d $GPG_USB_MOUNT/.gnupg ]; then
-      dialog --title "Encryption keys" --msgbox "The directory $GPG_USB_MOUNT/.gnupg was not found" 6 70
-      umount $GPG_USB_MOUNT
-      rm -rf $GPG_USB_MOUNT
-      exit 723814
-  fi
+      if [ ! -d $GPG_USB_MOUNT/.gnupg ]; then
+          if [ ! -d $GPG_USB_MOUNT/.gnupg_fragments ]; then
+              if [[ ${GPG_CTR} > 0 ]]; then
+                  umount $GPG_USB_MOUNT
+                  rm -rf $GPG_USB_MOUNT
+                  reconstruct_key
+                  return 0
+              fi
+              dialog --title "Encryption keys" \
+                     --msgbox "The directory $GPG_USB_MOUNT/.gnupg or $GPG_USB_MOUNT/.gnupg_fragments was not found" 6 70
+              umount $GPG_USB_MOUNT
+              rm -rf $GPG_USB_MOUNT
+              exit 723814
+          fi
+      fi
 
-  cp -r $GPG_USB_MOUNT/.gnupg /home/$(grep 'MY_USERNAME' temp.cfg | awk -F '=' '{print $2}')
+      if [ -d $GPG_USB_MOUNT/.gnupg ]; then
+          cp -r $GPG_USB_MOUNT/.gnupg /home/$(grep 'MY_USERNAME' temp.cfg | awk -F '=' '{print $2}')
+          GPG_LOADING="no"
+      else
+          cp -r $GPG_USB_MOUNT/.gnupg_fragments /home/$(grep 'MY_USERNAME' temp.cfg | awk -F '=' '{print $2}')
+      fi
 
-  if [ -d $GPG_USB_MOUNT/.ssh ]; then
-      cp $GPG_USB_MOUNT/.ssh/* /home/$(grep 'MY_USERNAME' temp.cfg | awk -F '=' '{print $2}')/.ssh
-  fi
+      if [ -d $GPG_USB_MOUNT/.ssh ]; then
+          cp $GPG_USB_MOUNT/.ssh/* /home/$(grep 'MY_USERNAME' temp.cfg | awk -F '=' '{print $2}')/.ssh
+      fi
 
-  umount $GPG_USB_MOUNT
-  rm -rf $GPG_USB_MOUNT
+      umount $GPG_USB_MOUNT
+      rm -rf $GPG_USB_MOUNT
+      if [[ $GPG_LOADING == "yes" ]]; then
+          dialog --title "Encryption keys" \
+                 --msgbox "Now remove the USB drive. Insert the next drive containing a key fragment, or select Ok to finish" 6 70
+      fi
+      GPG_CTR=$((GPG_CTR + 1))
+  done
 }
 
 function interactive_gpg {
@@ -342,7 +413,7 @@ function interactive_gpg {
       dialog --backtitle "Freedombone Configuration" \
           --radiolist "GPG/PGP keys for your system:" 13 70 3 \
           1 "Generate new keys (new user)" on \
-          2 "Import keys from a USB drive" off \
+          2 "Import keys from USB drive/s" off \
           3 "Retrieve keys from friends servers" off 2> $data
       sel=$?
       case $sel in
@@ -354,7 +425,7 @@ function interactive_gpg {
           2) interactive_gpg_from_usb
              return;;
           3) interactive_gpg_from_remote
-			 if [ ! "$?" = "0" ]; then
+             if [ ! "$?" = "0" ]; then
                  GPG_CONFIGURED="no"
              fi;;
       esac
diff --git a/src/freedombone-recoverkey b/src/freedombone-recoverkey
index f90f6e0bc9521e21fb9f4d84879b875c1ccfe499..6d936a9ce649adcbd80270e4b8b4b0314b5ca7d1 100755
--- a/src/freedombone-recoverkey
+++ b/src/freedombone-recoverkey
@@ -117,7 +117,7 @@ if [ $FRIENDS_SERVERS_LIST ]; then
             fi
         fi
     done < $FRIENDS_SERVERS_LIST
-fi   
+fi
 
 # was a directory created?
 if [ ! -d $FRAGMENTS_DIR ]; then
@@ -154,13 +154,11 @@ su -c "gpg --allow-secret-key-import --import $KEYS_FILE" - $MY_USERNAME
 if [ ! "$?" = "0" ]; then
     echo 'Unable to import gpg key'
     shred -zu $KEYS_FILE
-    rm -rf /home/$MY_USERNAME/.tempgnupg
     exit 3682
 fi
 shred -zu $KEYS_FILE
 chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.gnupg
 chmod -R 600 /home/$MY_USERNAME/.gnupg
-rm -rf /home/$MY_USERNAME/.tempgnupg
 
 echo 'GPG key was recovered'