diff --git a/src/org/jitsi/impl/neomedia/MediaStreamImpl.java b/src/org/jitsi/impl/neomedia/MediaStreamImpl.java
index 89a61339775b5bea70f8ee43db9deab85ca10588..83597e6779cd9a78bb004300769ad799e4ac68f1 100644
--- a/src/org/jitsi/impl/neomedia/MediaStreamImpl.java
+++ b/src/org/jitsi/impl/neomedia/MediaStreamImpl.java
@@ -315,6 +315,8 @@ public MediaStreamImpl(
                             .createSrtpControl(SrtpControlType.ZRTP)
                     : srtpControl;
 
+        this.srtpControl.registerUser(this);
+
         if (connector != null)
             setConnector(connector);
 
@@ -610,7 +612,7 @@ public void close()
         stop();
         closeSendStreams();
 
-        srtpControl.cleanup();
+        srtpControl.cleanup(this);
 
         if (csrcEngine != null)
         {
diff --git a/src/org/jitsi/impl/neomedia/transform/dtls/DtlsControlImpl.java b/src/org/jitsi/impl/neomedia/transform/dtls/DtlsControlImpl.java
index ef0bf06a042e9d2d999de73d8dfdcf01449df71e..c9cc03b4683a4843adaaecf2741f3ba5c1ac51d2 100644
--- a/src/org/jitsi/impl/neomedia/transform/dtls/DtlsControlImpl.java
+++ b/src/org/jitsi/impl/neomedia/transform/dtls/DtlsControlImpl.java
@@ -391,7 +391,7 @@ private static String toHex(byte[] fingerprint)
 
     /**
      * The indicator which determines whether this instance has been disposed
-     * i.e. prepared for garbage collection by {@link #cleanup()}.
+     * i.e. prepared for garbage collection by {@link #doCleanup()}.
      */
     private boolean disposed = false;
 
@@ -430,6 +430,12 @@ private static String toHex(byte[] fingerprint)
      */
     private Setup setup;
 
+    /**
+     * The instances currently registered as users of this <tt>SrtpControl</tt>
+     * (through {@link #registerUser(Object)}).
+     */
+    private final Set<Object> users = new HashSet<Object>();
+
     /**
      * Initializes a new <tt>DtlsControlImpl</tt> instance.
      */
@@ -469,12 +475,11 @@ public DtlsControlImpl(boolean disableSRTP)
     }
 
     /**
-     * {@inheritDoc}
+     * Prepares this <tt>DtlsControlImpl</tt> for garbage collection.
      */
-    @Override
-    public void cleanup()
+    private void doCleanup()
     {
-        super.cleanup();
+        super.cleanup(null);
 
         setConnector(null);
 
@@ -485,6 +490,19 @@ public void cleanup()
         }
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void cleanup(Object user)
+    {
+        synchronized (users)
+        {
+            if (users.remove(user) && users.isEmpty())
+                doCleanup();
+        }
+    }
+
     /**
      * Initializes a new <tt>DtlsTransformEngine</tt> instance to be associated
      * with and used by this <tt>DtlsControlImpl</tt> instance.
@@ -786,4 +804,17 @@ public void setRtcpmux(boolean rtcpmux)
                 transformEngine.setRtcpmux(rtcpmux);
         }
     }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void registerUser(Object user)
+    {
+        synchronized (users)
+        {
+            users.add(user);
+        }
+    }
+
 }
diff --git a/src/org/jitsi/impl/neomedia/transform/zrtp/ZrtpControlImpl.java b/src/org/jitsi/impl/neomedia/transform/zrtp/ZrtpControlImpl.java
index 79f7414b1c63707ad85712c2ed972855705fee19..b048a59602b0ef3563476beee35f48b88651e99b 100644
--- a/src/org/jitsi/impl/neomedia/transform/zrtp/ZrtpControlImpl.java
+++ b/src/org/jitsi/impl/neomedia/transform/zrtp/ZrtpControlImpl.java
@@ -58,9 +58,10 @@ public ZrtpControlImpl()
     /**
      * Cleans up the current zrtp control and its engine.
      */
-    public void cleanup()
+    @Override
+    public void cleanup(Object user)
     {
-        super.cleanup();
+        super.cleanup(user);
 
         zrtpConnector = null;
     }
diff --git a/src/org/jitsi/service/neomedia/AbstractSrtpControl.java b/src/org/jitsi/service/neomedia/AbstractSrtpControl.java
index 4f248c7281178732742a80ce205b001fe3bf2715..f25e520ddb8aa3c4304beedd21b2785e6085efc2 100644
--- a/src/org/jitsi/service/neomedia/AbstractSrtpControl.java
+++ b/src/org/jitsi/service/neomedia/AbstractSrtpControl.java
@@ -47,7 +47,8 @@ protected AbstractSrtpControl(SrtpControlType srtpControlType)
      * The implementation of <tt>AbstractSrtpControl</tt> cleans up its
      * associated <tt>TransformEngine</tt> (if any).
      */
-    public void cleanup()
+    @Override
+    public void cleanup(Object user)
     {
         if (transformEngine != null)
         {
@@ -118,4 +119,11 @@ public void setSrtpListener(SrtpListener srtpListener)
     {
         this.srtpListener = srtpListener;
     }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void registerUser(Object user)
+    {
+    }
 }
diff --git a/src/org/jitsi/service/neomedia/SrtpControl.java b/src/org/jitsi/service/neomedia/SrtpControl.java
index 86e34d1aaf5d9f0ae3bd0f9bee4d0e7bc8cbb926..481846468348f451207b45549d570f0f45b28b76 100644
--- a/src/org/jitsi/service/neomedia/SrtpControl.java
+++ b/src/org/jitsi/service/neomedia/SrtpControl.java
@@ -39,8 +39,9 @@ public interface TransformEngine
 
     /**
      * Cleans up this <tt>SrtpControl</tt> and its <tt>TransformEngine</tt>.
+     * @param user the instance which requests the clean up.
      */
-    public void cleanup();
+    public void cleanup(Object user);
 
     /**
      * Gets the default secure/insecure communication status for the supported
@@ -119,4 +120,11 @@ public interface TransformEngine
      * @param mediaType the media type of the stream this control controls.
      */
     public void start(MediaType mediaType);
+
+    /**
+     * Registers <tt>user</tt> as an instance which is currently using this
+     * <tt>SrtpControl</tt>.
+     * @param user
+     */
+    public void registerUser(Object user);
 }