diff --git a/IRCClient/IRCBase.cpp b/IRCClient/IRCBase.cpp
index 3c85ff4..aa12c54 100644
--- a/IRCClient/IRCBase.cpp
+++ b/IRCClient/IRCBase.cpp
@@ -360,8 +360,8 @@ struct IRCBasePriv
 			else if (prefix.nickname() == nickname)
 				channels.erase(
 					std::find_if(channels.begin(), channels.end(),
-						[&channel](std::shared_ptr<IRCChannel> cptr) {
-							return channel == cptr->name();
+						[&channel](std::weak_ptr<IRCChannel> cptr) {
+							return channel == cptr.lock()->name();
 						}
 					));
 		}
@@ -1030,8 +1030,8 @@ void IRCBasePriv::parseIncoming(const std::string& line)
 		std::vector<std::string> channelsAffected;
 		auto member = super.getMember(sender.nickname());
 		const auto& chans = member->channels();
-		for (auto c : chans)
-			channelsAffected.push_back(c->name());
+		for (const auto& c : chans)
+			channelsAffected.push_back(c.lock()->name());
 
 		member->setNickname(msg);
 		super.onMsgNick(sender, msg, channelsAffected);
@@ -1084,9 +1084,9 @@ void IRCBasePriv::parseIncoming(const std::string& line)
         auto member = super.getMember(sender.nickname());
 		if (member) {
 			const auto& chans = member->channels();
-			for (auto c : chans) {
-				channelsAffected.push_back(c);
-                channelsAffectedStr.push_back(c->name());
+			for (const auto& c : chans) {
+				channelsAffected.push_back(c.lock());
+                channelsAffectedStr.push_back(c.lock()->name());
 			}
 
 			auto it = std::find(allMembers.begin(), allMembers.end(), member);
@@ -1277,9 +1277,10 @@ void IRCBasePriv::parseIncoming(const std::string& line)
 		auto member = super.getMember(sender.nickname());
 		if (member) {
 			const auto& chans = member->channels();
-			for (auto c : chans) {
-				channelsAffected.push_back(c->name());
-				c->delMember(member);
+			for (const auto& c : chans) {
+			    const auto cptr = c.lock();
+				channelsAffected.push_back(cptr->name());
+				cptr->delMember(member);
 			}
 		}
 		super.v3onMsgAway(sender, msg, channelsAffected);
diff --git a/IRCClient/IRCMember.cpp b/IRCClient/IRCMember.cpp
index 9fbc143..a9720d6 100644
--- a/IRCClient/IRCMember.cpp
+++ b/IRCClient/IRCMember.cpp
@@ -19,21 +19,29 @@ void IRCMember::setPrefix(const IRCPrefix& prefix)
 	m_prefix = prefix;
 }
 
-const std::vector<std::shared_ptr<IRCChannel>>& IRCMember::channels()
+const std::vector<std::weak_ptr<IRCChannel>>& IRCMember::channels()
 {
 	return m_channels;
 }
 
-void IRCMember::addChannel(std::shared_ptr<IRCChannel> channel)
+void IRCMember::addChannel(std::weak_ptr<IRCChannel> channel)
 {
-	auto it = std::find(m_channels.begin(), m_channels.end(), channel);
+	auto it = std::find_if(m_channels.begin(), m_channels.end(),
+        [channel](const std::weak_ptr<IRCChannel>& p){
+            return p.lock() == channel.lock();
+	    });
+
 	if (it == m_channels.end())
 		m_channels.emplace_back(channel);
 }
 
-void IRCMember::delChannel(std::shared_ptr<IRCChannel> channel)
+void IRCMember::delChannel(std::weak_ptr<IRCChannel> channel)
 {
-	auto newEnd = std::remove(m_channels.begin(), m_channels.end(), channel);
+	auto newEnd = std::remove_if(m_channels.begin(), m_channels.end(),
+         [channel](const std::weak_ptr<IRCChannel>& p){
+             return p.lock() == channel.lock();
+         });
+
 	m_channels.erase(newEnd, m_channels.end());
 }
 
diff --git a/IRCClient/IRCMember.h b/IRCClient/IRCMember.h
index 9a5b793..5443ac1 100644
--- a/IRCClient/IRCMember.h
+++ b/IRCClient/IRCMember.h
@@ -16,15 +16,15 @@ public:
 
 	const IRCPrefix& prefix() const;
 	void setPrefix(const IRCPrefix& prefix);
-	const std::vector<std::shared_ptr<IRCChannel>>& channels();
-	void addChannel(std::shared_ptr<IRCChannel> channel);
-	void delChannel(std::shared_ptr<IRCChannel> channel);
+	const std::vector<std::weak_ptr<IRCChannel>>& channels();
+	void addChannel(std::weak_ptr<IRCChannel> channel);
+	void delChannel(std::weak_ptr<IRCChannel> channel);
 
 	void setNickname(const std::string& nickname);
 
 private:
 	IRCPrefix m_prefix;
-	std::vector<std::shared_ptr<IRCChannel>> m_channels;
+	std::vector<std::weak_ptr<IRCChannel>> m_channels;
 };
 
 #endif // IRCMEMBER_H