diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..625655d77eec803589cd20322ddfd93cd7f1ca37
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,62 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
+PROJECT(moose-all)
+
+## intialize paths
+set(MOOSE_CORE_DIR "${CMAKE_SOURCE_DIR}/moose-core")
+set(MOOSE_CORE_BUILD_DIR ${CMAKE_BINARY_DIR}/_build_moose_core)
+FILE(MAKE_DIRECTORY ${MOOSE_CORE_BUILD_DIR})
+set(DATA_DIR ${CMAKE_SOURCE_DIR}/data)
+
+add_custom_command(OUTPUT __moose_core_built__
+    COMMAND ${CMAKE_COMMAND} 
+        -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
+        -DDEBUG=OFF
+        ${MOOSE_CORE_DIR}
+    COMMAND $(MAKE)
+    WORKING_DIRECTORY ${MOOSE_CORE_BUILD_DIR}
+    VERBATIM
+    )
+
+add_custom_target(moose-all ALL
+    DEPENDS __moose_core_built__
+    )
+
+install(CODE
+    "
+    execute_process(COMMAND ctest --output-on-failure
+        WORKING_DIRECTORY ${MOOSE_CORE_BUILD_DIR})
+
+    execute_process(COMMAND ${CMAKE_COMMAND} install
+        WORKING_DIRECTORY ${MOOSE_CORE_BUILD_DIR})
+    "
+    )
+
+## moose-gui
+## TODO: moose-gui should be a python module.
+set(MOOSE_GUI_DIR ${CMAKE_SOURCE_DIR}/moose-gui)
+
+install(DIRECTORY ${MOOSE_GUI_DIR}
+    DESTINATION lib/moose/gui
+    PATTERN ".git" EXCLUDE
+    )
+
+install(PROGRAMS ${DATA_DIR}/moosegui
+    DESTINATION bin
+    )
+
+## UNINSTALL
+add_custom_target(uninstall 
+    DEPENDS __uninstall_moose-core__ __uninstall_moose-gui__
+    )
+
+add_custom_command(OUTPUT __uninstall_moose-core__
+    COMMAND make uninstall
+    WORKING_DIRECTORY ${MOOSE_CORE_BUILD_DIR}
+    )
+
+add_custom_command(OUTPUT  __uninstall_moose-gui__
+    COMMAND ${CMAKE_COMMAND} -E remove_directory
+    ${CMAKE_INSTALL_PREFIX}/lib/moose
+    COMMAND ${CMAKE_COMMAND} -R remove ${CMAKE_INSTALL_PREFIX}/bin/moosegui
+    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+    )
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 2364f261a503841ee75808ed52ed852d5b434d63..0000000000000000000000000000000000000000
--- a/Makefile
+++ /dev/null
@@ -1,22 +0,0 @@
-PWD:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
-MOOSECORE_DIR=$(PWD)/moose-core
-MOOSEGUI_DIR=$(PWD)/moose-gui
-
-MOOSECORE_BUILD_DIR=_moose_core_build_dir_
-
-## Prefix 
-PREFIX:=/usr
-
-all: build_moose
-
-build_moose: build_moose_core build_moose_gui
-
-build_moose_core: configure_moose_core 
-	cd $(MOOSECORE_BUILD_DIR) && $(MAKE)
-
-configure_moose_core:
-	mkdir -p $(MOOSECORE_BUILD_DIR)
-	cd $(MOOSECORE_BUILD_DIR) 
-	cmake -DCMAKE_INSTALL_PREFIX=$(PREFIX) $(MOOSECORE_DIR)
-
-
diff --git a/data/Makefile b/data/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..1cbf0edfe60c4e3c582927ec13ac860f7d7ba605
--- /dev/null
+++ b/data/Makefile
@@ -0,0 +1,30 @@
+PWD:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
+MOOSECORE_DIR=$(PWD)/moose-core
+MOOSEGUI_DIR=$(PWD)/moose-gui
+
+MOOSECORE_BUILD_DIR=_moose_core_build_dir_
+
+MOOSEBIN:=$(MOOSECORE_BUILD_DIR)/moose.bin
+MOOSESDIST:=$(MOOSECORE_BUILD_DIR)/moose-3.0.2.tar.gz
+
+## Prefix 
+PREFIX:=/usr
+
+all: build_moose
+
+build_moose: build_moose_core build_moose_gui
+
+build_moose_core $(MOOSEBIN) $(MOOSESDIST): configure_moose_core 
+	cd $(MOOSECORE_BUILD_DIR) && make -j`proc`
+
+configure_moose_core:
+	echo "Configuring moose-core"
+	mkdir -p $(MOOSECORE_BUILD_DIR)
+	cd $(MOOSECORE_BUILD_DIR) && cmake -DCMAKE_INSTALL_PREFIX=$(PREFIX) $(MOOSECORE_DIR)
+
+
+clean:
+	git clean -fxd
+
+
+.PNONY: clean uninstall install