diff --git a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/AbstractBufferStream.java b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/AbstractBufferStream.java
index 5aa7dfe16910c9aed8396d0c0bddc7e139f9db0b..24cd087eba52af1ad09fc96ede6ab4c40ba450cf 100644
--- a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/AbstractBufferStream.java
+++ b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/AbstractBufferStream.java
@@ -22,7 +22,7 @@
  *
  * @author Lyubomir Marinov
  */
-abstract class AbstractBufferStream
+abstract class AbstractBufferStream<T extends DataSource>
     extends AbstractControls
     implements SourceStream
 {
@@ -44,7 +44,7 @@ abstract class AbstractBufferStream
      * The <tt>DataSource</tt> which has created this instance and which
      * contains it as one of its <tt>streams</tt>.
      */
-    protected final DataSource dataSource;
+    protected final T dataSource;
 
     /**
      * The <tt>FormatControl</tt> which gives access to the <tt>Format</tt> of
@@ -63,9 +63,7 @@ abstract class AbstractBufferStream
      * @param formatControl the <tt>FormatControl</tt> which is to abstract the
      * <tt>Format</tt>-related information of the new instance
      */
-    protected AbstractBufferStream(
-            DataSource dataSource,
-            FormatControl formatControl)
+    protected AbstractBufferStream(T dataSource, FormatControl formatControl)
     {
         this.dataSource = dataSource;
         this.formatControl = formatControl;
diff --git a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/AbstractPullBufferStream.java b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/AbstractPullBufferStream.java
index 57d4dd3b0592a706d636013b201e490f28d5d011..a5abed76eecfc91717603175a31f7c31ce4ada86 100644
--- a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/AbstractPullBufferStream.java
+++ b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/AbstractPullBufferStream.java
@@ -17,8 +17,8 @@
  *
  * @author Lyubomir Marinov
  */
-public abstract class AbstractPullBufferStream
-    extends AbstractBufferStream
+public abstract class AbstractPullBufferStream<T extends PullBufferDataSource>
+    extends AbstractBufferStream<T>
     implements PullBufferStream
 {
 
@@ -33,7 +33,7 @@ public abstract class AbstractPullBufferStream
      * <tt>Format</tt>-related information of the new instance
      */
     protected AbstractPullBufferStream(
-            PullBufferDataSource dataSource,
+            T dataSource,
             FormatControl formatControl)
     {
         super(dataSource, formatControl);
diff --git a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/AbstractPushBufferStream.java b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/AbstractPushBufferStream.java
index d612af3bd1a0580c19c7225e15ef9e64a541d014..7017bf7586951cccc7d5b2cf96dda169a6c85bf2 100644
--- a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/AbstractPushBufferStream.java
+++ b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/AbstractPushBufferStream.java
@@ -16,8 +16,8 @@
  *
  * @author Lyubomir Marinov
  */
-public abstract class AbstractPushBufferStream
-    extends AbstractBufferStream
+public abstract class AbstractPushBufferStream<T extends PushBufferDataSource>
+    extends AbstractBufferStream<T>
     implements PushBufferStream
 {
 
@@ -38,7 +38,7 @@ public abstract class AbstractPushBufferStream
      * <tt>Format</tt>-related information of the new instance
      */
     protected AbstractPushBufferStream(
-            PushBufferDataSource dataSource,
+            T dataSource,
             FormatControl formatControl)
     {
         super(dataSource, formatControl);
diff --git a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/AbstractVideoPullBufferStream.java b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/AbstractVideoPullBufferStream.java
index 81fc07aef1c92eb9a702d145df61476f59ecf7bb..eb59afc9bf39dcc6c4c90ba850c8c36ad71706b7 100644
--- a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/AbstractVideoPullBufferStream.java
+++ b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/AbstractVideoPullBufferStream.java
@@ -20,7 +20,8 @@
  * @author Lyubomir Marinov
  */
 public abstract class AbstractVideoPullBufferStream
-    extends AbstractPullBufferStream
+        <T extends PullBufferDataSource>
+    extends AbstractPullBufferStream<T>
 {
 
     /**
@@ -53,7 +54,7 @@ public abstract class AbstractVideoPullBufferStream
      * <tt>Format</tt>-related information of the new instance
      */
     protected AbstractVideoPullBufferStream(
-            PullBufferDataSource dataSource,
+            T dataSource,
             FormatControl formatControl)
     {
         super(dataSource, formatControl);
diff --git a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/directshow/DataSource.java b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/directshow/DataSource.java
index 8856d64de539814ffb66468a8839cd394675369f..8a97a6570d146623eaa59e9d95e17d21f864727e 100644
--- a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/directshow/DataSource.java
+++ b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/directshow/DataSource.java
@@ -178,7 +178,7 @@ public float setFrameRate(float frameRate)
      * @see AbstractPushBufferCaptureDevice#createStream(int, FormatControl)
      */
     @Override
-    protected AbstractPushBufferStream createStream(
+    protected DirectShowStream createStream(
             int streamIndex,
             FormatControl formatControl)
     {
diff --git a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/directshow/DirectShowStream.java b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/directshow/DirectShowStream.java
index 1bd07fb1eab982001c3eaa08dcdc618642f1164e..77c5143bed5ce97f8950aec8ac6fd35a6af86b80 100644
--- a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/directshow/DirectShowStream.java
+++ b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/directshow/DirectShowStream.java
@@ -24,7 +24,7 @@
  * @author Sebastien Vincent
  */
 public class DirectShowStream
-    extends AbstractPushBufferStream
+    extends AbstractPushBufferStream<DataSource>
 {
     /**
      * The <tt>Logger</tt> used by the <tt>DirectShowStream</tt> class and its
diff --git a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/imgstreaming/DataSource.java b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/imgstreaming/DataSource.java
index 720d9fc8782908c2715cafea46876122bd505034..e601c011ea9285522be6d3d5e40f8fcd6abd1266 100644
--- a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/imgstreaming/DataSource.java
+++ b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/imgstreaming/DataSource.java
@@ -88,7 +88,7 @@ public DataSource(MediaLocator locator)
      * @see AbstractPullBufferCaptureDevice#createStream(int, FormatControl)
      */
     @Override
-    protected AbstractPullBufferStream createStream(
+    protected ImageStream createStream(
             int streamIndex,
             FormatControl formatControl)
     {
diff --git a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/imgstreaming/ImageStream.java b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/imgstreaming/ImageStream.java
index 478ae8481fc4157521c207739ea114ef9a8f9f0b..9ce0a69d2f15c8da7029086862f5ea71d9bcb186 100644
--- a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/imgstreaming/ImageStream.java
+++ b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/imgstreaming/ImageStream.java
@@ -28,7 +28,7 @@
  * @author Damian Minkov
  */
 public class ImageStream
-    extends AbstractVideoPullBufferStream
+    extends AbstractVideoPullBufferStream<DataSource>
 {
     /**
      * The <tt>Logger</tt> used by the <tt>ImageStream</tt> class and its
diff --git a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/portaudio/DataSource.java b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/portaudio/DataSource.java
index 51860b32aebe4752fc7012e5dbed615417a2f95b..e598f13c68f6d32bd4ddb9a45fda8215a5d46aa6 100644
--- a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/portaudio/DataSource.java
+++ b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/portaudio/DataSource.java
@@ -108,7 +108,7 @@ public DataSource(
      * @see AbstractPullBufferCaptureDevice#createStream(int, FormatControl)
      */
     @Override
-    protected AbstractPullBufferStream createStream(
+    protected PortAudioStream createStream(
             int streamIndex,
             FormatControl formatControl)
     {
diff --git a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/portaudio/PortAudioStream.java b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/portaudio/PortAudioStream.java
index cfcbb3ba48de9e423be34f6940ce22170d5d17b9..5b7a149a7aee74000c5c6838eaf435887b34d487 100644
--- a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/portaudio/PortAudioStream.java
+++ b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/portaudio/PortAudioStream.java
@@ -28,7 +28,7 @@
  * @author Lyubomir Marinov
  */
 public class PortAudioStream
-    extends AbstractPullBufferStream
+    extends AbstractPullBufferStream<DataSource>
 {
     /**
      * The <tt>Logger</tt> used by the <tt>PortAudioStream</tt> class and its
diff --git a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/pulseaudio/DataSource.java b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/pulseaudio/DataSource.java
index 5f3b9120a2314a0b3795e79536abae3fd451dede..13b11bcc2c33c397851e4a2350c48c5d20473455 100644
--- a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/pulseaudio/DataSource.java
+++ b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/pulseaudio/DataSource.java
@@ -82,7 +82,7 @@ public class DataSource
      * API/library.
      */
     private class PulseAudioStream
-        extends AbstractPullBufferStream
+        extends AbstractPullBufferStream<DataSource>
     {
         private byte[] buffer;
 
@@ -608,7 +608,7 @@ public DataSource()
      * {@inheritDoc}
      */
     @Override
-    protected AbstractPullBufferStream createStream(
+    protected PulseAudioStream createStream(
             int streamIndex,
             FormatControl formatControl)
     {
diff --git a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/quicktime/DataSource.java b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/quicktime/DataSource.java
index 01ceb387f11a88a10cd01dc2b2d338754da1291b..adbeac7147c118fdcaac947c4644ac9c357d98d5 100644
--- a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/quicktime/DataSource.java
+++ b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/quicktime/DataSource.java
@@ -193,7 +193,7 @@ public float setFrameRate(float frameRate)
      * @see AbstractPushBufferCaptureDevice#createStream(int, FormatControl)
      */
     @Override
-    protected AbstractPushBufferStream createStream(
+    protected QuickTimeStream createStream(
             int streamIndex,
             FormatControl formatControl)
     {
diff --git a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/quicktime/QuickTimeStream.java b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/quicktime/QuickTimeStream.java
index 44dc514ff6dd1dc0f48fa0e4a8afd4c9482afcf1..9a26dd4f8305a6f80f191fb97f132c15e1528266 100644
--- a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/quicktime/QuickTimeStream.java
+++ b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/quicktime/QuickTimeStream.java
@@ -26,7 +26,7 @@
  * @author Lyubomir Marinov
  */
 public class QuickTimeStream
-    extends AbstractPushBufferStream
+    extends AbstractPushBufferStream<DataSource>
 {
 
     /**
diff --git a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/video4linux2/Video4Linux2Stream.java b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/video4linux2/Video4Linux2Stream.java
index a9ec5eea7d576f60dbdfe0712d24113866a9d746..2894aaebf017be09a09c34463c9d394a9bd96c5a 100644
--- a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/video4linux2/Video4Linux2Stream.java
+++ b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/video4linux2/Video4Linux2Stream.java
@@ -25,7 +25,7 @@
  * @author Lyubomir Marinov
  */
 public class Video4Linux2Stream
-    extends AbstractVideoPullBufferStream
+    extends AbstractVideoPullBufferStream<DataSource>
 {
     /**
      * The <tt>AVCodecContext</tt> of the MJPEG decoder.
diff --git a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/wasapi/WASAPIStream.java b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/wasapi/WASAPIStream.java
index 3321155b742901e785c6d0ceafb2e08a55632fd3..c60e837d28601cd7b6b7d961e9535d857c1c6168 100644
--- a/src/org/jitsi/impl/neomedia/jmfext/media/protocol/wasapi/WASAPIStream.java
+++ b/src/org/jitsi/impl/neomedia/jmfext/media/protocol/wasapi/WASAPIStream.java
@@ -30,7 +30,7 @@
  * @author Lyubomir Marinov
  */
 public class WASAPIStream
-    extends AbstractPushBufferStream
+    extends AbstractPushBufferStream<DataSource>
 {
     /**
      * The default duration of the audio data in milliseconds to be read from
diff --git a/src/org/jitsi/impl/neomedia/protocol/FakePushBufferDataSource.java b/src/org/jitsi/impl/neomedia/protocol/FakePushBufferDataSource.java
index 62aa6ed326791512b92976797666cbef3e0da146..54657e3287f4e3c6fd11103b2c54ad8fd392414b 100644
--- a/src/org/jitsi/impl/neomedia/protocol/FakePushBufferDataSource.java
+++ b/src/org/jitsi/impl/neomedia/protocol/FakePushBufferDataSource.java
@@ -81,7 +81,7 @@ public void connect()
      * information abstracted by the specified <tt>formatControl</tt>
      */
     @Override
-    protected AbstractPushBufferStream createStream(
+    protected FakePushBufferStream createStream(
             int streamIndex,
             FormatControl formatControl)
     {
@@ -176,7 +176,7 @@ public void stop()
      * <tt>FakePushBufferDataSource</tt>.
      */
     private static class FakePushBufferStream
-        extends AbstractPushBufferStream
+        extends AbstractPushBufferStream<FakePushBufferDataSource>
     {
         /**
          * Initializes a new <tt>FakePushBufferStream</tt> instance which is to