diff --git a/lustre/ChangeLog b/lustre/ChangeLog
index 32141756bec45e659a26a476f878e3f4bbae8b7e..b29653bf2ff1c18573ffe46e39873f87685d3605 100644
--- a/lustre/ChangeLog
+++ b/lustre/ChangeLog
@@ -38,6 +38,14 @@ tbd Sun Microsystems, Inc.
 	* Output of lfs quota has been made less detailed by default,
 	  old (verbose) output can be obtained by using -v option.
 
+Severity   : normal
+Bugzilla   : 16611
+Frequency  : on recovery
+Description: I/O failures after umount during fail back 
+Details    : if client reconnected to restarted server we need join to recovery
+             instead of find server handler is changed and process self eviction
+             with cancel all locks.
+
 Severity   : enhancement
 Bugzilla   : 16633
 Description: Update to RHEL5 kernel-2.6.18-92.1.10.el5.
diff --git a/lustre/ptlrpc/import.c b/lustre/ptlrpc/import.c
index 0986cc11e7d0e60a36a84b558333cf5e4eb77531..5d7252d781fad99980d7272947276cf722b47c26 100644
--- a/lustre/ptlrpc/import.c
+++ b/lustre/ptlrpc/import.c
@@ -705,19 +705,34 @@ static int ptlrpc_connect_interpret(struct ptlrpc_request *request,
                 if (memcmp(&imp->imp_remote_handle,
                            lustre_msg_get_handle(request->rq_repmsg),
                            sizeof(imp->imp_remote_handle))) {
+                        int level = msg_flags & MSG_CONNECT_RECOVERING ? D_HA :
+                                                                         D_WARNING;
+
+                        /* Bug 16611/14775: if server handle have changed,
+                         * that means some sort of disconnection happened.
+                         * If the server is not in recovery, that also means it
+                         * already erased all of our state because of previous
+                         * eviction. If it is in recovery - we are safe to
+                         * participate since we can reestablish all of our state
+                         * with server again */
+                        CDEBUG(level,"%s@%s changed server handle from "
+                                     LPX64" to "LPX64"%s \n" "but is still in recovery \n",
+                                     obd2cli_tgt(imp->imp_obd),
+                                     imp->imp_connection->c_remote_uuid.uuid,
+                                     imp->imp_remote_handle.cookie,
+                                     lustre_msg_get_handle(request->rq_repmsg)->
+                                                                        cookie,
+                                     (MSG_CONNECT_RECOVERING & msg_flags) ?
+                                         "but is still in recovery" : "");
 
-                        CWARN("%s@%s changed server handle from "
-                               LPX64" to "LPX64" - evicting.\n",
-                               obd2cli_tgt(imp->imp_obd),
-                               imp->imp_connection->c_remote_uuid.uuid,
-                               imp->imp_remote_handle.cookie,
-                               lustre_msg_get_handle(request->rq_repmsg)->
-                                         cookie);
                         imp->imp_remote_handle =
                                      *lustre_msg_get_handle(request->rq_repmsg);
 
-                        IMPORT_SET_STATE(imp, LUSTRE_IMP_EVICTED);
-                        GOTO(finish, rc = 0);
+                        if (!(MSG_CONNECT_RECOVERING & msg_flags)) {
+                                IMPORT_SET_STATE(imp, LUSTRE_IMP_EVICTED);
+                                GOTO(finish, rc = 0);
+                        }
+
                 } else {
                         CDEBUG(D_HA, "reconnected to %s@%s after partition\n",
                                obd2cli_tgt(imp->imp_obd),