diff --git a/plugins/README.md b/plugins/README.md
index a8d1dd468b780e25b99cc3535f647121f2408f57..72ca247ef5e3b3019904050983282814c527b5ac 100644
--- a/plugins/README.md
+++ b/plugins/README.md
@@ -7,6 +7,7 @@
 * [__ccache__](https://github.com/bpinto/oh-my-fish/tree/master/plugins/ccache) – Enable [ccache](http://ccache.samba.org/) to speed up compilation.
 * [__django__](https://github.com/bpinto/oh-my-fish/tree/master/plugins/django) – Helper for Django Unit tests. Cleans the cached modules as well.
 * [__ec2__](https://github.com/bpinto/oh-my-fish/tree/master/plugins/ec2) – Exports env variables for Amazon's EC2 management.
+* [__emacs__](https://github.com/bpinto/oh-my-fish/tree/master/plugins/emacs) – Wrapper for [daemon](http://www.emacswiki.org/emacs/EmacsAsDaemon) functionality of [Emacs](https://www.gnu.org/software/emacs/).
 * [__emoji-clock__](https://github.com/bpinto/oh-my-fish/tree/master/plugins/emoji-clock) – The current time with half hour accuracy as an emoji symbol.
 * [__extract__](https://github.com/bpinto/oh-my-fish/tree/master/plugins/extract) – Plugin to expand or extract bundled & compressed files.
 * [__fish-spec__](https://github.com/bpinto/oh-my-fish/tree/master/plugins/fish-spec) - Unit testing as simple as fish. See the [README](fish-spec/README.markdown) for usage instructions.
diff --git a/plugins/emacs/README.md b/plugins/emacs/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..302f400e03c1f3ecbbb2f9a68b9e3ddf9e51dd02
--- /dev/null
+++ b/plugins/emacs/README.md
@@ -0,0 +1,30 @@
+# Emacs Plugin
+
+This plugin replicates the functionality of the [emacs](https://www.gnu.org/software/emacs/) plugin for [oh-my-zsh](http://ohmyz.sh/).
+It is essentially a wrapper around the very useful [emacs daemon](http://www.emacswiki.org/emacs/EmacsAsDaemon) capability.
+
+Below is an extract from the original plugin source file:
+
+"Emacs 23 daemon capability is a killing feature.
+One emacs process handles all your frames whether
+you use a frame opened in a terminal via a ssh connection or X frames
+opened on the same host.
+Benefits are multiple
+
+  * You don't have the cost of starting Emacs all the time anymore
+  * Opening a file is as fast as Emacs does not have anything else to do.
+  * You can share opened buffered across opened frames.
+  * Configuration changes made at runtime are applied to all frames."
+
+
+### Usage
+
+To use this plugin add `emacs` to `fish_plugins` in you fish config file:
+
+```bash
+set fish_plugins emacs
+```
+
+### Requirements
+
+Emacs 23 or later is required for this plugin.
\ No newline at end of file
diff --git a/plugins/emacs/emacs.load b/plugins/emacs/emacs.load
new file mode 100644
index 0000000000000000000000000000000000000000..41417ffba74686067ce3ec2dad7ad144c93e67fd
--- /dev/null
+++ b/plugins/emacs/emacs.load
@@ -0,0 +1,39 @@
+function __major_version
+  if test -n "$argv"
+    set -l full_metadata (eval $argv --version)
+    set -l full_version (echo $full_metadata | grep -o "[0-9]\+.[0-9]\+.[0-9]\+.[0-9]\+")
+    set -l major_version (echo $full_version | sed  "s/\..*//")
+  end
+
+  echo $major_version
+end
+
+function __set_editor
+  if not set -q EDITOR
+    set -gx EDITOR emacs
+  end
+end
+
+function __add_functions_to_path
+  set emacs_functions $fish_path/plugins/emacs/functions
+  set fish_function_path $emacs_functions $fish_function_path
+end
+
+if not set -q __emacs
+  set __emacs (which emacs)
+end
+if not set -q __emacs_version
+  set __emacs_version (__major_version $__emacs)
+end
+
+if test "$__emacs_version" -gt 23
+  __set_editor
+  __add_functions_to_path
+end
+
+set -e emacs
+set -e emacs_version
+functions -e __major_version
+functions -e __plugins_path
+functions -e __set_editor
+functions -e __add_functions_to_path
diff --git a/plugins/emacs/functions/__kill_emacs.fish b/plugins/emacs/functions/__kill_emacs.fish
new file mode 100644
index 0000000000000000000000000000000000000000..4ee03642a498f532b1c9d8d56b3269cd3037665e
--- /dev/null
+++ b/plugins/emacs/functions/__kill_emacs.fish
@@ -0,0 +1,3 @@
+function __kill_emacs
+  emacsclient --alternate-editor '' --eval '(kill-emacs)' 2>/dev/null
+end
diff --git a/plugins/emacs/functions/__launch_emacs.fish b/plugins/emacs/functions/__launch_emacs.fish
new file mode 100644
index 0000000000000000000000000000000000000000..1f23753437e3ccbe2243321969b16e9d2799e143
--- /dev/null
+++ b/plugins/emacs/functions/__launch_emacs.fish
@@ -0,0 +1,9 @@
+function __launch_emacs
+  set -l x (emacsclient --alternate-editor '' --eval '(x-display-list)' 2>/dev/null)
+
+  if test -z "$x" -o "$x" = nil
+    emacsclient $argv --alternate-editor '' --create-frame
+  else
+    emacsclient $argv --alternate-editor ''
+  end
+end
diff --git a/plugins/emacs/functions/e.fish b/plugins/emacs/functions/e.fish
new file mode 100644
index 0000000000000000000000000000000000000000..dacba249b581bd6f40afe68f33a9ed5ba1234b7d
--- /dev/null
+++ b/plugins/emacs/functions/e.fish
@@ -0,0 +1,3 @@
+function e
+  __launch_emacs $argv --no-wait
+end
diff --git a/plugins/emacs/functions/ec.fish b/plugins/emacs/functions/ec.fish
new file mode 100644
index 0000000000000000000000000000000000000000..1914e1b19150af0373f82e634aca32d3fde2b709
--- /dev/null
+++ b/plugins/emacs/functions/ec.fish
@@ -0,0 +1,3 @@
+function ec
+  __launch_emacs $argv --create-frame --no-wait
+end
diff --git a/plugins/emacs/functions/ecd.fish b/plugins/emacs/functions/ecd.fish
new file mode 100644
index 0000000000000000000000000000000000000000..b0b8978b46adb57d93da0eb12e79550ddea02adc
--- /dev/null
+++ b/plugins/emacs/functions/ecd.fish
@@ -0,0 +1,11 @@
+function ecd
+  set -l cmd '(let ((buf-name (buffer-file-name (window-buffer))))
+             (if buf-name (file-name-directory buf-name)))'
+  set -l dir (__launch_emacs --eval $cmd | tr -d '\"')
+
+  if test -n "$dir"
+    echo $dir
+  else
+    echo 'cannot deduce current buffer filename.' >/dev/stderr
+  end
+end
diff --git a/plugins/emacs/functions/eeval.fish b/plugins/emacs/functions/eeval.fish
new file mode 100644
index 0000000000000000000000000000000000000000..1fd80b7c39e3b8feedc4936971986f7d47551ca6
--- /dev/null
+++ b/plugins/emacs/functions/eeval.fish
@@ -0,0 +1,3 @@
+function eeval
+  __launch_emacs --eval $argv
+end
diff --git a/plugins/emacs/functions/efile.fish b/plugins/emacs/functions/efile.fish
new file mode 100644
index 0000000000000000000000000000000000000000..78ce2d03c514a5fdd00f4076e41a78a03a6e3e54
--- /dev/null
+++ b/plugins/emacs/functions/efile.fish
@@ -0,0 +1,5 @@
+function efile
+  set -l cmd '(buffer-file-name (window-buffer))'
+
+  __launch_emacs --eval $cmd | tr -d '\"'
+end
diff --git a/plugins/emacs/functions/eframe.fish b/plugins/emacs/functions/eframe.fish
new file mode 100644
index 0000000000000000000000000000000000000000..d3ea82c0aebe33adfa7a02b718452fdac1e6c954
--- /dev/null
+++ b/plugins/emacs/functions/eframe.fish
@@ -0,0 +1,3 @@
+function eframe
+  __launch_emacs $argv --create-frame --no-wait
+end
diff --git a/plugins/emacs/functions/ek.fish b/plugins/emacs/functions/ek.fish
new file mode 100644
index 0000000000000000000000000000000000000000..03c951231281070e5431bbce8ae8857d245cfe70
--- /dev/null
+++ b/plugins/emacs/functions/ek.fish
@@ -0,0 +1,3 @@
+function ek
+  __kill_emacs
+end
diff --git a/plugins/emacs/functions/emacs.fish b/plugins/emacs/functions/emacs.fish
new file mode 100644
index 0000000000000000000000000000000000000000..9419fe7561ad41a280a93a2a7e50cd0f0a8d0214
--- /dev/null
+++ b/plugins/emacs/functions/emacs.fish
@@ -0,0 +1,3 @@
+function emacs
+  __launch_emacs $argv --no-wait
+end
diff --git a/plugins/emacs/functions/emasc.fish b/plugins/emacs/functions/emasc.fish
new file mode 100644
index 0000000000000000000000000000000000000000..c70d00073d9da655085947f1997e7d8e8e8b32fe
--- /dev/null
+++ b/plugins/emacs/functions/emasc.fish
@@ -0,0 +1,3 @@
+function emasc
+  __launch_emacs $argv --no-wait
+end
diff --git a/plugins/emacs/functions/emcas.fish b/plugins/emacs/functions/emcas.fish
new file mode 100644
index 0000000000000000000000000000000000000000..02b38bc1b291a6914c9ca40d49e22c241add98d7
--- /dev/null
+++ b/plugins/emacs/functions/emcas.fish
@@ -0,0 +1,3 @@
+function emcas
+  __launch_emacs $argv --no-wait
+end
diff --git a/plugins/emacs/functions/et.fish b/plugins/emacs/functions/et.fish
new file mode 100644
index 0000000000000000000000000000000000000000..450a4f9db8d4a797111d599d6800d254ed7b5b5d
--- /dev/null
+++ b/plugins/emacs/functions/et.fish
@@ -0,0 +1,3 @@
+function et
+  __launch_emacs $argv --tty
+end
diff --git a/plugins/emacs/spec/emacs.spec.fish b/plugins/emacs/spec/emacs.spec.fish
new file mode 100644
index 0000000000000000000000000000000000000000..dcea58bceb38c4d4a63d264c1ef04b618738576c
--- /dev/null
+++ b/plugins/emacs/spec/emacs.spec.fish
@@ -0,0 +1,118 @@
+import plugins/fish-spec
+
+
+function describe_emacs
+
+  function before_all
+    set -g __emacs_current_editor $EDITOR
+    set -g __emacs_load_file $fish_path/plugins/emacs/emacs.load
+    set -g __emacs_functions e ec ek et ecd eeval efile eframe emacs emasc emcas
+  end
+
+  function before_each
+    set -e EDITOR
+    set -g __emacs '/bin/emacs'
+    set -g __emacs_version 25
+  end
+
+  function it_sets_editor_on_load
+    load_emacs_plugin
+
+    expect $EDITOR --to-equal "emacs"
+  end
+
+  function it_does_not_set_editor_when_it_is_already_set
+    set EDITOR 'vim'
+
+    load_emacs_plugin
+
+    expect $EDITOR --to-equal "vim"
+  end
+
+  function it_does_not_set_editor_when_emacs_is_not_found
+    emacs_is_not_found
+
+    load_emacs_plugin
+
+    expect "$EDITOR" --to-equal ""
+  end
+
+  function it_does_not_set_editor_when_emacs_version_is_lower_than_23
+    set __emacs_version 22
+
+    load_emacs_plugin
+
+    expect "$EDITOR" --to-equal ""
+  end
+
+  function it_adds_functions_to_fish_function_path
+    load_emacs_plugin
+
+    expect (functions) --to-contain-all $__emacs_functions
+  end
+
+  function it_has_a_test_helper_that_removes_emacs_functions
+    load_emacs_plugin
+
+    expect (functions) --to-contain-all $__emacs_functions
+
+    remove_emacs_functions
+
+    expect (functions) --to-not-contain-all $__emacs_functions
+  end
+
+
+  function it_does_not_add_functions_when_emacs_is_not_found
+    remove_emacs_functions
+    emacs_is_not_found
+
+    load_emacs_plugin
+
+    expect (functions) --to-not-contain-all $__emacs_functions
+  end
+
+  function it_does_not_add_functions_when_emacs_version_is_lower_than_23
+    set __emacs_version 22
+
+    expect (functions) --to-not-contain-all $__emacs_functions
+
+    load_emacs_plugin
+
+    expect (functions) --to-not-contain-all $__emacs_functions
+  end
+
+
+  function emacs_is_not_found
+    set __emacs ""
+    set __emacs_version ""
+  end
+
+  function load_emacs_plugin
+    source $__emacs_load_file
+  end
+
+  function remove_emacs_functions
+    for path in $fish_function_path
+      set match (echo $path | grep emacs)
+      if test -z "$match"
+        set -g __new_fish_function_path $__new_fish_function_path $path
+      end
+    end
+
+    set fish_function_path $__new_fish_function_path
+    set -e __new_fish_function_path
+  end
+
+  function after_all
+    set EDITOR $__emacs_current_editor
+
+    set -e __emacs
+    set -e __emacs_version
+    set -e __emacs_load_file
+    set -e __emacs_functions
+    set -e __emacs_current_editor
+  end
+end
+
+
+spec.run $argv