diff --git a/addons/chan_ooh323.c b/addons/chan_ooh323.c
index 8111b712ec3d4c1bce521defdbeb2e9feb82a758..52c0404a5f50c0db64e0e6753fb5c58eca9d263e 100644
--- a/addons/chan_ooh323.c
+++ b/addons/chan_ooh323.c
@@ -295,8 +295,6 @@ AST_MUTEX_DEFINE_STATIC(h323_reload_lock);
 static int usecnt = 0;
 AST_MUTEX_DEFINE_STATIC(usecnt_lock);
 
-AST_MUTEX_DEFINE_STATIC(ooh323c_cmd_lock);
-
 static long callnumber = 0;
 AST_MUTEX_DEFINE_STATIC(ooh323c_cn_lock);
 
@@ -696,7 +694,7 @@ static struct ast_channel *ooh323_request(const char *type, struct ast_format_ca
 			ooh323_destroy(p);
 			ast_mutex_unlock(&iflock);
 			return NULL;
-		} else if (gH323ep.gkClient && gH323ep.gkClient->state != GkClientRegistered) {
+		} else if (!gH323ep.gkClient || (gH323ep.gkClient && gH323ep.gkClient->state != GkClientRegistered)) {
 			ast_log(LOG_ERROR, "Gatekeeper client is configured but not registered\n");
 			*cause = AST_CAUSE_NORMAL_TEMPORARY_FAILURE;
 			return NULL;
@@ -751,7 +749,6 @@ static struct ast_channel *ooh323_request(const char *type, struct ast_format_ca
       		}
 
       		ast_mutex_unlock(&p->lock);
-      		ast_mutex_lock(&ooh323c_cmd_lock);
 		ast_cond_init(&p->rtpcond, NULL);
       		ooMakeCall(data, p->callToken, AST_MAX_EXTENSION, NULL);
 		ast_mutex_lock(&p->lock);
@@ -760,7 +757,6 @@ static struct ast_channel *ooh323_request(const char *type, struct ast_format_ca
 		}
 		ast_mutex_unlock(&p->lock);
 		ast_cond_destroy(&p->rtpcond);
-      		ast_mutex_unlock(&ooh323c_cmd_lock);
 	}
 
 	restart_monitor();
@@ -3505,6 +3501,9 @@ static char *handle_cli_ooh323_show_gk(struct ast_cli_entry *e, int cmd, struct
 	case GkClientFailed:
 		ast_cli(a->fd, "%-20s%s\n", "GK state:", "Failed");
 		break;
+	case GkClientStopped:
+		ast_cli(a->fd, "%-20s%s\n", "GK state:", "Shutdown");
+		break;
 	default:
 		break;
 	}
@@ -3946,6 +3945,13 @@ static void *do_monitor(void *data)
 			ast_verb(1, "Reloading H.323\n");
 			ooh323_do_reload();
 		}
+		if (gH323ep.gkClient && gH323ep.gkClient->state == GkClientStopped) {
+			ooGkClientDestroy();
+			ast_verb(0, "Restart stopped gatekeeper client\n");
+			ooGkClientInit(gRasGkMode, (gRasGkMode == RasUseSpecificGatekeeper) ? 
+									gGatekeeper : 0, 0);
+			ooGkClientStart(gH323ep.gkClient);
+		}
 
 		/* Check for interfaces needing to be killed */
 		ast_mutex_lock(&iflock);
diff --git a/addons/ooh323c/src/ooGkClient.c b/addons/ooh323c/src/ooGkClient.c
index 3aaaba774b9935afae2d1f82da44793724195bb5..af6a10bbd37c30dfbb3e682fd9cc84c52bb0d6b7 100644
--- a/addons/ooh323c/src/ooGkClient.c
+++ b/addons/ooh323c/src/ooGkClient.c
@@ -2851,13 +2851,13 @@ int ooGkClientHandleClientOrGkFailure(ooGkClient *pGkClient)
       {
          OOTRACEERR1("Error: Gatekeeper error detected. Closing GkClient as "
                      "Gk mode is UseSpecifcGatekeeper\n");
-         ooGkClientDestroy();
+	 pGkClient->state = GkClientStopped;
          return OO_FAILED;
       }
       else{
          OOTRACEERR1("Error: Gatekeeper error detected. Closing GkClient. NEED"
                     " to implement recovery by rediscovering another gk\n");
-         ooGkClientDestroy();
+	 pGkClient->state = GkClientStopped;
          return OO_FAILED;
       }
    }
diff --git a/addons/ooh323c/src/ooGkClient.h b/addons/ooh323c/src/ooGkClient.h
index e12b45a9621154b038298ebac0cd8d369fd54a0f..59230e9539d3845bd5dbe95f3db53a31f0db520f 100644
--- a/addons/ooh323c/src/ooGkClient.h
+++ b/addons/ooh323c/src/ooGkClient.h
@@ -108,7 +108,8 @@ enum OOGkClientState {
    GkClientRegistered, /* registered with gk */
    GkClientUnregistered,
    GkClientGkErr,/*Gk is not responding, in discover mode can look for new GK*/
-   GkClientFailed
+   GkClientFailed,
+   GkClientStopped
 };
    
 
diff --git a/addons/ooh323c/src/oochannels.c b/addons/ooh323c/src/oochannels.c
index f581d76f992bcf6d37c4e92cddf0d6146729b767..de85389100985e3bb72f4f9ae1f79f553ad5b0e3 100644
--- a/addons/ooh323c/src/oochannels.c
+++ b/addons/ooh323c/src/oochannels.c
@@ -603,11 +603,7 @@ int ooProcessFDSETsAndTimers
       if(gH323ep.gkClient->state == GkClientFailed ||
          gH323ep.gkClient->state == GkClientGkErr)
       {
-         if(ooGkClientHandleClientOrGkFailure(gH323ep.gkClient)!=OO_OK)
-         {
-            //ooStopMonitorCalls(); //Function calling ooProcessFDSETsAndTimers is responsible for this.
-            return OO_FAILED;
-         }
+         ooGkClientHandleClientOrGkFailure(gH323ep.gkClient);
       }
    }