diff --git a/src/header/stdio/internal.rs b/src/header/stdio/internal.rs
deleted file mode 100644
index 7a7f79733e5917a5455fcad8cc5892135237a3ea..0000000000000000000000000000000000000000
--- a/src/header/stdio/internal.rs
+++ /dev/null
@@ -1,31 +0,0 @@
-//use super::{constants, FILE};
-//use platform::types::*;
-//
-//pub fn ftello(stream: &mut FILE) -> off_t {
-//    let pos = stream.seek(
-//        0,
-//        if let Some((wbase, wpos, _)) = stream.write {
-//            if (stream.flags & constants::F_APP > 0) && wpos > wbase {
-//                constants::SEEK_END
-//            } else {
-//                constants::SEEK_CUR
-//            }
-//        } else {
-//            constants::SEEK_CUR
-//        },
-//    );
-//    if pos < 0 {
-//        return pos;
-//    }
-//    let rdiff = if let Some((rpos, rend)) = stream.read {
-//        rend - rpos
-//    } else {
-//        0
-//    };
-//    let wdiff = if let Some((wbase, wpos, _)) = stream.write {
-//        wpos - wbase
-//    } else {
-//        0
-//    };
-//    pos - rdiff as i64 + wdiff as i64
-//}
diff --git a/src/header/stdio/mod.rs b/src/header/stdio/mod.rs
index b1ebd5aad87254f910f8b80b1b0564c73cca57ab..789aaee96125614abd3fb42b6c16d8cf9ddd550c 100644
--- a/src/header/stdio/mod.rs
+++ b/src/header/stdio/mod.rs
@@ -16,7 +16,7 @@ use header::errno::{self, STR_ERROR};
 use header::fcntl;
 use header::stdlib::mkstemp;
 use header::string::strlen;
-use io::{self, BufRead, LineWriter, Read, Write};
+use io::{self, BufRead, LineWriter, SeekFrom, Read, Write};
 use platform::types::*;
 use platform::{Pal, Sys};
 use platform::{errno, WriteByte};
@@ -33,8 +33,6 @@ mod constants;
 
 mod helpers;
 
-mod internal;
-
 enum Buffer<'a> {
     Borrowed(&'a mut [u8]),
     Owned(Vec<u8>)
@@ -233,19 +231,16 @@ pub extern "C" fn fgetc(stream: *mut FILE) -> c_int {
 }
 
 /// Get the position of the stream and store it in pos
-// #[no_mangle]
-pub extern "C" fn fgetpos(stream: *mut FILE, pos: Option<&mut fpos_t>) -> c_int {
-    unimplemented!()
-    //let off = internal::ftello(stream);
-    //if off < 0 {
-    //    return -1;
-    //}
-    //if let Some(pos) = pos {
-    //    *pos = off;
-    //    0
-    //} else {
-    //    -1
-    //}
+#[no_mangle]
+pub extern "C" fn fgetpos(stream: *mut FILE, pos: *mut fpos_t) -> c_int {
+    let off = ftello(stream);
+    if off < 0 {
+        return -1;
+    }
+    unsafe {
+        *pos = off;
+    }
+    0
 }
 
 /// Get a string from the stream
@@ -489,18 +484,21 @@ pub unsafe extern "C" fn fsetpos(stream: *mut FILE, pos: *const fpos_t) -> c_int
 }
 
 /// Get the current position of the cursor in the file
-// #[no_mangle]
+#[no_mangle]
 pub extern "C" fn ftell(stream: *mut FILE) -> c_long {
-    unimplemented!();
-    // ftello(stream) as c_long
+    ftello(stream) as c_long
 }
 
 /// Get the current position of the cursor in the file
-// #[no_mangle]
-pub extern "C" fn ftello(stream: &mut FILE) -> off_t {
-    unimplemented!();
-    // let mut stream = stream.lock();
-    // internal::ftello(&mut stream)
+#[no_mangle]
+pub extern "C" fn ftello(stream: *mut FILE) -> off_t {
+    let mut stream = unsafe { &mut *stream }.lock();
+    let pos = Sys::lseek(*stream.file, 0, SEEK_CUR);
+    if pos < 0 {
+        return -1;
+    }
+
+    pos - (stream.read_size - stream.read_pos) as off_t
 }
 
 /// Try to lock the file. Returns 0 for success, 1 for failure
diff --git a/tests/Makefile b/tests/Makefile
index 2d21c7b13cd5cba7fad73fa9ede472d9db255b0a..34bc799f3d5b1a3bd804bc3246aa7d78589c151d 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -18,6 +18,7 @@ EXPECT_BINS=\
 	stdio/buffer \
 	stdio/fgets \
 	stdio/freopen \
+	stdio/fseek \
 	stdio/fwrite \
 	stdio/getc_unget \
 	stdio/printf \
diff --git a/tests/expected/stdio/buffer.stderr b/tests/expected/stdio/buffer.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/stdio/buffer.stdout b/tests/expected/stdio/buffer.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..4b124bc7c01363ec010f1d727b8fb106838b6883
--- /dev/null
+++ b/tests/expected/stdio/buffer.stdout
@@ -0,0 +1,5 @@
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTest
+Hello
+World
+It works
+No buffering issues here
diff --git a/tests/expected/stdio/fgets.stderr b/tests/expected/stdio/fgets.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/stdio/fgets.stdout b/tests/expected/stdio/fgets.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..a856e2de524d031649f2f5c84fdc43cbd6decbc8
--- /dev/null
+++ b/tests/expected/stdio/fgets.stdout
@@ -0,0 +1,31 @@
+Hello World!
+
+Line 2
+
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
+ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
+eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
+fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
+kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
+lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
+mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
+nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
+ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
+ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
+rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
+sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
+ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt
+uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
+vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
+zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
+EOF
diff --git a/tests/expected/stdio/fseek.stderr b/tests/expected/stdio/fseek.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/stdio/fseek.stdout b/tests/expected/stdio/fseek.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..574d89ae9e30f294a172cf0192722281134d4c12
--- /dev/null
+++ b/tests/expected/stdio/fseek.stdout
@@ -0,0 +1,2 @@
+Line 2
+ftell: 21
diff --git a/tests/expected/stdio/setvbuf.stdout b/tests/expected/stdio/setvbuf.stdout
index 7f04b787f7dc9dab3d29ca26572878533525395d..ebda98d01a2738e3b1f5ea75d3163815195255e3 100644
--- a/tests/expected/stdio/setvbuf.stdout
+++ b/tests/expected/stdio/setvbuf.stdout
@@ -1,6 +1,4 @@
 H
-ello World!
-
-Line 2
+Hello World!
 
 Hello
diff --git a/tests/stdio/fseek.c b/tests/stdio/fseek.c
new file mode 100644
index 0000000000000000000000000000000000000000..4bed8733c5efa84db9916a163304a6e09356d377
--- /dev/null
+++ b/tests/stdio/fseek.c
@@ -0,0 +1,12 @@
+#include <stdio.h>
+
+int main() {
+	FILE *f = fopen("stdio/stdio.in", "r");
+    if (fseek(f, 14, SEEK_CUR) < 0) {
+        puts("fseek error");
+        return 1;
+    }
+    char buffer[256];
+    printf("%s", fgets(buffer, 256, f));
+    printf("ftell: %d\n", ftello(f));
+}