diff --git a/channels/chan_zap.c b/channels/chan_zap.c
index 75dccf3d9cbd8fedd465fa91c3355c0eee97cf4c..e0a833b56f0b3e858e1b4bf0438ac16a3566050c 100644
--- a/channels/chan_zap.c
+++ b/channels/chan_zap.c
@@ -7925,7 +7925,7 @@ static inline int available(struct zt_pvt *p, int channelmatch, int groupmatch,
 	if (p->guardtime && (time(NULL) < p->guardtime)) 
 		return 0;
 
-	if (p->locallyblocked || p->remotelyblocked || !p->inservice)
+	if (p->locallyblocked || p->remotelyblocked)
 		return 0;
 		
 	/* If no owner definitely available */
@@ -8697,7 +8697,9 @@ static void *ss7_linkset(void *data)
 				}
 				p = linkset->pvts[chanpos];
 				ast_log(LOG_DEBUG, "Blocking CIC %d\n", e->blo.cic);
+				ast_mutex_lock(&p->lock);
 				p->remotelyblocked = 1;
+				ast_mutex_unlock(&p->lock);
 				isup_bla(linkset->ss7, e->blo.cic);
 				break;
 			case ISUP_EVENT_UBL:
@@ -8708,7 +8710,9 @@ static void *ss7_linkset(void *data)
 				}
 				p = linkset->pvts[chanpos];
 				ast_log(LOG_DEBUG, "Unblocking CIC %d\n", e->ubl.cic);
+				ast_mutex_lock(&p->lock);
 				p->remotelyblocked = 0;
+				ast_mutex_unlock(&p->lock);
 				isup_uba(linkset->ss7, e->ubl.cic);
 				break;
 			case ISUP_EVENT_CON:
@@ -11471,6 +11475,7 @@ static int handle_ss7_block_cic(int fd, int argc, char *argv[])
 static int handle_ss7_unblock_cic(int fd, int argc, char *argv[])
 {
 	int linkset, cic;
+	int i, blocked = -1;
 	if (argc == 5)
 		linkset = atoi(argv[3]);
 	else
@@ -11493,10 +11498,22 @@ static int handle_ss7_unblock_cic(int fd, int argc, char *argv[])
 		return RESULT_SUCCESS;
 	}
 
-	ast_mutex_lock(&linksets[linkset-1].lock);
-	isup_ubl(linksets[linkset-1].ss7, cic);
-	ast_mutex_unlock(&linksets[linkset-1].lock);
-	ast_cli(fd, "Sent blocking request for linkset %d on CIC %d\n", linkset, cic);
+	for (i = 0; i < linksets[linkset-1].numchans; i++) {
+		if (linksets[linkset-1].pvts[i]->cic == cic) {
+			blocked = linksets[linkset-1].pvts[i]->locallyblocked;
+			if (blocked) {
+				ast_mutex_lock(&linksets[linkset-1].pvts[i]->lock);
+				linksets[linkset-1].pvts[i]->locallyblocked = 0;
+				ast_mutex_unlock(&linksets[linkset-1].pvts[i]->lock);
+				ast_mutex_lock(&linksets[linkset-1].lock);
+				isup_ubl(linksets[linkset-1].ss7, cic);
+				ast_mutex_unlock(&linksets[linkset-1].lock);
+			}
+		}
+	}
+
+	if (blocked > 0)
+		ast_cli(fd, "Sent unblocking request for linkset %d on CIC %d\n", linkset, cic);
 	return RESULT_SUCCESS;
 }