diff --git a/functions/Plugin.fish b/functions/Plugin.fish
index f7defd6e94e2f92a79d80d185f9fa17b31b22fc7..fcd0513ec2f86525c5d974242a268054cc9e78f4 100644
--- a/functions/Plugin.fish
+++ b/functions/Plugin.fish
@@ -1,4 +1,6 @@
 function Plugin --argument-names name
+  set -g fish_plugins $fish_plugins $name
+
   if [ -e $fish_path/plugins/$name -o -e $fish_custom/plugins/$name ]
     import plugins/$name
   else
diff --git a/functions/Theme.fish b/functions/Theme.fish
index 4b6d929ad4966720d54c44875c7bd98edbc8c6b2..546ea5b0cad5c32b8cc2dfacf0b36d97c127490b 100644
--- a/functions/Theme.fish
+++ b/functions/Theme.fish
@@ -1,4 +1,6 @@
 function Theme --argument-names name
+  set -g fish_theme $name
+
   if [ -e $fish_path/themes/$name -o -e $fish_custom/themes/$name ]
     import themes/$name
   else
diff --git a/functions/fish.fish b/functions/fish.fish
new file mode 100644
index 0000000000000000000000000000000000000000..51791abdfb7464a86311ae0d6e12479d8ef3aca9
--- /dev/null
+++ b/functions/fish.fish
@@ -0,0 +1,20 @@
+# NAME
+#   fish - Extend default fish binary
+#
+# DESCRIPTION
+#   Extend fish binary to support plugins and themes installation
+#
+function fish -d "Extend fish binary"
+  if test (count $argv) -gt 0
+    switch $argv[1]
+      case 'install'
+        fish.packages --install
+      case 'update'
+        fish.packages --update
+      case '*'
+        command fish $argv
+    end
+  else
+    command fish
+  end
+end
diff --git a/functions/fish.log.fish b/functions/fish.log.fish
new file mode 100644
index 0000000000000000000000000000000000000000..55eb3a8892004865c07acf324ff773bc878c5243
--- /dev/null
+++ b/functions/fish.log.fish
@@ -0,0 +1,17 @@
+# NAME
+#   fish.log - simple log with color
+#
+# SYNOPSIS
+#   <string> [<string>...]
+#
+# DESCRIPTION
+#   Simply log a message with a specified color.
+#
+function fish.log -d "Simple log with color"
+  switch $argv[1]
+    case '-*'
+      echo $argv[1] (set_color $argv[2])$argv[3..-1](set_color normal)
+    case '*'
+      echo -e (set_color $argv[1])$argv[2..-1](set_color normal)
+  end
+end
diff --git a/functions/fish.packages.fish b/functions/fish.packages.fish
new file mode 100644
index 0000000000000000000000000000000000000000..857e438961fafb1f0e2e57fc453ed8f23caada81
--- /dev/null
+++ b/functions/fish.packages.fish
@@ -0,0 +1,28 @@
+# NAME
+#   fish.packages - Manage all plugins and themes
+#
+# SYNOPSIS
+#   fish.packages [OPTIONS]
+#
+# OPTIONS
+#   --install
+#     Install all packages
+#   --update
+#     Update all packages
+#
+# DESCRIPTION
+#   Manage all plugins and themes specified on the $fish_plugins
+#   and $fish_theme variables
+#
+function fish.packages --argument-names options -d 'Manage all plugins and themes'
+  set -l modified_packages 0
+
+  switch $options
+    case "--install"
+      fish.packages.install
+    case "--update"
+      fish.packages.update
+    case "*"
+      fish.log red 'Unknown option'
+  end
+end
diff --git a/functions/fish.packages.install.fish b/functions/fish.packages.install.fish
new file mode 100644
index 0000000000000000000000000000000000000000..57830d330100d1a3b8a2e80771895333aa07fc7e
--- /dev/null
+++ b/functions/fish.packages.install.fish
@@ -0,0 +1,36 @@
+# NAME
+#   fish.packages.install - Install all plugins and themes
+#
+# DESCRIPTION
+#   Install all plugins and themes specified on the $fish_plugins
+#   and $fish_theme variables
+#
+function fish.packages.install -d "Install all plugins and themes"
+  set -l installed_packages 0
+
+  # Plugins
+  for plugin in $fish_plugins
+    if [ -e $fish_path/plugins/$plugin -o -e $fish_custom/plugins/$plugin ]
+      #echo "$plugin is already installed. Skipping."
+    else
+      fish.log -n white "Installing $plugin... "
+      git clone "https://github.com/oh-my-fish/plugins-$plugin" $fish_path/plugins/$plugin ^ /dev/null
+      fish.log green  "√"
+      set -l installed_packages 1
+    end
+  end
+
+  # Theme
+  if [ -e $fish_path/themes/$fish_theme -o -e $fish_custom/themes/$fish_theme ]
+    #echo "$fish_theme is already installed. Skipping."
+  else
+    fish.log -n white "Installing $fish_theme... "
+    git clone "https://github.com/oh-my-fish/themes-$fish_theme" $fish_path/themes/$fish_theme ^ /dev/null
+    fish.log green  "√"
+    set -l installed_packages 1
+  end
+
+  if [ $installed_packages -eq 0 ]
+    fish.log green 'All plugins were already installed.'
+  end
+end
diff --git a/functions/fish.packages.update.fish b/functions/fish.packages.update.fish
new file mode 100644
index 0000000000000000000000000000000000000000..513ce465e38bb6baf6487fe22e03c9082efaaf61
--- /dev/null
+++ b/functions/fish.packages.update.fish
@@ -0,0 +1,53 @@
+# NAME
+#   fish.packages.update - Update all plugins and themes
+#
+# DESCRIPTION
+#   Update all plugins and themes specified on the $fish_plugins
+#   and $fish_theme variables
+#
+function fish.packages.update -d "Update all plugins and themes"
+  set -l installed_packages 0
+  pushd
+
+  # Plugins
+  for plugin in $fish_plugins
+    if [ -e $fish_path/plugins/$plugin -a -e $fish_path/plugins/$plugin/.git ]
+      fish.log -n white "Updating $plugin... "
+      echo (cd $fish_path/plugins/$plugin; and git pull --rebase > /dev/null) >/dev/null
+      fish.log green  "√"
+      set -l installed_packages 1
+    else
+      if [ -e $fish_custom/plugins/$plugin -a -e $fish_custom/plugins/$plugin/.git ]
+        fish.log -n white "Updating $plugin... "
+        echo (cd $fish_custom/plugins/$plugin; and git pull --rebase > /dev/null) >/dev/null
+        fish.log green  "√"
+        set -l installed_packages 1
+      else
+        #echo "$plugin is not installed or not a git repo. Skipping."
+      end
+    end
+  end
+
+  # Theme
+  if [ -e $fish_path/themes/$fish_theme -a -e $fish_path/themes/$fish_theme/.git ]
+    fish.log -n white "Updating $fish_theme... "
+    echo (cd $fish_path/themes/$fish_theme; and git pull --rebase > /dev/null) >/dev/null
+    fish.log green  "√"
+    set -l installed_packages 1
+  else
+    if [ -e $fish_custom/themes/$fish_theme -a -e $fish_custom/themes/$fish_theme/.git ]
+      fish.log -n white "Updating $fish_theme... "
+      echo (cd $fish_custom/themes/$fish_theme; and git pull --rebase > /dev/null) >/dev/null
+      fish.log green  "√"
+      set -l installed_packages 1
+    else
+      #echo "$fish_theme is not installed or not a git repo. Skipping."
+    end
+  end
+
+  if [ $installed_packages -eq 0 ]
+    fish.log green 'No plugins to update.'
+  end
+
+  popd
+end