diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c
index d054323f531b706e330e5ead48ce6ed6bea5bb9e..5df6dae0c60a5c1223ba4277c5aeddd98b38014b 100644
--- a/channels/chan_dahdi.c
+++ b/channels/chan_dahdi.c
@@ -7074,27 +7074,34 @@ static int dahdi_fixup(struct ast_channel *oldchan, struct ast_channel *newchan)
 {
 	struct dahdi_pvt *p = newchan->tech_pvt;
 	int x;
+
 	ast_mutex_lock(&p->lock);
+
 	ast_debug(1, "New owner for channel %d is %s\n", p->channel, newchan->name);
 	if (p->owner == oldchan) {
 		p->owner = newchan;
 	}
-	for (x = 0; x < 3; x++)
+	for (x = 0; x < 3; x++) {
 		if (p->subs[x].owner == oldchan) {
-			if (!x)
+			if (!x) {
 				dahdi_unlink(NULL, p, 0);
+			}
 			p->subs[x].owner = newchan;
 		}
+	}
 	if (analog_lib_handles(p->sig, p->radio, p->oprmode)) {
 		analog_fixup(oldchan, newchan, p->sig_pvt);
-	} 
-#ifdef HAVE_PRI
-	else if (dahdi_sig_pri_lib_handles(p->sig)) {
+#if defined(HAVE_PRI)
+	} else if (dahdi_sig_pri_lib_handles(p->sig)) {
 		sig_pri_fixup(oldchan, newchan, p->sig_pvt);
+#endif	/* defined(HAVE_PRI) */
+#if defined(HAVE_SS7)
+	} else if (p->sig == SIG_SS7) {
+		sig_ss7_fixup(oldchan, newchan, p->sig_pvt);
+#endif	/* defined(HAVE_SS7) */
 	}
-#endif
-
 	update_conf(p);
+
 	ast_mutex_unlock(&p->lock);
 
 	if (newchan->_state == AST_STATE_RINGING) {
diff --git a/channels/sig_ss7.c b/channels/sig_ss7.c
index f00e813a77cc2d64eab5457203d1764b65711b91..540b08e8186a49e6e26f31011a30a12acbc9b073 100644
--- a/channels/sig_ss7.c
+++ b/channels/sig_ss7.c
@@ -1434,6 +1434,23 @@ int sig_ss7_answer(struct sig_ss7_chan *p, struct ast_channel *ast)
 	return res;
 }
 
+/*!
+ * \brief Fix up a channel:  If a channel is consumed, this is called.  Basically update any ->owner links.
+ * \since 1.8
+ *
+ * \param oldchan Old channel pointer to replace.
+ * \param newchan New channel pointer to set.
+ * \param pchan Signaling private structure pointer.
+ *
+ * \return Nothing
+ */
+void sig_ss7_fixup(struct ast_channel *oldchan, struct ast_channel *newchan, struct sig_ss7_chan *pchan)
+{
+	if (pchan->owner == oldchan) {
+		pchan->owner = newchan;
+	}
+}
+
 /*!
  * \brief SS7 answer channel.
  * \since 1.8
diff --git a/channels/sig_ss7.h b/channels/sig_ss7.h
index 1080f5d8ed0c59fc2b7fa7c7fd501276d848d7b2..be7c1e5e8852f96afd756f8561882528594076b3 100644
--- a/channels/sig_ss7.h
+++ b/channels/sig_ss7.h
@@ -248,6 +248,7 @@ int sig_ss7_available(struct sig_ss7_chan *p);
 int sig_ss7_call(struct sig_ss7_chan *p, struct ast_channel *ast, char *rdest);
 int sig_ss7_hangup(struct sig_ss7_chan *p, struct ast_channel *ast);
 int sig_ss7_answer(struct sig_ss7_chan *p, struct ast_channel *ast);
+void sig_ss7_fixup(struct ast_channel *oldchan, struct ast_channel *newchan, struct sig_ss7_chan *pchan);
 int sig_ss7_indicate(struct sig_ss7_chan *p, struct ast_channel *chan, int condition, const void *data, size_t datalen);
 struct ast_channel *sig_ss7_request(struct sig_ss7_chan *p, enum sig_ss7_law law, const struct ast_channel *requestor, int transfercapability);
 void sig_ss7_chan_delete(struct sig_ss7_chan *doomed);