diff --git a/resources.cpp b/resources.cpp
new file mode 100644
index 0000000..2f2ea95
--- /dev/null
+++ b/resources.cpp
@@ -0,0 +1,280 @@
+// resource.cpp - Source to manage GUI resources
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/reboot.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <string>
+#include <sstream>
+#include <iostream>
+#include <iomanip>
+
+extern "C" {
+#include "../common.h"
+#include "../minuitwrp/minui.h"
+#include "../recovery_ui.h"
+}
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+
+#define TMP_RESOURCE_NAME   "/tmp/extract.bin"
+
+Resource::Resource(xml_node<>* node, ZipArchive* pZip)
+{
+    if (node && node->first_attribute("name"))
+        mName = node->first_attribute("name")->value();
+}
+
+
+int Resource::ExtractResource(ZipArchive* pZip, 
+                              std::string folderName, 
+                              std::string fileName, 
+                              std::string fileExtn, 
+                              std::string destFile)
+{
+    if (!pZip)  return -1;
+
+    std::string src = folderName + "/" + fileName + fileExtn;
+
+	const ZipEntry* binary = mzFindZipEntry(pZip, src.c_str());
+    if (binary == NULL) {
+        return -1;
+	}
+
+    unlink(destFile.c_str());
+    int fd = creat(destFile.c_str(), 0666);
+    if (fd < 0)
+        return -1;
+
+    int ret = 0;
+    if (!mzExtractZipEntryToFile(pZip, binary, fd))
+        ret = -1;
+
+    close(fd);
+    return ret;
+}
+
+FontResource::FontResource(xml_node<>* node, ZipArchive* pZip)
+ : Resource(node, pZip)
+{
+    std::string file;
+
+    mFont = NULL;
+    if (!node)  return;
+
+    if (node->first_attribute("filename"))
+        file = node->first_attribute("filename")->value();
+
+    if (ExtractResource(pZip, "fonts", file, ".dat", TMP_RESOURCE_NAME) == 0)
+    {
+        mFont = gr_loadFont(TMP_RESOURCE_NAME);
+        unlink(TMP_RESOURCE_NAME);
+    }
+    else
+    {
+        mFont = gr_loadFont(file.c_str());
+    }
+}
+
+FontResource::~FontResource()
+{
+}
+
+ImageResource::ImageResource(xml_node<>* node, ZipArchive* pZip)
+ : Resource(node, pZip)
+{
+    std::string file;
+
+    mSurface = NULL;
+    if (!node)  return;
+
+    if (node->first_attribute("filename"))
+        file = node->first_attribute("filename")->value();
+
+    if (ExtractResource(pZip, "images", file, ".png", TMP_RESOURCE_NAME) == 0)
+    {
+        res_create_surface(TMP_RESOURCE_NAME, &mSurface);
+        unlink(TMP_RESOURCE_NAME);
+    } else if (ExtractResource(pZip, "images", file, "", TMP_RESOURCE_NAME) == 0)
+    {
+        // JPG includes the .jpg extension in the filename so extension should be blank
+		res_create_surface(TMP_RESOURCE_NAME, &mSurface);
+        unlink(TMP_RESOURCE_NAME);
+    }
+    else
+		res_create_surface(file.c_str(), &mSurface);
+}
+
+ImageResource::~ImageResource()
+{
+    if (mSurface)
+        res_free_surface(mSurface);
+}
+
+AnimationResource::AnimationResource(xml_node<>* node, ZipArchive* pZip)
+ : Resource(node, pZip)
+{
+    std::string file;
+    int fileNum = 1;
+
+    if (!node)  return;
+
+    if (node->first_attribute("filename"))
+        file = node->first_attribute("filename")->value();
+
+    for ( ; ; )
+    {
+        std::ostringstream fileName;
+        fileName << file << std::setfill ('0') << std::setw (3) << fileNum;
+
+        gr_surface surface;
+        if (pZip)
+        {
+            if (ExtractResource(pZip, "images", fileName.str(), ".png", TMP_RESOURCE_NAME) != 0)
+                break;
+    
+            if (res_create_surface(TMP_RESOURCE_NAME, &surface))
+                break;
+
+            unlink(TMP_RESOURCE_NAME);
+        }
+        else
+        {
+            if (res_create_surface(fileName.str().c_str(), &surface))
+                break;
+        }
+        mSurfaces.push_back(surface);
+        fileNum++;
+    }
+}
+
+AnimationResource::~AnimationResource()
+{
+    std::vector<gr_surface>::iterator it;
+
+    for (it = mSurfaces.begin(); it != mSurfaces.end(); ++it)
+    {
+        res_free_surface(*it);
+    }
+    mSurfaces.clear();
+}
+
+Resource* ResourceManager::FindResource(std::string name)
+{
+    std::vector<Resource*>::iterator iter;
+
+    for (iter = mResources.begin(); iter != mResources.end(); iter++)
+    {
+        if (name == (*iter)->GetName())
+            return (*iter);
+    }
+    return NULL;
+}
+
+ResourceManager::ResourceManager(xml_node<>* resList, ZipArchive* pZip)
+{
+    xml_node<>* child;
+
+    if (!resList)       return;
+
+    child = resList->first_node("resource");
+    while (child != NULL)
+    {
+        xml_attribute<>* attr = child->first_attribute("type");
+        if (!attr)
+            break;
+
+		std::string type = attr->value();
+
+        if (type == "font")
+        {
+            FontResource* res = new FontResource(child, pZip);
+            if (res == NULL || res->GetResource() == NULL)
+            {
+                xml_attribute<>* attr_name = child->first_attribute("name");
+
+				if (!attr_name) {
+					std::string res_name = attr_name->value();
+					LOGE("Resource (%s)-(%s) failed to load\n", type.c_str(), res_name.c_str());
+				} else
+					LOGE("Resource type (%s) failed to load\n", type.c_str());
+
+                delete res;
+            }
+            else
+            {
+                mResources.push_back((Resource*) res);
+            }
+        }
+        else if (type == "image")
+        {
+			ImageResource* res = new ImageResource(child, pZip);
+            if (res == NULL || res->GetResource() == NULL)
+            {
+                xml_attribute<>* attr_name = child->first_attribute("name");
+
+				if (!attr_name) {
+					std::string res_name = attr_name->value();
+					LOGE("Resource (%s)-(%s) failed to load\n", type.c_str(), res_name.c_str());
+				} else
+					LOGE("Resource type (%s) failed to load\n", type.c_str());
+
+                delete res;
+            }
+            else
+            {
+				mResources.push_back((Resource*) res);
+            }
+        }
+        else if (type == "animation")
+        {
+            AnimationResource* res = new AnimationResource(child, pZip);
+            if (res == NULL || res->GetResource() == NULL)
+            {
+                xml_attribute<>* attr_name = child->first_attribute("name");
+
+				if (!attr_name) {
+					std::string res_name = attr_name->value();
+					LOGE("Resource (%s)-(%s) failed to load\n", type.c_str(), res_name.c_str());
+				} else
+					LOGE("Resource type (%s) failed to load\n", type.c_str());
+
+                delete res;
+            }
+            else
+            {
+                mResources.push_back((Resource*) res);
+            }
+        }
+        else
+        {
+            LOGE("Resource type (%s) not supported.\n", type.c_str());
+        }
+
+        child = child->next_sibling("resource");
+    }
+}
+
+ResourceManager::~ResourceManager()
+{
+    std::vector<Resource*>::iterator iter;
+
+    for (iter = mResources.begin(); iter != mResources.end(); iter++)
+    {
+        delete *iter;
+    }
+    mResources.clear();
+}
+
