diff --git a/pkg/fish-spec/basic_formatter.fish b/pkg/fish-spec/basic_formatter.fish
new file mode 100644
index 0000000000000000000000000000000000000000..289a4818e602f6ff4b66a1f32990ac48ba815318
--- /dev/null
+++ b/pkg/fish-spec/basic_formatter.fish
@@ -0,0 +1,59 @@
+function __fish-spec.all_specs_init -e all_specs_init -a spec
+  set -g __fish_spec_start_time (__fish-spec.current_time)
+end
+
+function __fish-spec.all_specs_finished -e all_specs_finished -a spec
+  set -l __fish_spec_end_time (__fish-spec.current_time)
+  set -l diff (math "scale=3;($__fish_spec_end_time - $__fish_spec_start_time) / 1000")
+
+  echo -en '\n\nFinished in '
+  printf '%g' $diff
+  echo ' seconds'
+end
+
+function __fish-spec.spec_init -e spec_init -a spec
+  set -g __current_spec_name (echo $spec | sed 's/^[0-9]*_//;s/_/ /g;s/^it/It/')
+  set -e __current_spec_output
+  set -e __current_spec_status
+end
+
+function __fish-spec.spec_finished -e spec_finished -a spec
+  functions -e $spec
+
+  switch "$__current_spec_status"
+    case success
+      emit spec_success
+    case error
+      emit spec_error
+    case '*'
+      emit spec_no_assertions
+  end
+end
+
+function __fish-spec.spec_success -e spec_success
+  echo -n '.'
+end
+
+function __fish-spec.spec_error -e spec_error
+  echo -e "\n\nFailure: $__current_spec_name"
+
+  if not set -q __current_spec_quiet
+    echo (omf::em)  $__current_spec_output(omf::off)
+  end
+
+  set -g __any_spec_failed true
+end
+
+function __fish-spec.spec_no_assertions -e spec_no_assertions
+  echo -n 'N/A'
+end
+
+function __fish-spec_assertion_success -e assertion_success
+  set -q __current_spec_status; or set -g __current_spec_status success
+end
+
+function __fish-spec_assertion_error -e assertion_error -a error_message
+  # Mimics output redirect inside an event handler
+  set -g __current_spec_output $error_message
+  set -g __current_spec_status error
+end
diff --git a/pkg/fish-spec/functions/assert.error_message.fish b/pkg/fish-spec/functions/assert.error_message.fish
index 3b7f3494d5bed70bdf22dfe70ec9dc2f2c388693..cac1716b5a8e369eabff83f10f1cf10b25141581 100644
--- a/pkg/fish-spec/functions/assert.error_message.fish
+++ b/pkg/fish-spec/functions/assert.error_message.fish
@@ -6,26 +6,26 @@ function assert.error_message
       switch $number_of_arguments
         case 3
           set operator (assert.expand_operator $argv[2])
-          set expected $argv[3]
-          echo "Expected $expected to not be $operator"
+          set actual $argv[3]
+          echo "Expected result to not be $operator but it was $actual"
         case 4
           set expected $argv[2]
           set operator "not" (assert.expand_operator $argv[3])
           set actual   $argv[4]
-          echo "Expected $expected to $operator $actual"
+          echo "Expected result to $operator $expected but it was $actual"
         case \*
           return 1
         end
     case \-\*
       test $number_of_arguments != 2; and return 1
       set operator (assert.expand_operator $argv[1])
-      set expected $argv[2]
-      echo "Expected $expected to be $operator"
+      set actual $argv[2]
+      echo "Expected result to be $operator but it was $actual"
     case \*
       test $number_of_arguments != 3; and return 1
       set expected $argv[1]
       set operator (assert.expand_operator $argv[2])
       set actual   $argv[3]
-      echo "Expected $expected to $operator $actual"
+      echo "Expected result to $operator $expected but it was $actual"
   end
 end
diff --git a/pkg/fish-spec/functions/fish-spec.fish b/pkg/fish-spec/functions/fish-spec.fish
index bf5ea0982e96ab30d4d783fecb25862122492d56..fc81fc926acdaadc9522af624ed52d678bad1fe9 100644
--- a/pkg/fish-spec/functions/fish-spec.fish
+++ b/pkg/fish-spec/functions/fish-spec.fish
@@ -1,4 +1,9 @@
 function fish-spec
+  set -g __fish_spec_dir (dirname (dirname (status -f)))
+
+  # Source formatter
+  source $__fish_spec_dir/basic_formatter.fish
+
   # Reset internal variables
   set -e __any_spec_failed
 
@@ -10,9 +15,13 @@ function fish-spec
   # Load helper file
   source spec/helper.fish ^/dev/null
 
+  emit all_specs_init
+
   # Run all specs
   __fish-spec.run_all_specs
 
+  emit all_specs_finished
+
   not set -q __any_spec_failed
 end
 
@@ -47,47 +56,12 @@ function __fish-spec.run_suite -a suite_name
   functions -e before_all before_each after_each after_all
 end
 
-function __fish-spec.spec_init -e spec_init -a spec
-  set -e __current_spec_status
-end
-
-function __fish-spec.spec_finished -e spec_finished -a spec
-  functions -e $spec
-
-  switch "$__current_spec_status"
-    case success
-      emit spec_success
-    case error
-      emit spec_error
-    case '*'
-      emit spec_no_assertions
-  end
-end
-
-function __fish-spec.spec_success -e spec_success
-  echo -n '.'
-end
-
-function __fish-spec.spec_error -e spec_error
-  echo -n 'F'
-  set -g __any_spec_failed true
-end
-
-function __fish-spec.spec_no_assertions -e spec_no_assertions
-  echo -n 'N/A'
-end
-
-function __fish-spec_assertion_success -e assertion_success
-  set -q __current_spec_status; or set -g __current_spec_status success
-end
-
-function __fish-spec_assertion_error -e assertion_error -a error_message
-  # Mimics output redirect inside an event handler
-  if set -q __fish_spec_output
-    set __fish_spec_output $error_message
+function __fish-spec.current_time
+  if test (uname) = 'Darwin'
+    set filename 'epoch.osx'
   else
-    echo $error_message
+    set filename 'epoch.linux'
   end
 
-  set -g __current_spec_status error
+  eval $__fish_spec_dir/utils/$filename
 end
diff --git a/pkg/fish-spec/spec/assert_error_message_spec.fish b/pkg/fish-spec/spec/assert_error_message_spec.fish
index 03660da8b97a73a53ecfd1d3c412eb9f62e49188..bfc7ad2733fb9ca9a453b2a5366ae2d4dc1d89e9 100644
--- a/pkg/fish-spec/spec/assert_error_message_spec.fish
+++ b/pkg/fish-spec/spec/assert_error_message_spec.fish
@@ -1,10 +1,10 @@
 function describe_assert_error_message
   function before_each
-    set -g __fish_spec_output "initial test value"
+    set -g __current_spec_quiet
   end
 
   function after_each
-    set -e __fish_spec_output
+    set -e __current_spec_quiet
   end
 
   function it_has_no_output_when_the_test_succeeds
@@ -13,16 +13,16 @@ function describe_assert_error_message
     # Reset test status
     set -e __current_spec_status
 
-    assert 'initial test value' = "$__fish_spec_output"; or echo $__fish_spec_output
+    assert -z "$__current_spec_output"
   end
 
   function it_supports_unary_operators
-    assert -z "string"
+    assert -z "abc"
 
     # Reset test status
     set -e __current_spec_status
 
-    assert 'Expected string to be empty' = "$__fish_spec_output"; or echo $__fish_spec_output
+    assert 'Expected result to be empty but it was abc' = "$__current_spec_output"
   end
 
   function it_supports_binary_operators
@@ -31,7 +31,7 @@ function describe_assert_error_message
     # Reset test status
     set -e __current_spec_status
 
-    assert 'Expected 1 to equals 2' = "$__fish_spec_output"; or echo $__fish_spec_output
+    assert 'Expected result to equals 1 but it was 2' = "$__current_spec_output"
   end
 
   function it_supports_inversion_on_unary_operators
@@ -40,7 +40,7 @@ function describe_assert_error_message
     # Reset test status
     set -e __current_spec_status
 
-    assert 'Expected  to not be empty' = "$__fish_spec_output"; or echo $__fish_spec_output
+    assert 'Expected result to not be empty but it was ' = "$__current_spec_output"
   end
 
   function it_supports_inversion_on_binary_operators
@@ -49,6 +49,6 @@ function describe_assert_error_message
     # Reset test status
     set -e __current_spec_status
 
-    assert 'Expected 1 to not equals 1' = "$__fish_spec_output"; or echo $__fish_spec_output
+    assert 'Expected result to not equals 1 but it was 1' = "$__current_spec_output"
   end
 end
diff --git a/pkg/fish-spec/spec/results_spec.fish b/pkg/fish-spec/spec/results_spec.fish
index 9cae8821a196238c60ecb0747273d12871aff65a..eaa47cdd00840aa3301485341419dc056e5765e1 100644
--- a/pkg/fish-spec/spec/results_spec.fish
+++ b/pkg/fish-spec/spec/results_spec.fish
@@ -1,8 +1,4 @@
 function describe_results
-  function after_each
-    set -e __fish_spec_quiet
-  end
-
   function it_succeeds_when_single_assertion_succeeds
     assert 1 = 1
 
diff --git a/pkg/fish-spec/utils/epoch.c b/pkg/fish-spec/utils/epoch.c
new file mode 100644
index 0000000000000000000000000000000000000000..4daaf2bd94119e8ac9d8b5c8cc2ebcc6b718595c
--- /dev/null
+++ b/pkg/fish-spec/utils/epoch.c
@@ -0,0 +1,10 @@
+#include <stdio.h>
+#include <sys/time.h>
+
+int main(int argc, char** argv) {
+  struct timeval time_struct;
+  gettimeofday(&time_struct, 0);
+  printf("%lld", (time_struct.tv_sec * 1000ll) + (time_struct.tv_usec / 1000ll));
+
+  return 0;
+}
diff --git a/pkg/fish-spec/utils/epoch.linux b/pkg/fish-spec/utils/epoch.linux
new file mode 100755
index 0000000000000000000000000000000000000000..3898514e7a8c4fb0a9c12ccfbb570508a4562bc2
Binary files /dev/null and b/pkg/fish-spec/utils/epoch.linux differ
diff --git a/pkg/fish-spec/utils/epoch.osx b/pkg/fish-spec/utils/epoch.osx
new file mode 100755
index 0000000000000000000000000000000000000000..3d27ae9be2e6744fb1a69fd7af0e4c5147965fff
Binary files /dev/null and b/pkg/fish-spec/utils/epoch.osx differ