diff --git a/Library/Homebrew/refresh_brew.rb b/Library/Homebrew/refresh_brew.rb
new file mode 100644
index 0000000000000000000000000000000000000000..753036ed5560c18cb033ed75d950bb3922e193a2
--- /dev/null
+++ b/Library/Homebrew/refresh_brew.rb
@@ -0,0 +1,36 @@
+class RefreshBrew
+  UPDATE_COMMAND   = 'git pull origin masterbrew'
+  REVISION_COMMAND = 'git log -l -1 --pretty=format:%H'
+  GIT_UP_TO_DATE   = 'Already up-to-date.'
+  UPDATED_FORMULA  = %r{^\s+Library/Formula/(.+?)\.rb\s}
+  
+  attr_reader :updated_formulae
+  
+  def initialize
+    @updated_formulae = []
+  end
+  
+  # Performs an update of the homebrew source. Returns +true+ if a newer
+  # version was availble, +false+ if already up-to-date.
+  def update_from_masterbrew!
+    output = git_pull!
+    output.split("\n").each do |line|
+      @updated_formulae << $1 if line =~ UPDATED_FORMULA
+    end
+    output.strip != GIT_UP_TO_DATE
+  end
+  
+  def pending_formulae_changes?
+    !@updated_formulae.empty?
+  end
+  
+  def current_revision
+    `#{REVISION_COMMAND}`.strip
+  end
+  
+  private
+  
+  def git_pull!
+    Dir.chdir(HOMEBREW_PREFIX) { `#{UPDATE_COMMAND}` }
+  end
+end
\ No newline at end of file
diff --git a/Library/Homebrew/unittest.rb b/Library/Homebrew/unittest.rb
index 8d5f1b76f9b649e36c8b18d28323dfb3464bedf0..bc1cc6937c7deaa3e5a27122f704dfe428568a78 100755
--- a/Library/Homebrew/unittest.rb
+++ b/Library/Homebrew/unittest.rb
@@ -13,10 +13,11 @@ require 'keg'
 require 'utils'
 require 'brew.h'
 require 'hardware.rb'
+require 'refresh_brew'
 
 # these are defined in global.rb, but we don't want to break our actual
 # homebrew tree, and we do want to test everything :)
-HOMEBREW_PREFIX=Pathname.new '/tmp/testbrew/prefix'
+HOMEBREW_PREFIX=Pathname.new '/private/tmp/testbrew/prefix'
 HOMEBREW_CACHE=HOMEBREW_PREFIX.parent+"cache"
 HOMEBREW_CELLAR=HOMEBREW_PREFIX.parent+"cellar"
 HOMEBREW_USER_AGENT="Homebrew"
@@ -82,6 +83,20 @@ class TestScriptFileFormula <ScriptFileFormula
   end
 end
 
+class RefreshBrewMock < RefreshBrew
+  def in_prefix_expect(expect, returns)
+    @expect, @returns = expect, returns
+  end
+  
+  def `(cmd)
+    if Dir.pwd == HOMEBREW_PREFIX.to_s and cmd == @expect
+      @returns
+    else
+      raise "<#{inspect}> Called backticks in pwd `#{HOMEBREW_PREFIX}' and command `#{cmd}'"
+    end
+  end
+end
+
 def nostdout
   if ARGV.include? '-V'
     yield
@@ -485,4 +500,111 @@ class BeerTasting <Test::Unit::TestCase
     f=MockFormula.new 'http://ftp.mozilla.org/pub/mozilla.org/js/js-1.8.0-rc1.tar.gz'
     assert_equal '1.8.0-rc1', f.version
   end
+  
+  def test_updater_update_homebrew_without_any_changes
+    updater = RefreshBrewMock.new
+    updater.in_prefix_expect("git pull origin masterbrew", "Already up-to-date.\n")
+    
+    assert_equal false, updater.update_from_masterbrew!
+    assert updater.updated_formulae.empty?
+  end
+  
+  def test_updater_update_homebrew_without_formulae_changes
+    updater = RefreshBrewMock.new
+    output = fixture('update_git_pull_output_without_formulae_changes')
+    updater.in_prefix_expect("git pull origin masterbrew", output)
+    
+    assert_equal true, updater.update_from_masterbrew!
+    assert !updater.pending_formulae_changes?
+    assert updater.updated_formulae.empty?
+  end
+  
+  def test_updater_update_homebrew_with_formulae_changes
+    updater = RefreshBrewMock.new
+    output = fixture('update_git_pull_output_with_formulae_changes')
+    updater.in_prefix_expect("git pull origin masterbrew", output)
+    
+    assert_equal true, updater.update_from_masterbrew!
+    assert updater.pending_formulae_changes?
+    assert_equal %w{ antiword bash-completion xar yajl }, updater.updated_formulae
+  end
+  
+  def test_updater_returns_current_revision
+    updater = RefreshBrewMock.new
+    updater.in_prefix_expect('git log -l -1 --pretty=format:%H', 'the-revision-hash')
+    assert_equal 'the-revision-hash', updater.current_revision
+  end
+  
+  private
+  
+  def fixture(name)
+    self.class.fixture_data[name]
+  end
+  
+  def self.fixture_data
+    unless @fixture_data
+      require 'yaml'
+      @fixture_data = YAML.load(DATA)
+    end
+    @fixture_data
+  end
 end
+
+__END__
+update_git_pull_output_without_formulae_changes: |
+  remote: Counting objects: 58, done.
+  remote: Compressing objects: 100% (35/35), done.
+  remote: Total 39 (delta 20), reused 0 (delta 0)
+  Unpacking objects: 100% (39/39), done.
+  From git://github.com/mxcl/homebrew
+   * branch            masterbrew -> FETCH_HEAD
+  Updating 14ef7f9..f414bc8
+  Fast forward
+   Library/Homebrew/ARGV+yeast.rb                |   35 ++--
+   Library/Homebrew/beer_events.rb               |  181 +++++++++++++
+   Library/Homebrew/hardware.rb                  |   71 ++++++
+   Library/Homebrew/hw.model.c                   |   17 --
+   README                                        |  337 +++++++++++++------------
+   bin/brew                                      |  137 ++++++++---
+   40 files changed, 1107 insertions(+), 426 deletions(-)
+   create mode 100644 Library/Homebrew/beer_events.rb
+   create mode 100644 Library/Homebrew/hardware.rb
+   delete mode 100644 Library/Homebrew/hw.model.c
+   delete mode 100644 Library/Homebrew/hw.model.rb
+update_git_pull_output_with_formulae_changes: |
+  remote: Counting objects: 58, done.
+  remote: Compressing objects: 100% (35/35), done.
+  remote: Total 39 (delta 20), reused 0 (delta 0)
+  Unpacking objects: 100% (39/39), done.
+  From git://github.com/mxcl/homebrew
+   * branch            masterbrew -> FETCH_HEAD
+  Updating 14ef7f9..f414bc8
+  Fast forward
+   Library/Contributions/brew_bash_completion.sh |    6 +-
+   Library/Formula/antiword.rb                   |   13 +
+   Library/Formula/bash-completion.rb            |   25 ++
+   Library/Formula/xar.rb                        |   19 ++
+   Library/Formula/yajl.rb                       |    2 +-
+   Library/Homebrew/ARGV+yeast.rb                |   35 ++--
+   Library/Homebrew/beer_events.rb               |  181 +++++++++++++
+   Library/Homebrew/hardware.rb                  |   71 ++++++
+   Library/Homebrew/hw.model.c                   |   17 --
+   Library/Homebrew/pathname+yeast.rb            |   28 ++-
+   Library/Homebrew/unittest.rb                  |  106 ++++++++-
+   Library/Homebrew/utils.rb                     |   36 ++-
+   README                                        |  337 +++++++++++++------------
+   bin/brew                                      |  137 ++++++++---
+   40 files changed, 1107 insertions(+), 426 deletions(-)
+   create mode 100644 Library/Formula/antiword.rb
+   create mode 100644 Library/Formula/bash-completion.rb
+   create mode 100644 Library/Formula/ddrescue.rb
+   create mode 100644 Library/Formula/dict.rb
+   create mode 100644 Library/Formula/lua.rb
+   delete mode 100644 Library/Formula/antiword.rb
+   delete mode 100644 Library/Formula/bash-completion.rb
+   delete mode 100644 Library/Formula/xar.rb
+   delete mode 100644 Library/Formula/yajl.rb
+   create mode 100644 Library/Homebrew/beer_events.rb
+   create mode 100644 Library/Homebrew/hardware.rb
+   delete mode 100644 Library/Homebrew/hw.model.c
+   delete mode 100644 Library/Homebrew/hw.model.rb
\ No newline at end of file
diff --git a/bin/brew b/bin/brew
index bd57b7103c80fdf2e799a49ea21f0dfa33cdc963..79ac11520564e6e7f6b4cf06fb6ea244ee05b969 100755
--- a/bin/brew
+++ b/bin/brew
@@ -110,6 +110,17 @@ begin
       end
 
 
+    when 'up', 'update'
+      require 'refresh_brew'
+      updater = RefreshBrew.new
+      unless updater.update_from_masterbrew!
+        ohai "Already up-to-date."
+      else
+        ohai "Updated Homebrew to: #{updater.current_revision}"
+        ohai "No formulae were updated." unless updater.pending_formulae_changes?
+        ohai "The following formulae were updated: #{updater.updated_formulae.join(', ')}"
+      end
+
     when 'ln', 'link'
       ARGV.kegs.each {|keg| puts "#{keg.link} links created for #{keg}"}