Index: tools/autotool.py
===================================================================
--- tools/autotool.py	(revision 7367c312a2e6aa20171463840a60416c6f2d046c)
+++ tools/autotool.py	(revision 9ce911d717fa4cfa748c77718570983b7da7db3a)
@@ -849,4 +849,5 @@
 		check_app(["make", "--version"], "Make utility", "preferably GNU Make")
 		check_app(["makedepend", "-f", "-"], "Makedepend utility", "usually part of imake or xutils")
+		check_app(["unzip"], "unzip utility", "usually part of zip/unzip utilities")
 		
 		# Compiler
Index: tools/mkarray.py
===================================================================
--- tools/mkarray.py	(revision 7367c312a2e6aa20171463840a60416c6f2d046c)
+++ tools/mkarray.py	(revision 9ce911d717fa4cfa748c77718570983b7da7db3a)
@@ -28,19 +28,40 @@
 #
 """
-C structure creator
+Binary inline data packer
 """
 
 import sys
 import os
-import struct
+import zlib
+import zipfile
+import binascii
 
 def usage(prname):
 	"Print usage syntax"
-	print("%s <DESTINATION> <LABEL> <AS_PROLOG> [SOURCE ...]" % prname)
+	print("%s [--deflate] <DESTINATION> <LABEL> <AS_PROLOG> [SOURCE ...]" % prname)
+
+def arg_check():
+	if (len(sys.argv) < 4):
+		usage(sys.argv[0])
+		sys.exit()
+
+def deflate(data):
+	"Compress using deflate algorithm (without any headers)"
+	return zlib.compress(data, 9)[2:-4]
+
+def chunks(string, length):
+	"Produce string chunks"
+	for start in range(0, len(string), length):
+		yield string[start:start + length]
 
 def main():
-	if (len(sys.argv) < 4):
-		usage(sys.argv[0])
-		return
+	arg_check()
+	
+	if sys.argv[1] == "--deflate":
+		sys.argv.pop(1)
+		arg_check()
+		compress = True
+	else:
+		compress = False
 	
 	dest = sys.argv[1]
@@ -49,8 +70,13 @@
 	
 	header_ctx = []
+	desc_ctx = []
+	size_ctx = []
 	data_ctx = []
+	
+	src_cnt = 0
 	
 	for src in sys.argv[4:]:
 		basename = os.path.basename(src)
+		plainname = os.path.splitext(basename)[0]
 		symbol = basename.replace(".", "_")
 		
@@ -61,68 +87,87 @@
 		src_in.close()
 		
-		data_rec = "\t.byte "
+		length = len(src_data)
 		
-		fmt = 'B'
-		item_size = struct.calcsize(fmt)
-		offset = 0
-		cnt = 0
+		if compress:
+			src_data = deflate(src_data)
 		
-		while (len(src_data[offset:]) >= item_size):
-			byte = struct.unpack_from(fmt, src_data, offset)
-			
-			if (offset > 0):
-				if ((cnt % 15) == 0):
-					data_rec += "\n\t.byte "
-				else:
-					data_rec += ", "
-			
-			data_rec += "0x%x" % byte
-			offset += item_size
-			cnt += 1
+		if sys.version_info < (3,):
+			src_data = bytearray(src_data)
 		
-		data_rec += "\n"
+		length_out = len(src_data)
 		
-		header_ctx.append("extern uint64_t %s_size;" % symbol)
 		header_ctx.append("extern uint8_t %s[];" % symbol)
-		
-		data_ctx.append(".globl %s_size" % symbol)
-		data_ctx.append(".balign 8");
-		data_ctx.append(".size %s_size, 8" % symbol)
-		data_ctx.append("%s_size:" % symbol)
-		data_ctx.append("\t.quad %u\n" % offset)
+		header_ctx.append("extern size_t %s_size;" % symbol)
 		
 		data_ctx.append(".globl %s" % symbol)
 		data_ctx.append(".balign 8")
-		data_ctx.append(".size %s, %u" % (symbol, offset))
+		data_ctx.append(".size %s, %u" % (symbol, length_out))
 		data_ctx.append("%s:" % symbol)
-		data_ctx.append(data_rec)
+		data_ctx.append("\t.byte 0x" + ', 0x'.join(chunks(binascii.b2a_hex(src_data), 2)) + "\n")
+		
+		desc_field = []
+		desc_field.append("\t{")
+		desc_field.append("\t\t.name = \"%s\"," % plainname)
+		desc_field.append("\t\t.addr = (void *) %s," % symbol)
+		desc_field.append("\t\t.size = %u," % length_out)
+		desc_field.append("\t\t.inflated = %u" % length)
+		desc_field.append("\t}")
+		
+		desc_ctx.append("\n".join(desc_field))
+		
+		size_ctx.append("size_t %s_size = %u;" % (symbol, length_out))
+		
+		src_cnt += 1
 	
-	header = open("%s.h" % dest, "w")
+	archive = zipfile.ZipFile("%s.zip" % dest, "w", zipfile.ZIP_STORED)
 	
-	header.write('/***************************************\n')
-	header.write(' * AUTO-GENERATED FILE, DO NOT EDIT!!! *\n')
-	header.write(' * Generated by: tools/mkarray.py      *\n')
-	header.write(' ***************************************/\n\n')
-	header.write("#ifndef %s_H_\n" % label)
-	header.write("#define %s_H_\n\n" % label)
-	header.write("#include <stddef.h>\n")
-	header.write("#include <stdint.h>\n\n")
-	header.write("\n".join(header_ctx))
-	header.write("\n\n")
-	header.write("#endif\n")
+	data = ''
+	data += '/***************************************\n'
+	data += ' * AUTO-GENERATED FILE, DO NOT EDIT!!! *\n'
+	data += ' * Generated by: tools/mkarray.py      *\n'
+	data += ' ***************************************/\n\n'
+	data += "#ifndef %sS_H_\n" % label.upper()
+	data += "#define %sS_H_\n\n" % label.upper()
+	data += "#include <stddef.h>\n"
+	data += "#include <stdint.h>\n\n"
+	data += "#define %sS  %u\n\n" % (label.upper(), src_cnt)
+	data += "typedef struct {\n"
+	data += "\tconst char *name;\n"
+	data += "\tvoid *addr;\n"
+	data += "\tsize_t size;\n"
+	data += "\tsize_t inflated;\n"
+	data += "} %s_t;\n\n" % label
+	data += "extern %s_t %ss[];\n\n" % (label, label)
+	data += "\n".join(header_ctx)
+	data += "\n\n"
+	data += "#endif\n"
+	archive.writestr("%s.h" % dest, data)
 	
-	header.close()
+	data = ''
+	data += '/***************************************\n'
+	data += ' * AUTO-GENERATED FILE, DO NOT EDIT!!! *\n'
+	data += ' * Generated by: tools/mkarray.py      *\n'
+	data += ' ***************************************/\n\n'
+	data += as_prolog
+	data += '.data\n\n'
+	data += "\n".join(data_ctx)
+	data += "\n"
+	archive.writestr("%s.s" % dest, data)
 	
-	data = open("%s.s" % dest, "w")
+	data = ''
+	data += '/***************************************\n'
+	data += ' * AUTO-GENERATED FILE, DO NOT EDIT!!! *\n'
+	data += ' * Generated by: tools/mkarray.py      *\n'
+	data += ' ***************************************/\n\n'
+	data += "#include \"%s.h\"\n\n" % dest
+	data += "%s_t %ss[] = {\n" % (label, label)
+	data += ",\n".join(desc_ctx)
+	data += "\n"
+	data += "};\n\n"
+	data += "\n".join(size_ctx)
+	data += "\n"
+	archive.writestr("%s_desc.c" % dest, data)
 	
-	data.write('/***************************************\n')
-	data.write(' * AUTO-GENERATED FILE, DO NOT EDIT!!! *\n')
-	data.write(' * Generated by: tools/mkarray.py      *\n')
-	data.write(' ***************************************/\n\n')
-	data.write(as_prolog)
-	data.write('.data\n\n')
-	data.write("\n".join(data_ctx))
-	
-	data.close()
+	archive.close()
 
 if __name__ == '__main__':
Index: uspace/app/barber/Makefile
===================================================================
--- uspace/app/barber/Makefile	(revision 7367c312a2e6aa20171463840a60416c6f2d046c)
+++ uspace/app/barber/Makefile	(revision 9ce911d717fa4cfa748c77718570983b7da7db3a)
@@ -44,7 +44,11 @@
 MATH = y
 
+IMG = image
+IMGS = $(IMG)s
+
 SOURCES = \
 	barber.c \
-	images.s
+	$(IMGS).s \
+	$(IMGS)_desc.c
 
 IMAGES = \
@@ -80,9 +84,18 @@
 	gfx/frame30.tga.gz
 
-PRE_DEPEND = images.s images.h
-EXTRA_CLEAN = images.s images.h
+PRE_DEPEND = $(IMGS).s $(IMGS).h $(IMGS)_desc.c
+EXTRA_CLEAN = $(IMGS).s $(IMGS).h $(IMGS)_desc.c $(IMGS).zip
 
 include $(USPACE_PREFIX)/Makefile.common
 
-images.s images.h: $(IMAGES)
-	$(ROOT_PATH)/tools/mkarray.py images COMPOSITOR_IMAGES "$(AS_PROLOG)" $^
+$(IMGS).s: $(IMGS).zip
+	unzip -p $< $@ > $@
+
+$(IMGS).h: $(IMGS).zip
+	unzip -p $< $@ > $@
+
+$(IMGS)_desc.c: $(IMGS).zip
+	unzip -p $< $@ > $@
+
+$(IMGS).zip: $(IMAGES)
+	$(ROOT_PATH)/tools/mkarray.py $(IMGS) $(IMG) "$(AS_PROLOG)" $^
Index: uspace/app/barber/barber.c
===================================================================
--- uspace/app/barber/barber.c	(revision 7367c312a2e6aa20171463840a60416c6f2d046c)
+++ uspace/app/barber/barber.c	(revision 9ce911d717fa4cfa748c77718570983b7da7db3a)
@@ -51,5 +51,5 @@
 #define NAME  "barber"
 
-#define FRAMES  30
+#define FRAMES  IMAGES
 
 #define MIN_FPS  1
@@ -99,38 +99,8 @@
 static bool decode_frames(void)
 {
-	frames[0] = decode_tga_gz((void *) frame01_tga_gz, frame01_tga_gz_size, 0);
-	frames[1] = decode_tga_gz((void *) frame02_tga_gz, frame02_tga_gz_size, 0);
-	frames[2] = decode_tga_gz((void *) frame03_tga_gz, frame03_tga_gz_size, 0);
-	frames[3] = decode_tga_gz((void *) frame04_tga_gz, frame04_tga_gz_size, 0);
-	frames[4] = decode_tga_gz((void *) frame05_tga_gz, frame05_tga_gz_size, 0);
-	frames[5] = decode_tga_gz((void *) frame06_tga_gz, frame06_tga_gz_size, 0);
-	frames[6] = decode_tga_gz((void *) frame07_tga_gz, frame07_tga_gz_size, 0);
-	frames[7] = decode_tga_gz((void *) frame08_tga_gz, frame08_tga_gz_size, 0);
-	frames[8] = decode_tga_gz((void *) frame09_tga_gz, frame09_tga_gz_size, 0);
-	frames[9] = decode_tga_gz((void *) frame10_tga_gz, frame10_tga_gz_size, 0);
-	frames[10] = decode_tga_gz((void *) frame11_tga_gz, frame11_tga_gz_size, 0);
-	frames[11] = decode_tga_gz((void *) frame12_tga_gz, frame12_tga_gz_size, 0);
-	frames[12] = decode_tga_gz((void *) frame13_tga_gz, frame13_tga_gz_size, 0);
-	frames[13] = decode_tga_gz((void *) frame14_tga_gz, frame14_tga_gz_size, 0);
-	frames[14] = decode_tga_gz((void *) frame15_tga_gz, frame15_tga_gz_size, 0);
-	frames[15] = decode_tga_gz((void *) frame16_tga_gz, frame16_tga_gz_size, 0);
-	frames[16] = decode_tga_gz((void *) frame17_tga_gz, frame17_tga_gz_size, 0);
-	frames[17] = decode_tga_gz((void *) frame18_tga_gz, frame18_tga_gz_size, 0);
-	frames[18] = decode_tga_gz((void *) frame19_tga_gz, frame19_tga_gz_size, 0);
-	frames[19] = decode_tga_gz((void *) frame20_tga_gz, frame20_tga_gz_size, 0);
-	frames[20] = decode_tga_gz((void *) frame21_tga_gz, frame21_tga_gz_size, 0);
-	frames[21] = decode_tga_gz((void *) frame22_tga_gz, frame22_tga_gz_size, 0);
-	frames[22] = decode_tga_gz((void *) frame23_tga_gz, frame23_tga_gz_size, 0);
-	frames[23] = decode_tga_gz((void *) frame24_tga_gz, frame24_tga_gz_size, 0);
-	frames[24] = decode_tga_gz((void *) frame25_tga_gz, frame25_tga_gz_size, 0);
-	frames[25] = decode_tga_gz((void *) frame26_tga_gz, frame26_tga_gz_size, 0);
-	frames[26] = decode_tga_gz((void *) frame27_tga_gz, frame27_tga_gz_size, 0);
-	frames[27] = decode_tga_gz((void *) frame28_tga_gz, frame28_tga_gz_size, 0);
-	frames[28] = decode_tga_gz((void *) frame29_tga_gz, frame29_tga_gz_size, 0);
-	frames[29] = decode_tga_gz((void *) frame30_tga_gz, frame30_tga_gz_size, 0);
-	
-	for (unsigned int frame = 0; frame < FRAMES; frame++) {
-		if (frames[frame] == NULL) {
-			printf("Unable to decode frame %u.\n", frame);
+	for (unsigned int i = 0; i < FRAMES; i++) {
+		frames[i] = decode_tga_gz(images[i].addr, images[i].size, 0);
+		if (frames[i] == NULL) {
+			printf("Unable to decode frame %u.\n", i);
 			return false;
 		}
Index: uspace/app/vlaunch/Makefile
===================================================================
--- uspace/app/vlaunch/Makefile	(revision 7367c312a2e6aa20171463840a60416c6f2d046c)
+++ uspace/app/vlaunch/Makefile	(revision 9ce911d717fa4cfa748c77718570983b7da7db3a)
@@ -43,16 +43,29 @@
 MATH = y
 
+IMG = image
+IMGS = $(IMG)s
+
 SOURCES = \
 	vlaunch.c \
-	images.s
+	$(IMGS).s \
+	$(IMGS)_desc.c
 
 IMAGES = \
 	gfx/helenos.tga
 
-PRE_DEPEND = images.s images.h
-EXTRA_CLEAN = images.s images.h
+PRE_DEPEND = $(IMGS).s $(IMGS).h $(IMGS)_desc.c
+EXTRA_CLEAN = $(IMGS).s $(IMGS).h $(IMGS)_desc.c $(IMGS).zip
 
 include $(USPACE_PREFIX)/Makefile.common
 
-images.s images.h: $(IMAGES)
-	$(ROOT_PATH)/tools/mkarray.py images COMPOSITOR_IMAGES "$(AS_PROLOG)" $^
+$(IMGS).s: $(IMGS).zip
+	unzip -p $< $@ > $@
+
+$(IMGS).h: $(IMGS).zip
+	unzip -p $< $@ > $@
+
+$(IMGS)_desc.c: $(IMGS).zip
+	unzip -p $< $@ > $@
+
+$(IMGS).zip: $(IMAGES)
+	$(ROOT_PATH)/tools/mkarray.py $(IMGS) $(IMG) "$(AS_PROLOG)" $^
