diff --git a/cbrew.coffee b/cbrew.coffee
index 39a5cc432f21fbdadbabdca548a1056b08697e7a..0b4e910934917b05f5cc73f2c05a0e085ce0d096 100644
--- a/cbrew.coffee
+++ b/cbrew.coffee
@@ -5,16 +5,23 @@ fs = require 'fs'
 events = require 'events'
 global.eventDispatch = new events.EventEmitter
 crypto = require 'crypto'
+tgz = require 'tar.gz'
+ncp = require 'ncp'
+ncp = ncp.ncp
+network = require './network.coffee'
 
+ncp.limit = 16
 program.version '0.0.1'
 program.parse process.argv
 
+@device = require './device.json'
 action = process.argv[2]
 pkgName = process.argv[3]
 
 @pkg = (pkgName) ->
   eventDispatch.on 'packageFound', ->
     @pkg = require './formulas/' + pkgName + '.coffee'
+    global.pkgVersion = @pkg.version
   eventDispatch.on 'packageNotFound', ->
     console.log 'package ' + pkgName + ' not found :('
     process.exit 1
@@ -34,7 +41,8 @@ search = (pkgName) =>
 download = (pkgName) =>
   @pkg pkgName
   eventDispatch.on 'packageFound', ->
-    @pkg.getSource() unless @pkg.getBinary()
+    if @pkg.binary_url then network.getFile @pkg.binary_url else network.getFile @pkg.source_url
+
   eventDispatch.on 'filename', (filename) ->
     @pkg.filename = filename
   eventDispatch.on 'gotPackage', ->
@@ -42,17 +50,40 @@ download = (pkgName) =>
     stream = fs.ReadStream @pkg.filename
     stream.on 'data', (data) ->
       sha1sum.update data
-    stream.on 'end', ->
+    stream.on 'end', =>
       digest = sha1sum.digest 'hex'
-      console.log digest
+      checksum = @pkg.binary_sha1 or @pkg.source_sha1
+      eventDispatch.emit 'packageSumOk' unless digest isnt checksum
 
 install = (pkgName) =>
+  eventDispatch.on 'extractedPackage', =>
+    console.log 'installing package...'
+    ncp './usr', './xd', (error) =>
+      @device.installed_packages.push { name: pkgName, version: pkgVersion }
+      fs.writeFile './device.json', JSON.stringify @device, null, 2
+      ncp './filelist', './meta/' + pkgName + '.filelist', (error) ->
+        console.log 'package ' + pkgName + ' installed!' unless error
+
+  eventDispatch.on 'packageSumOk', ->
+    console.log 'extracting archive...'
+    new tgz().extract './' + @pkg.filename, '.', (error) ->
+      eventDispatch.emit 'extractedPackage' unless error
+
   download pkgName
 
-  eventDispatch.on 'gotPackage', ->
-    @pkg.build() unless @pkg.installBinary()
+remove = (pkgName) =>
+  fs.readFile './meta/' + pkgName + '.filelist', (error, data) ->
+    throw error if error
+    lines = data.toString().split '\n'
+    fs.unlink '.' + line for line in lines
+    console.log pkgName + ' removed!'
+
+showStatus = =>
+  console.log pkg.name + ': ' + pkg.version for pkg in @device.installed_packages
 
 switch action
   when "search" then search pkgName
   when "download" then download pkgName
   when "install" then install pkgName
+  when "remove" then remove pkgName
+  when "status" then showStatus()
diff --git a/device.json b/device.json
new file mode 100644
index 0000000000000000000000000000000000000000..5b09abeb200312c0281c71d590187f6c1d796376
--- /dev/null
+++ b/device.json
@@ -0,0 +1,6 @@
+{
+  "architecture": "i686",
+  "installed_packages": [
+    
+  ]
+}
diff --git a/formulas/mpfr.coffee b/formulas/mpfr.coffee
index 228498db866785f7b3b7da7f6dcc61f1e0559360..b163fc7a20a66e00dbef2ad59f7ac5454df9aea4 100644
--- a/formulas/mpfr.coffee
+++ b/formulas/mpfr.coffee
@@ -1,8 +1,4 @@
-network = require '../network.coffee'
-
 module.exports =
+  version: "3.1.2"
   binary_url: "https://dl.dropboxusercontent.com/s/lo9ks3g7ar3zpfu/mpfr-3.1.2-chromeos-i686.tar.gz?token_hash=AAH1GlLfYtUs4uxl1ayeGTBe8RJ5uTXzOAsXgSlv8G5rrA&dl=1"
-  binary_sha1: "763c0228359f99c8a6af5c8b8da628b089eb5451"
-
-  getBinary: (callback) ->
-    network.getFile @binary_url
+  binary_sha1: "ad8a29c21322f245ea0a03045aeb0b07b36cd361"