diff --git a/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClient.kt b/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClient.kt
index b10993a..5b1df05 100644
--- a/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClient.kt
+++ b/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClient.kt
@@ -12,6 +12,8 @@ import org.membraneframework.rtc.models.RTCStats
 import org.membraneframework.rtc.utils.Metadata
 import org.webrtc.Logging
 
+typealias TrackContext = JellyfishTrackContext
+
 data class Config(
     val websocketUrl: String,
     val token: String,
diff --git a/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClientInternal.kt b/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClientInternal.kt
index 07c0aa4..f6f91cc 100644
--- a/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClientInternal.kt
+++ b/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClientInternal.kt
@@ -117,19 +117,23 @@ internal class JellyfishClientInternal(
     }
 
     override fun onTrackAdded(ctx: TrackContext) {
-        listener.onTrackAdded(ctx)
+        var trackContext = TrackContext(ctx)
+        listener.onTrackAdded(trackContext)
     }
 
     override fun onTrackReady(ctx: TrackContext) {
-        listener.onTrackReady(ctx)
+        var trackContext = TrackContext(ctx)
+        listener.onTrackReady(trackContext)
     }
 
     override fun onTrackRemoved(ctx: TrackContext) {
-        listener.onTrackRemoved(ctx)
+        var trackContext = TrackContext(ctx)
+        listener.onTrackRemoved(trackContext)
     }
 
     override fun onTrackUpdated(ctx: TrackContext) {
-        listener.onTrackUpdated(ctx)
+        var trackContext = TrackContext(ctx)
+        listener.onTrackUpdated(trackContext)
     }
 
     override fun onBandwidthEstimationChanged(estimation: Long) {
diff --git a/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClientListener.kt b/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClientListener.kt
index c4f3188..9b5551a 100644
--- a/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClientListener.kt
+++ b/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishClientListener.kt
@@ -1,7 +1,6 @@
 package com.jellyfishdev.jellyfishclient
 
 import okhttp3.Response
-import org.membraneframework.rtc.models.TrackContext
 import timber.log.Timber
 
 interface JellyfishClientListener {
diff --git a/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishTrackContext.kt b/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishTrackContext.kt
new file mode 100644
index 0000000..cf4db18
--- /dev/null
+++ b/JellyfishClient/src/main/java/com/jellyfishdev/jellyfishclient/JellyfishTrackContext.kt
@@ -0,0 +1,65 @@
+package com.jellyfishdev.jellyfishclient
+
+import org.membraneframework.rtc.TrackEncoding
+import org.membraneframework.rtc.media.RemoteTrack
+import org.membraneframework.rtc.models.EncodingReason
+import org.membraneframework.rtc.models.OnEncodingChangedListener
+import org.membraneframework.rtc.models.OnVoiceActivityChangedListener
+import org.membraneframework.rtc.models.TrackContext
+import org.membraneframework.rtc.models.VadStatus
+import org.membraneframework.rtc.utils.Metadata
+
+fun interface JellyfishOnVoiceActivityChangedListener {
+    fun onVoiceActivityChanged(trackContext: JellyfishTrackContext)
+}
+
+fun interface JellyfishOnEncodingChangedListener {
+    fun onEncodingChangedListener(trackContext: JellyfishTrackContext)
+}
+
+class JellyfishTrackContext(private val trackContext: TrackContext) {
+    val track: RemoteTrack?
+        get() {
+            return trackContext.track
+        }
+
+    val trackId: String
+        get() {
+            return trackContext.trackId
+        }
+
+    val peer: Peer
+        get() {
+            return trackContext.endpoint
+        }
+
+    val metadata: Metadata
+        get() {
+            return trackContext.metadata
+        }
+
+    val vadStatus: VadStatus
+        get() {
+            return trackContext.vadStatus
+        }
+
+    val encoding: TrackEncoding?
+        get() {
+            return trackContext.encoding
+        }
+
+    val encodingReason: EncodingReason?
+        get() {
+            return trackContext.encodingReason
+        }
+
+    fun setOnEncodingChangedListener(listener: JellyfishOnEncodingChangedListener) {
+        val rtcListener = OnEncodingChangedListener { trackContext -> listener.onEncodingChangedListener(JellyfishTrackContext(trackContext)) }
+        trackContext.setOnEncodingChangedListener(rtcListener)
+    }
+
+    fun setOnVoiceActivityChangedListener(listener: JellyfishOnVoiceActivityChangedListener) {
+        val rtcListener = OnVoiceActivityChangedListener { trackContext -> listener.onVoiceActivityChanged(JellyfishTrackContext(trackContext)) }
+        trackContext.setOnVoiceActivityChangedListener(rtcListener)
+    }
+}
diff --git a/app/src/main/java/com/example/jellyfishandroidexample/RoomViewModel.kt b/app/src/main/java/com/example/jellyfishandroidexample/RoomViewModel.kt
index dfc27eb..2ba21e5 100644
--- a/app/src/main/java/com/example/jellyfishandroidexample/RoomViewModel.kt
+++ b/app/src/main/java/com/example/jellyfishandroidexample/RoomViewModel.kt
@@ -7,13 +7,13 @@ import com.jellyfishdev.jellyfishclient.Config
 import com.jellyfishdev.jellyfishclient.JellyfishClient
 import com.jellyfishdev.jellyfishclient.JellyfishClientListener
 import com.jellyfishdev.jellyfishclient.Peer
+import com.jellyfishdev.jellyfishclient.TrackContext
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.launch
 import org.membraneframework.rtc.SimulcastConfig
 import org.membraneframework.rtc.media.LocalVideoTrack
 import org.membraneframework.rtc.media.RemoteVideoTrack
 import org.membraneframework.rtc.media.VideoParameters
-import org.membraneframework.rtc.models.TrackContext
 
 class RoomViewModel(application: Application) :
     AndroidViewModel(application),
@@ -90,14 +90,14 @@ class RoomViewModel(application: Application) :
 
     override fun onTrackReady(ctx: TrackContext) {
         viewModelScope.launch {
-            val participant = mutableParticipants[ctx.endpoint.id] ?: return@launch
+            val participant = mutableParticipants[ctx.peer.id] ?: return@launch
 
             val (id, newParticipant) = when (ctx.track) {
                 is RemoteVideoTrack -> {
                     globalToLocalTrackId[ctx.trackId] = (ctx.track as RemoteVideoTrack).id()
 
                     val p = participant.copy(videoTrack = ctx.track as RemoteVideoTrack)
-                    Pair(ctx.endpoint.id, p)
+                    Pair(ctx.peer.id, p)
                 }
 
                 else ->
@@ -112,7 +112,7 @@ class RoomViewModel(application: Application) :
 
     override fun onTrackRemoved(ctx: TrackContext) {
         viewModelScope.launch {
-            val participant = mutableParticipants[ctx.endpoint.id] ?: return@launch
+            val participant = mutableParticipants[ctx.peer.id] ?: return@launch
 
             val localTrackId = globalToLocalTrackId[ctx.trackId]
             val videoTrackId = participant.videoTrack?.id()
@@ -125,7 +125,7 @@ class RoomViewModel(application: Application) :
 
             globalToLocalTrackId.remove(ctx.trackId)
 
-            mutableParticipants[ctx.endpoint.id] = newParticipant
+            mutableParticipants[ctx.peer.id] = newParticipant
 
             emitParticipants()
         }
