Index: uspace/lib/riff/include/riff/chunk.h
===================================================================
--- uspace/lib/riff/include/riff/chunk.h	(revision 0ee3157bf2b87f9bff38e12dfecd8d9b3ec96139)
+++ uspace/lib/riff/include/riff/chunk.h	(revision 003c4139d7ad847545f542bf5da3be65eb920764)
@@ -48,11 +48,10 @@
 extern errno_t riff_write_uint32(riffw_t *, uint32_t);
 
-extern errno_t riff_ropen(const char *, riffr_t **);
+extern errno_t riff_ropen(const char *, riff_rchunk_t *, riffr_t **);
 extern errno_t riff_rclose(riffr_t *);
-extern errno_t riff_read_uint32(riffr_t *, uint32_t *);
-extern errno_t riff_rchunk_start(riffr_t *, riff_rchunk_t *);
-extern errno_t riff_rchunk_end(riffr_t *, riff_rchunk_t *);
-extern errno_t riff_rchunk_read(riffr_t *, riff_rchunk_t *, void *, size_t,
-    size_t *);
+extern errno_t riff_read_uint32(riff_rchunk_t *, uint32_t *);
+extern errno_t riff_rchunk_start(riff_rchunk_t *, riff_rchunk_t *);
+extern errno_t riff_rchunk_end(riff_rchunk_t *);
+extern errno_t riff_read(riff_rchunk_t *, void *, size_t, size_t *);
 
 #endif
Index: uspace/lib/riff/include/types/riff/chunk.h
===================================================================
--- uspace/lib/riff/include/types/riff/chunk.h	(revision 0ee3157bf2b87f9bff38e12dfecd8d9b3ec96139)
+++ uspace/lib/riff/include/types/riff/chunk.h	(revision 003c4139d7ad847545f542bf5da3be65eb920764)
@@ -43,6 +43,19 @@
 typedef uint32_t riff_cksize_t;
 
+/** RIFF writer */
+typedef struct {
+	FILE *f;
+	/** Chunk start offset */
+	long ckstart;
+} riffw_t;
+
+/** RIFF reader */
+typedef struct {
+	FILE *f;
+} riffr_t;
+
 /** RIFF chunk for reading */
 typedef struct {
+	riffr_t *riffr;
 	long ckstart;
 	riff_ckid_t ckid;
@@ -61,16 +74,4 @@
 	riff_cksize_t cksize;
 } riff_ckinfo_t;
-
-/** RIFF writer */
-typedef struct {
-	FILE *f;
-	/** Chunk start offset */
-	long ckstart;
-} riffw_t;
-
-/** RIFF reader */
-typedef struct {
-	FILE *f;
-} riffr_t;
 
 enum {
Index: uspace/lib/riff/src/chunk.c
===================================================================
--- uspace/lib/riff/src/chunk.c	(revision 0ee3157bf2b87f9bff38e12dfecd8d9b3ec96139)
+++ uspace/lib/riff/src/chunk.c	(revision 003c4139d7ad847545f542bf5da3be65eb920764)
@@ -117,5 +117,5 @@
 		return EIO;
 
-	wchunk->ckstart = pos;
+	wchunk->ckstart = pos + 2 * sizeof(uint32_t);
 
 	rc = riff_write_uint32(rw, ckid);
@@ -151,7 +151,7 @@
 		return EIO;
 
-	cksize = pos - wchunk->ckstart - 8;
-
-	if (fseek(rw->f, wchunk->ckstart + 4, SEEK_SET) < 0)
+	cksize = pos - wchunk->ckstart;
+
+	if (fseek(rw->f, wchunk->ckstart - 4, SEEK_SET) < 0)
 		return EIO;
 
@@ -190,4 +190,5 @@
  *
  * @param fname File name
+ * @param riffck Place to store root (RIFF) chunk
  * @param rrr   Place to store pointer to RIFF reader
  *
@@ -195,8 +196,11 @@
  *         file..
  */
-errno_t riff_ropen(const char *fname, riffr_t **rrr)
+errno_t riff_ropen(const char *fname, riff_rchunk_t *riffck, riffr_t **rrr)
 {
 	riffr_t *rr;
-	errno_t rc;
+	riff_rchunk_t fchunk;
+	long fsize;
+	errno_t rc;
+	int rv;
 
 	rr = calloc(1, sizeof(riffr_t));
@@ -211,4 +215,30 @@
 		goto error;
 	}
+
+	rv = fseek(rr->f, 0, SEEK_END);
+	if (rv < 0) {
+		rc = EIO;
+		goto error;
+	}
+
+	fsize = ftell(rr->f);
+	if (fsize < 0) {
+		rc = EIO;
+		goto error;
+	}
+
+	rv = fseek(rr->f, 0, SEEK_SET);
+	if (rv < 0) {
+		rc = EIO;
+		goto error;
+	}
+
+	fchunk.riffr = rr;
+	fchunk.ckstart = 0;
+	fchunk.cksize = fsize;
+
+	rc = riff_rchunk_start(&fchunk, riffck);
+	if (rc != EOK)
+		goto error;
 
 	*rrr = rr;
@@ -237,14 +267,17 @@
 /** Read uint32_t from RIFF file.
  *
- * @param rr RIFF reader
+ * @param rchunk RIFF chunk
  * @param v  Place to store value
  * @return EOK on success, EIO on error.
  */
-errno_t riff_read_uint32(riffr_t *rr, uint32_t *v)
+errno_t riff_read_uint32(riff_rchunk_t *rchunk, uint32_t *v)
 {
 	uint32_t vle;
-
-	if (fread(&vle, 1, sizeof(vle), rr->f) < sizeof(vle))
-		return EIO;
+	errno_t rc;
+	size_t nread;
+
+	rc = riff_read(rchunk, &vle, sizeof(vle), &nread);
+	if (rc != EOK)
+		return rc;
 
 	*v = uint32_t_le2host(vle);
@@ -254,15 +287,15 @@
 /** Start reading RIFF chunk.
  *
- * @param rr     RIFF reader
+ * @param parent Parent chunk
  * @param rchunk Pointer to chunk structure to fill in
  *
  * @return EOK on success, EIO on error.
  */
-errno_t riff_rchunk_start(riffr_t *rr, riff_rchunk_t *rchunk)
+errno_t riff_rchunk_start(riff_rchunk_t *parent, riff_rchunk_t *rchunk)
 {
 	errno_t rc;
 	long pos;
 
-	pos = ftell(rr->f);
+	pos = ftell(parent->riffr->f);
 	if (pos < 0) {
 		rc = EIO;
@@ -270,9 +303,10 @@
 	}
 
-	rchunk->ckstart = pos;
-	rc = riff_read_uint32(rr, &rchunk->ckid);
+	rchunk->riffr = parent->riffr;
+	rchunk->ckstart = pos + 8;
+	rc = riff_read_uint32(parent, &rchunk->ckid);
 	if (rc != EOK)
 		goto error;
-	rc = riff_read_uint32(rr, &rchunk->cksize);
+	rc = riff_read_uint32(parent, &rchunk->cksize);
 	if (rc != EOK)
 		goto error;
@@ -290,5 +324,5 @@
 static long riff_rchunk_get_end(riff_rchunk_t *rchunk)
 {
-	return rchunk->ckstart + 8 + rchunk->cksize;
+	return rchunk->ckstart + rchunk->cksize;
 }
 
@@ -313,16 +347,16 @@
  * Seek to the first byte after end of chunk.
  *
- * @param rr     RIFF reader
  * @param rchunk Chunk structure
  * @return EOK on success, EIO on error.
  */
-errno_t riff_rchunk_end(riffr_t *rr, riff_rchunk_t *rchunk)
+errno_t riff_rchunk_end(riff_rchunk_t *rchunk)
 {
 	long ckend;
 
 	ckend = riff_rchunk_get_ndpos(rchunk);
-	if (fseek(rr->f, ckend, SEEK_SET) < 0)
-		return EIO;
-
+	if (fseek(rchunk->riffr->f, ckend, SEEK_SET) < 0)
+		return EIO;
+
+	rchunk->riffr = NULL;
 	return EOK;
 }
@@ -334,6 +368,5 @@
  * of bytes read is returned in @a *nbytes (can even be 0).
  *
- * @param rr RIFF reader
- * @param rchunk RIFF chunk
+ * @param rchunk RIFF chunk for reading
  * @param buf Buffer to read to
  * @param bytes Number of bytes to read
@@ -343,6 +376,6 @@
  *         EIO on I/O error.
  */
-errno_t riff_rchunk_read(riffr_t *rr, riff_rchunk_t *rchunk, void *buf,
-    size_t bytes, size_t *nread)
+errno_t riff_read(riff_rchunk_t *rchunk, void *buf, size_t bytes,
+    size_t *nread)
 {
 	long pos;
@@ -350,5 +383,5 @@
 	long toread;
 
-	pos = ftell(rr->f);
+	pos = ftell(rchunk->riffr->f);
 	if (pos < 0)
 		return EIO;
@@ -364,5 +397,5 @@
 	}
 
-	*nread = fread(buf, 1, toread, rr->f);
+	*nread = fread(buf, 1, toread, rchunk->riffr->f);
 	if (*nread == 0)
 		return EIO;
Index: uspace/lib/riff/src/rwave.c
===================================================================
--- uspace/lib/riff/src/rwave.c	(revision 0ee3157bf2b87f9bff38e12dfecd8d9b3ec96139)
+++ uspace/lib/riff/src/rwave.c	(revision 003c4139d7ad847545f542bf5da3be65eb920764)
@@ -255,5 +255,5 @@
 	}
 
-	rc = riff_ropen(fname, &wr->rr);
+	rc = riff_ropen(fname, &wr->wave, &wr->rr);
 	if (rc != EOK) {
 		assert(rc == EIO || rc == ENOMEM);
@@ -261,11 +261,11 @@
 	}
 
-	rc = riff_rchunk_start(wr->rr, &wr->wave);
-	if (rc != EOK) {
-		assert(rc == EIO);
-		goto error;
-	}
-
-	rc = riff_read_uint32(wr->rr, &form_id);
+	if (wr->wave.ckid != CKID_RIFF) {
+		printf("Not RIFF file\n");
+		rc = ENOMEM;
+		goto error;
+	}
+
+	rc = riff_read_uint32(&wr->wave, &form_id);
 	if (rc != EOK) {
 		assert(rc == EIO);
@@ -279,5 +279,5 @@
 	}
 
-	rc = riff_rchunk_start(wr->rr, &fmt);
+	rc = riff_rchunk_start(&wr->wave, &fmt);
 	if (rc != EOK) {
 		assert(rc == EIO);
@@ -291,5 +291,5 @@
 	}
 
-	rc = riff_rchunk_read(wr->rr, &fmt, &wfmt, sizeof(rwave_fmt_t), &nread);
+	rc = riff_read(&fmt, &wfmt, sizeof(rwave_fmt_t), &nread);
 	if (rc != EOK) {
 		printf("error reading fmt chunk\n");
@@ -304,5 +304,5 @@
 	}
 
-	rc = riff_rchunk_end(wr->rr, &fmt);
+	rc = riff_rchunk_end(&fmt);
 	if (rc != EOK) {
 		assert(rc == EIO);
@@ -318,5 +318,5 @@
 	}
 
-	rc = riff_rchunk_start(wr->rr, &wr->data);
+	rc = riff_rchunk_start(&wr->wave, &wr->data);
 	if (rc != EOK) {
 		assert(rc == EIO);
@@ -353,5 +353,5 @@
 	errno_t rc;
 
-	rc = riff_rchunk_read(wr->rr, &wr->data, buf, bytes, nread);
+	rc = riff_read(&wr->data, buf, bytes, nread);
 	if (rc != EOK) {
 		assert(rc == EIO || rc == ELIMIT);
@@ -373,5 +373,5 @@
 	errno_t rc;
 
-	rc = riff_rchunk_end(wr->rr, &wr->wave);
+	rc = riff_rchunk_end(&wr->wave);
 	if (rc != EOK) {
 		assert(rc == EIO);
