diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..c792c2a
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.airhacks</groupId>
+    <artifactId>airfield</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+    <dependencies>
+        <dependency>
+            <groupId>org.eclipse.jgit</groupId>
+            <artifactId>org.eclipse.jgit</artifactId>
+            <version>4.1.0.201509280440-r</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <version>2.10</version>
+                <executions>
+                    <execution>
+                        <id>copy-dependencies</id>
+                        <phase>prepare-package</phase>
+                        <goals>
+                            <goal>copy-dependencies</goal>
+                        </goals>
+                        <configuration>
+                            <excludeGroupIds>junit,org.mockito,org.hamcrest</excludeGroupIds>
+                            <outputDirectory>${project.build.directory}/app</outputDirectory>
+                            <overWriteReleases>false</overWriteReleases>
+                            <overWriteSnapshots>false</overWriteSnapshots>
+                            <overWriteIfNewer>true</overWriteIfNewer>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <version>2.5.5</version>
+                <configuration>
+                    <finalName>airfield</finalName>
+                    <appendAssemblyId>false</appendAssemblyId>
+                    <archive>
+                        <manifest>
+                            <addClasspath>true</addClasspath>
+                            <mainClass>airfield.App</mainClass>
+                        </manifest>
+                    </archive>
+                    <descriptorRefs>
+                        <descriptorRef>jar-with-dependencies</descriptorRef>
+                    </descriptorRefs>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>package-everything</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+        <finalName>airfield</finalName>
+    </build>
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+    </properties>
+</project>
\ No newline at end of file
diff --git a/src/main/java/airfield/App.java b/src/main/java/airfield/App.java
new file mode 100644
index 0000000..f94620e
--- /dev/null
+++ b/src/main/java/airfield/App.java
@@ -0,0 +1,25 @@
+package airfield;
+
+import com.airhacks.airfield.TakeDown;
+
+/**
+ *
+ * @author airhacks.com
+ */
+public class App {
+
+    public final static void main(String args[]) {
+        if (args.length != 2) {
+            usage();
+            return;
+        }
+        String local = args[0];
+        String remote = args[1];
+        TakeDown installer = new TakeDown(local, remote);
+        installer.installOrUpdate();
+    }
+
+    static void usage() {
+        System.out.println("Use: java -jar airfield.App [PATH_TO_LOCAL_APP] [PATH_TO_REMOTE_GIT_REPO]");
+    }
+}
diff --git a/src/main/java/com/airhacks/airfield/TakeDown.java b/src/main/java/com/airhacks/airfield/TakeDown.java
new file mode 100644
index 0000000..a8daf68
--- /dev/null
+++ b/src/main/java/com/airhacks/airfield/TakeDown.java
@@ -0,0 +1,71 @@
+/*
+ */
+package com.airhacks.airfield;
+
+import java.io.File;
+import java.io.IOException;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.ResetCommand;
+import org.eclipse.jgit.api.errors.GitAPIException;
+
+/**
+ *
+ * @author adam-bien.com
+ */
+public class TakeDown {
+
+    private final String remotePath;
+    private final String localPath;
+    private Git git;
+
+    public TakeDown(String localPath, String remotePath) {
+        this.remotePath = remotePath;
+        this.localPath = localPath;
+    }
+
+    void initialDownload() {
+        try {
+            this.git = Git.cloneRepository()
+                    .setURI(remotePath)
+                    .setDirectory(new File(localPath))
+                    .call();
+            System.out.println("+App installed into: " + this.localPath);
+        } catch (GitAPIException ex) {
+            System.err.println("--Cannot download files: " + ex.getMessage());
+        }
+
+    }
+
+    void update() {
+        try {
+            this.git.reset().setMode(ResetCommand.ResetType.HARD).call();
+            System.out.println("+Changed files removed");
+        } catch (GitAPIException ex) {
+            throw new IllegalStateException("Cannot reset local repository", ex);
+        }
+        this.git.pull();
+        System.out.println("+Files updated, ready to start!");
+    }
+
+    boolean openLocal() {
+        File localRepo = new File(this.localPath);
+        try {
+            this.git = Git.open(localRepo);
+        } catch (IOException ex) {
+            System.out.println("-" + ex.getMessage());
+            return false;
+        }
+        System.out.println("+Application already installed at: " + this.localPath);
+        return true;
+    }
+
+    public void installOrUpdate() {
+        boolean alreadyInstalled = openLocal();
+        if (alreadyInstalled) {
+            update();
+        } else {
+            initialDownload();
+        }
+    }
+
+}
diff --git a/src/test/java/com/airhacks/airfield/TakeDownIT.java b/src/test/java/com/airhacks/airfield/TakeDownIT.java
new file mode 100644
index 0000000..1150c17
--- /dev/null
+++ b/src/test/java/com/airhacks/airfield/TakeDownIT.java
@@ -0,0 +1,63 @@
+package com.airhacks.airfield;
+
+import java.io.IOException;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ *
+ * @author adam-bien.com
+ */
+public class TakeDownIT {
+
+    private TakeDown cut;
+    static final String LOCAL_REPO = "target/repo";
+
+    @Before
+    public void init() throws IOException {
+        Path directory = Paths.get(LOCAL_REPO);
+        if (Files.exists(directory)) {
+            Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
+                @Override
+                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+                    Files.delete(file);
+                    return FileVisitResult.CONTINUE;
+                }
+
+                @Override
+                public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+                    Files.delete(dir);
+                    return FileVisitResult.CONTINUE;
+                }
+
+            });
+        }
+        this.cut = new TakeDown(LOCAL_REPO, "git://localhost:4242/");
+    }
+
+    @Test
+    public void initialDownload() {
+        Path file = Paths.get(LOCAL_REPO + "/app.txt");
+        assertFalse(Files.exists(file));
+        this.cut.initialDownload();
+        assertTrue(Files.exists(file));
+    }
+
+    @Test
+    public void openLocal() {
+        boolean repoExists = this.cut.openLocal();
+        assertFalse(repoExists);
+        this.cut.initialDownload();
+        repoExists = this.cut.openLocal();
+        assertTrue(repoExists);
+    }
+
+}