diff --git a/Makefile b/Makefile
index d4e9b65..f0b22d3 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-VERSION   := git-20141222
+VERSION   := git-20150104
 
 PREFIX    := /usr/local
 MANPREFIX := $(PREFIX)/share/man
diff --git a/commands.c b/commands.c
index 770f780..f77add3 100644
--- a/commands.c
+++ b/commands.c
@@ -61,7 +61,7 @@ bool cg_quit(arg_t a)
 
 	if (options->to_stdout && markcnt > 0) {
 		for (i = 0; i < filecnt; i++) {
-			if (files[i].marked)
+			if (files[i].flags & FF_MARK)
 				printf("%s\n", files[i].name);
 		}
 	}
@@ -200,10 +200,10 @@ bool cg_zoom(arg_t a)
 
 bool cg_toggle_image_mark(arg_t a)
 {
-	files[fileidx].marked = !files[fileidx].marked;
-	markcnt += files[fileidx].marked ? 1 : -1;
+	files[fileidx].flags ^= FF_MARK;
+	markcnt += files[fileidx].flags & FF_MARK ? 1 : -1;
 	if (mode == MODE_THUMB)
-		tns_mark(&tns, fileidx, files[fileidx].marked);
+		tns_mark(&tns, fileidx, !!(files[fileidx].flags & FF_MARK));
 	return true;
 }
 
@@ -212,8 +212,8 @@ bool cg_reverse_marks(arg_t a)
 	int i;
 
 	for (i = 0; i < filecnt; i++) {
-		files[i].marked = !files[i].marked;
-		markcnt += files[i].marked ? 1 : -1;
+		files[i].flags ^= FF_MARK;
+		markcnt += files[i].flags & FF_MARK ? 1 : -1;
 	}
 	if (mode == MODE_THUMB)
 		tns.dirty = true;
@@ -225,7 +225,7 @@ bool cg_unmark_all(arg_t a)
 	int i;
 
 	for (i = 0; i < filecnt; i++)
-		files[i].marked = false;
+		files[i].flags &= ~FF_MARK;
 	markcnt = 0;
 	if (mode == MODE_THUMB)
 		tns.dirty = true;
@@ -242,7 +242,7 @@ bool cg_navigate_marked(arg_t a)
 		n *= prefix;
 	d = n > 0 ? 1 : -1;
 	for (i = fileidx + d; n != 0 && i >= 0 && i < filecnt; i += d) {
-		if (files[i].marked) {
+		if (files[i].flags & FF_MARK) {
 			n -= d;
 			new = i;
 		}
diff --git a/image.c b/image.c
index ee9c30d..240054f 100644
--- a/image.c
+++ b/image.c
@@ -292,7 +292,7 @@ bool img_load_gif(img_t *img, const fileinfo_t *file)
 	DGifCloseFile(gif);
 #endif
 
-	if (err && file->warn)
+	if (err && (file->flags & FF_WARN))
 		warn("corrupted gif file: %s", file->name);
 
 	if (img->multi.cnt > 1) {
@@ -321,7 +321,7 @@ bool img_load(img_t *img, const fileinfo_t *file)
 	if (access(file->path, R_OK) < 0 ||
 	    (img->im = imlib_load_image(file->path)) == NULL)
 	{
-		if (file->warn)
+		if (file->flags & FF_WARN)
 			warn("could not open image: %s", file->name);
 		return false;
 	}
diff --git a/main.c b/main.c
index 904a567..32c0888 100644
--- a/main.c
+++ b/main.c
@@ -128,7 +128,8 @@ void check_add_file(char *filename, bool given)
 
 	if (fileidx == filecnt) {
 		filecnt *= 2;
-		files = (fileinfo_t*) s_realloc(files, filecnt * sizeof(fileinfo_t));
+		files = s_realloc(files, filecnt * sizeof(*files));
+		memset(&files[filecnt/2], 0, filecnt/2 * sizeof(*files));
 	}
 
 #if defined _BSD_SOURCE || defined _XOPEN_SOURCE && \
@@ -149,7 +150,6 @@ void check_add_file(char *filename, bool given)
 	}
 #endif
 
-	files[fileidx].warn = given;
 	files[fileidx].name = s_strdup(filename);
 	if (files[fileidx].path == NULL)
 		files[fileidx].path = files[fileidx].name;
@@ -157,6 +157,8 @@ void check_add_file(char *filename, bool given)
 		files[fileidx].base = ++bn;
 	else
 		files[fileidx].base = files[fileidx].name;
+	if (given)
+		files[fileidx].flags |= FF_WARN;
 	fileidx++;
 }
 
@@ -171,7 +173,7 @@ void remove_file(int n, bool manual)
 		cleanup();
 		exit(manual ? EXIT_SUCCESS : EXIT_FAILURE);
 	}
-	if (files[n].marked)
+	if (files[n].flags & FF_MARK)
 		markcnt--;
 
 	if (files[n].path != files[n].name)
@@ -335,7 +337,7 @@ void load_image(int new)
 		else if (new > 0 && new < fileidx)
 			new--;
 	}
-	files[new].warn = false;
+	files[new].flags &= ~FF_WARN;
 	fileidx = current = new;
 
 	info.open = false;
@@ -378,7 +380,7 @@ void update_info(void)
 	if (win.bar.h == 0)
 		return;
 	for (fw = 0, i = filecnt; i > 0; fw++, i /= 10);
-	mark = files[fileidx].marked ? "* " : "";
+	mark = files[fileidx].flags & FF_MARK ? "* " : "";
 	l->p = l->buf;
 	r->p = r->buf;
 	if (mode == MODE_THUMB) {
@@ -535,7 +537,7 @@ void run_key_handler(const char *key, unsigned int mask)
 	}
 
 	for (f = i = 0; f < fcnt; i++) {
-		if ((marked && files[i].marked) || (!marked && i == fileidx)) {
+		if ((marked && (files[i].flags & FF_MARK)) || (!marked && i == fileidx)) {
 			stat(files[i].path, &oldst[f]);
 			fprintf(pfs, "%s\n", files[i].name);
 			f++;
@@ -548,7 +550,7 @@ void run_key_handler(const char *key, unsigned int mask)
 		warn("key handler exited with non-zero return value: %d", retval);
 
 	for (f = i = 0; f < fcnt; i++) {
-		if ((marked && files[i].marked) || (!marked && i == fileidx)) {
+		if ((marked && (files[i].flags & FF_MARK)) || (!marked && i == fileidx)) {
 			if (stat(files[i].path, &st) != 0 ||
 				  memcmp(&oldst[f].st_mtime, &st.st_mtime, sizeof(st.st_mtime)) != 0)
 			{
@@ -670,9 +672,9 @@ void on_buttonpress(XButtonEvent *bev)
 				break;
 			case Button3:
 				if ((sel = tns_translate(&tns, bev->x, bev->y)) >= 0) {
-					files[sel].marked = !files[sel].marked;
-					markcnt += files[sel].marked ? 1 : -1;
-					tns_mark(&tns, sel, files[sel].marked);
+					files[sel].flags ^= FF_MARK;
+					markcnt += files[sel].flags & FF_MARK ? 1 : -1;
+					tns_mark(&tns, sel, !!(files[sel].flags & FF_MARK));
 					redraw();
 				}
 				break;
@@ -818,7 +820,8 @@ int main(int argc, char **argv)
 	else
 		filecnt = options->filecnt;
 
-	files = (fileinfo_t*) s_malloc(filecnt * sizeof(fileinfo_t));
+	files = s_malloc(filecnt * sizeof(*files));
+	memset(files, 0, filecnt * sizeof(*files));
 	fileidx = 0;
 
 	if (options->from_stdin) {
diff --git a/thumbs.c b/thumbs.c
index 8051dd8..8ec7a30 100644
--- a/thumbs.c
+++ b/thumbs.c
@@ -341,7 +341,7 @@ bool tns_load(tns_t *tns, int n, bool force)
 	if (im == NULL && (access(file->path, R_OK) < 0 ||
 	    (im = imlib_load_image(file->path)) == NULL))
 	{
-		if (file->warn)
+		if (file->flags & FF_WARN)
 			warn("could not open image: %s", file->name);
 		return false;
 	}
@@ -461,7 +461,7 @@ void tns_render(tns_t *tns)
 			t->y = y + (thumb_sizes[tns->zl] - t->h) / 2;
 			imlib_context_set_image(t->im);
 			imlib_render_image_on_drawable_at_size(t->x, t->y, t->w, t->h);
-			if (tns->files[i].marked)
+			if (tns->files[i].flags & FF_MARK)
 				tns_mark(tns, i, true);
 		} else {
 			tns->loadnext = MIN(tns->loadnext, i);
@@ -520,7 +520,7 @@ void tns_highlight(tns_t *tns, int n, bool hl)
 		win_draw_rect(win, t->x - oxy, t->y - oxy, t->w + owh, t->h + owh,
 		              false, tns->bw, col);
 
-		if (tns->files[n].marked)
+		if (tns->files[n].flags & FF_MARK)
 			tns_mark(tns, n, true);
 	}
 }
diff --git a/types.h b/types.h
index 78022bd..c573d13 100644
--- a/types.h
+++ b/types.h
@@ -64,12 +64,16 @@ typedef enum {
 	CURSOR_WATCH
 } cursor_t;
 
+typedef enum {
+	FF_WARN = 1,
+	FF_MARK = 2
+} fileflags_t;
+
 typedef struct {
 	const char *name; /* as given by user */
 	const char *path; /* always absolute */
 	const char *base;
-	bool warn;
-	bool marked;
+	fileflags_t flags;
 } fileinfo_t;
 
 /* timeouts in milliseconds: */