diff --git a/src/manager.cpp b/src/manager.cpp
index 9b5f19a88dce4508aa81f1ecc34c6a755ad80c44..760d6ba0416b5855a909dfbc428800950c028ef9 100644
--- a/src/manager.cpp
+++ b/src/manager.cpp
@@ -1268,10 +1268,7 @@ bool
 Manager::holdConference(const std::string& id)
 {
     if (auto conf = getConferenceFromID(id)) {
-        for (const auto &item : conf->getParticipantList())
-            onHoldCall(item);
-
-        conf->setState(Conference::State::HOLD);
+        conf->detach();
         emitSignal<DRing::CallSignal::ConferenceChanged>(conf->getConfID(), conf->getStateStr());
         return true;
     }
@@ -1292,6 +1289,8 @@ Manager::unHoldConference(const std::string& id)
             conf->setState(Conference::State::ACTIVE_ATTACHED);
             emitSignal<DRing::CallSignal::ConferenceChanged>(conf->getConfID(), conf->getStateStr());
             return true;
+        } else if (conf->getState() == Conference::State::ACTIVE_DETACHED) {
+            pimpl_->addMainParticipant(*conf);
         }
     }
     return false;