diff --git a/Makefile b/Makefile
index 68521b8..aca4f6e 100644
--- a/Makefile
+++ b/Makefile
@@ -57,6 +57,7 @@ LKCD_TRACE_HFILES=lkcd_x86_trace.h
 IBM_HFILES=ibm_common.h
 SADUMP_HFILES=sadump.h
 UNWIND_HFILES=unwind.h unwind_i.h rse.h unwind_x86.h unwind_x86_64.h
+VMWARE_HFILES=vmware_vmss.h
 
 CFILES=main.c tools.c global_data.c memory.c filesys.c help.c task.c \
 	kernel.c test.c gdb_interface.c configure.c net.c dev.c \
@@ -69,12 +70,13 @@ CFILES=main.c tools.c global_data.c memory.c filesys.c help.c task.c \
 	unwind_x86_32_64.c unwind_arm.c \
 	xen_hyper.c xen_hyper_command.c xen_hyper_global_data.c \
 	xen_hyper_dump_tables.c kvmdump.c qemu.c qemu-load.c sadump.c ipcs.c \
-	ramdump.c
+	ramdump.c \
+	vmware_vmss.c
 
 SOURCE_FILES=${CFILES} ${GENERIC_HFILES} ${MCORE_HFILES} \
 	${REDHAT_CFILES} ${REDHAT_HFILES} ${UNWIND_HFILES} \
 	${LKCD_DUMP_HFILES} ${LKCD_TRACE_HFILES} ${LKCD_OBSOLETE_HFILES}\
-	${IBM_HFILES} ${SADUMP_HFILES}
+	${IBM_HFILES} ${SADUMP_HFILES} ${VMWARE_HFILES}
 
 OBJECT_FILES=main.o tools.o global_data.o memory.o filesys.o help.o task.o \
 	build_data.o kernel.o test.o gdb_interface.o net.o dev.o \
@@ -87,7 +89,8 @@ OBJECT_FILES=main.o tools.o global_data.o memory.o filesys.o help.o task.o \
 	unwind_x86_32_64.o unwind_arm.o \
 	xen_hyper.o xen_hyper_command.o xen_hyper_global_data.o \
 	xen_hyper_dump_tables.o kvmdump.o qemu.o qemu-load.o sadump.o ipcs.o \
-	ramdump.o
+	ramdump.o \
+	vmware_vmss.o
 
 MEMORY_DRIVER_FILES=memory_driver/Makefile memory_driver/crash.c memory_driver/README
 
@@ -493,6 +496,9 @@ xen_hyper_dump_tables.o: ${GENERIC_HFILES} xen_hyper_dump_tables.c
 ramdump.o: ${GENERIC_HFILES} ${REDHAT_HFILES} ramdump.c
 	${CC} -c ${CRASH_CFLAGS} ramdump.c ${WARNING_OPTIONS} ${WARNING_ERROR}
 
+vmware_vmss.o: ${GENERIC_HFILES} ${VMWARE_HFILES} vmware_vmss.c
+	${CC} -c ${CRASH_CFLAGS} vmware_vmss.c ${WARNING_OPTIONS} ${WARNING_ERROR}
+
 ${PROGRAM}: force
 	@make --no-print-directory all
 
diff --git a/defs.h b/defs.h
index 2e52bc4..7c3bfd2 100644
--- a/defs.h
+++ b/defs.h
@@ -198,7 +198,7 @@ struct number_option {
 #define IN_GDB                  (0x20000ULL)
 #define RCLOCAL_IFILE           (0x40000ULL)
 #define RCHOME_IFILE            (0x80000ULL)
-#define GET_TIMESTAMP          (0x100000ULL)
+#define VMWARE_VMSS            (0x100000ULL)
 #define READLINE               (0x200000ULL) 
 #define _SIGINT_               (0x400000ULL)
 #define IN_RESTART             (0x800000ULL)
@@ -247,8 +247,8 @@ struct number_option {
 #define ACTIVE()            (pc->flags & LIVE_SYSTEM)
 #define DUMPFILE()          (!(pc->flags & LIVE_SYSTEM))
 #define LIVE()              (pc->flags2 & LIVE_DUMP || pc->flags & LIVE_SYSTEM)
-#define MEMORY_SOURCES (NETDUMP|KDUMP|MCLXCD|LKCD|DEVMEM|S390D|MEMMOD|DISKDUMP|XENDUMP|CRASHBUILTIN|KVMDUMP|PROC_KCORE|SADUMP)
-#define DUMPFILE_TYPES      (DISKDUMP|NETDUMP|KDUMP|MCLXCD|LKCD|S390D|XENDUMP|KVMDUMP|SADUMP)
+#define MEMORY_SOURCES (NETDUMP|KDUMP|MCLXCD|LKCD|DEVMEM|S390D|MEMMOD|DISKDUMP|XENDUMP|CRASHBUILTIN|KVMDUMP|PROC_KCORE|SADUMP|VMWARE_VMSS)
+#define DUMPFILE_TYPES      (DISKDUMP|NETDUMP|KDUMP|MCLXCD|LKCD|S390D|XENDUMP|KVMDUMP|SADUMP|VMWARE_VMSS)
 #define REMOTE()            (pc->flags2 & REMOTE_DAEMON)
 #define REMOTE_ACTIVE()     (pc->flags & REM_LIVE_SYSTEM) 
 #define REMOTE_DUMPFILE() \
@@ -613,6 +613,7 @@ struct new_utsname {
 #define RELOC_AUTO                  (0x1ULL)
 #define KASLR                       (0x2ULL)
 #define KASLR_CHECK                 (0x4ULL)
+#define GET_TIMESTAMP               (0x8ULL)
 
 #define XEN()       (kt->flags & ARCH_XEN)
 #define OPENVZ()    (kt->flags & ARCH_OPENVZ)
@@ -5711,6 +5712,15 @@ void remote_clear_pipeline(void);
 int remote_memory_read(int, char *, int, physaddr_t, int);
 
 /*
+ * vmware_vmss.c
+ */
+int is_vmware_vmss(char *filename);
+int vmware_vmss_init(char *filename, FILE *ofp);
+uint vmware_vmss_page_size(void);
+int read_vmware_vmss(int, void *, int, ulong, physaddr_t);
+int write_vmware_vmss(int, void *, int, ulong, physaddr_t);
+
+/*
  *  gnu_binutils.c
  */
 
diff --git a/filesys.c b/filesys.c
index 1896f55..6a56e54 100644
--- a/filesys.c
+++ b/filesys.c
@@ -242,6 +242,10 @@ memory_source_init(void)
 			if (!s390_dump_init(pc->dumpfile))
 				error(FATAL, "%s: initialization failed\n",
                                         pc->dumpfile);
+		} else if (pc->flags & VMWARE_VMSS) {
+			if (!vmware_vmss_init(pc->dumpfile, fp))
+				error(FATAL, "%s: initialization failed\n",
+                                        pc->dumpfile);
 		}
 	}
 }
diff --git a/kernel.c b/kernel.c
index 1cb0967..7e2dc13 100644
--- a/kernel.c
+++ b/kernel.c
@@ -201,7 +201,7 @@ kernel_init()
 	MEMBER_OFFSET_INIT(timekeeper_xtime_sec, "timekeeper", "xtime_sec");
 	get_xtime(&kt->date);
 	
-	if (pc->flags & GET_TIMESTAMP) {
+	if (pc->flags2 & GET_TIMESTAMP) {
         	fprintf(fp, "%s\n\n", 
 			strip_linefeeds(ctime(&kt->date.tv_sec)));
 		clean_exit(0);
diff --git a/main.c b/main.c
index d16ef12..18851df 100644
--- a/main.c
+++ b/main.c
@@ -336,7 +336,7 @@ main(int argc, char **argv)
 			break;
 
 		case 't':
-			pc->flags |= GET_TIMESTAMP;
+			pc->flags2 |= GET_TIMESTAMP;
 			break;
 
 		case 'i':
@@ -640,6 +640,12 @@ main(int argc, char **argv)
 				pc->readmem = read_sadump;
 				pc->writemem = write_sadump;
 
+			} else if (is_vmware_vmss(argv[optind])) {
+				pc->flags |= VMWARE_VMSS;
+				pc->dumpfile = argv[optind];
+				pc->readmem = read_vmware_vmss;
+				pc->writemem = write_vmware_vmss;
+
 			} else { 
 				error(INFO, 
 				    "%s: not a supported file format\n",
@@ -1689,6 +1695,8 @@ readmem_function_name(void)
 		return("read_s390_dumpfile");
 	else if (pc->readmem == read_ramdump)
 		return("read_ramdump");
+	else if (pc->readmem == read_vmware_vmss)
+		return("read_vmware_vmss");
 	else
 		return NULL;
 }
diff --git a/memory.c b/memory.c
index 3ac928d..71646b7 100644
--- a/memory.c
+++ b/memory.c
@@ -15926,6 +15926,10 @@ memory_page_size(void)
 		psz = sadump_page_size();
 		break;
 
+	case VMWARE_VMSS:
+		psz = vmware_vmss_page_size();
+		break;
+
 	default:
 		psz = 0;
 		error(FATAL, "memory_page_size: invalid pc->flags: %lx\n", 
diff --git a/vmware_vmss.c b/vmware_vmss.c
new file mode 100644
index 0000000..d49e460
--- /dev/null
+++ b/vmware_vmss.c
@@ -0,0 +1,301 @@
+/*
+ * vmware_vmss.c
+ *
+ * Copyright (c) 2015 VMware, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * Author: Dyno Hongjun Fu <hfu@vmware.com>
+ */
+
+#include "defs.h"
+#include "vmware_vmss.h"
+
+#define LOGPRX "vmw: "
+
+static vmssdata vmss = { 0 };
+
+int
+is_vmware_vmss(char *filename)
+{
+	struct cptdumpheader hdr;
+	FILE *fp;
+
+        if ((fp = fopen(filename, "r")) == NULL) {
+		error(INFO, LOGPRX"%s: %s\n", filename, strerror(errno));
+		return FALSE;
+        }
+
+	if (fread(&hdr, sizeof(cptdumpheader), 1, fp) != 1) {
+		fclose(fp);
+		return FALSE;
+	}
+
+	if (hdr.id != CPTDUMP_OLD_MAGIC_NUMBER &&
+	    hdr.id != CPTDUMP_MAGIC_NUMBER &&
+	    hdr.id != CPTDUMP_PARTIAL_MAGIC_NUMBER &&
+	    hdr.id != CPTDUMP_RESTORED_MAGIC_NUMBER &&
+	    hdr.id != CPTDUMP_NORESTORE_MAGIC_NUMBER) {
+		fprintf(stderr, LOGPRX"Unrecognized .vmss file (magic %x).\n", hdr.id);
+		return FALSE;
+	}
+
+	return TRUE;
+}
+
+int
+vmware_vmss_init(char *filename, FILE *ofp)
+{
+	cptdumpheader hdr;
+	cptgroupdesc *grps;
+	unsigned grpsize;
+	unsigned i;
+	FILE *fp;
+
+	if (!machine_type("X86") && !machine_type("X86_64")) {
+		error(FATAL,
+		      LOGPRX"invalid or unsupported host architecture for .vmss file: %s\n",
+		      MACHINE_TYPE);
+		return FALSE;
+	}
+
+        if ((fp = fopen(filename, "r")) == NULL) {
+		error(INFO, LOGPRX"%s: %s\n", filename, strerror(errno));
+		return FALSE;
+        }
+
+	vmss.dfp = fp;
+	vmss.ofp = ofp;
+
+	if (fread(&hdr, sizeof(cptdumpheader), 1, vmss.dfp) != 1)
+		return FALSE;
+	DEBUG_PARSE_PRINT((vmss.ofp, LOGPRX"Header: id=%x version=%d numgroups=%d\n",
+			   hdr.id, hdr.version, hdr.numgroups));
+
+	vmss.cpt64bit = (hdr.id != CPTDUMP_OLD_MAGIC_NUMBER);
+	DEBUG_PARSE_PRINT((vmss.ofp, LOGPRX"Checkpoint is %d-bit\n",
+			   vmss.cpt64bit ? 64 : 32));
+	if (!vmss.cpt64bit) {
+		fprintf(vmss.ofp, LOGPRX"Not implemented for 32-bit VMSS file!\n");
+		return FALSE;
+	}
+
+	grpsize = hdr.numgroups * sizeof (cptgroupdesc);
+	grps = (cptgroupdesc *) malloc(grpsize * sizeof(cptgroupdesc));
+	if (grps == NULL) {
+		fprintf(vmss.ofp, LOGPRX"Out of memory! failed to allocate groups.\n");
+		return FALSE;
+	}
+
+	if (fread(grps, sizeof(cptgroupdesc), grpsize, vmss.dfp) != grpsize) {
+		fprintf(vmss.ofp, LOGPRX"Cannot read VMSS groups in %s!\n", filename);
+		free(grps);
+		return FALSE;
+	}
+
+	for (i = 0; i < hdr.numgroups; i++) {
+		if (fseek(vmss.dfp, grps[i].position, SEEK_SET) == -1) {
+			fprintf(vmss.ofp, LOGPRX"Bad offset of VMSS Group['%s'] in '%s' at %#lx.\n",
+				grps[i].name, filename, grps[i].position);
+			continue;
+		}
+		DEBUG_PARSE_PRINT((vmss.ofp, LOGPRX"Group: %-20s offset=%#lx size=0x%#lx.\n",
+				  grps[i].name, grps[i].position, grps[i].size));
+
+		if (strcmp(grps[i].name, "memory") != 0) {
+			continue;
+		}
+
+		for (;;) {
+			uint16_t tag;
+			char name[TAG_NAMELEN_MASK + 1];
+			unsigned nameLen;
+			unsigned nindx;
+			int idx[3];
+			unsigned j;
+
+			if (fread(&tag, sizeof(tag), 1, vmss.dfp) != 1) {
+				fprintf(vmss.ofp, LOGPRX"Cannot read tag.\n");
+				break;
+			}
+			if (tag == NULL_TAG)
+				break;
+
+			nameLen = TAG_NAMELEN(tag);
+			if (fread(name, nameLen, 1, vmss.dfp) != 1) {
+				fprintf(vmss.ofp, LOGPRX"Cannot read tag name.\n");
+				break;
+			}
+			name[nameLen] = 0;
+			DEBUG_PARSE_PRINT((vmss.ofp, LOGPRX"\t Item %20s",
+					   name));
+
+			nindx = TAG_NINDX(tag);
+			if (nindx > 3) {
+				fprintf(vmss.ofp, LOGPRX"Cannot handle %d indexes\n", nindx);
+				break;
+			}
+			idx[0] = idx[1] = idx[2] = NO_INDEX;
+			for (j= 0; j < nindx; j++) {
+				if (fread(&idx[j], sizeof(idx[0]), 1, vmss.dfp) != 1) {
+					fprintf(vmss.ofp, LOGPRX"Cannot read index.\n");
+					break;
+				}
+				DEBUG_PARSE_PRINT((vmss.ofp, "[%d]", idx[j]));
+			}
+
+			if (IS_BLOCK_TAG(tag)) {
+				uint64_t nbytes;
+				uint64_t blockpos;
+				uint64_t nbytesinmem;
+				int compressed = IS_BLOCK_COMPRESSED_TAG(tag);
+				uint16_t padsize;
+
+				if (fread(&nbytes, sizeof(nbytes), 1, vmss.dfp) != 1) {
+					fprintf(vmss.ofp, LOGPRX"Cannot read block size.\n");
+					break;
+				}
+				if (fread(&nbytesinmem, sizeof(nbytesinmem), 1, vmss.dfp) != 1) {
+					fprintf(vmss.ofp, LOGPRX"Cannot read block memory size.\n");
+					break;
+				}
+				if (fread(&padsize, sizeof(padsize), 1, vmss.dfp) != 1) {
+					fprintf(vmss.ofp, LOGPRX"Cannot read block padding size.\n");
+					break;
+				}
+				if ((blockpos = ftell(vmss.dfp)) == -1) {
+					fprintf(vmss.ofp, LOGPRX"Cannot determine location within VMSS file.\n");
+					break;
+				}
+				blockpos += padsize;
+
+				if (fseek(vmss.dfp, blockpos + nbytes, SEEK_SET) == -1) {
+					fprintf(vmss.ofp, LOGPRX"Cannot seek past block at %#lx.\n",
+						blockpos + nbytes);
+					break;
+				}
+
+				/* The things that we really care about...*/
+				if (strcmp(grps[i].name, "memory") == 0 &&
+				    strcmp(name, "Memory") == 0) {
+					vmss.memoffset = blockpos;
+					vmss.memsize = nbytesinmem;
+				}
+
+				DEBUG_PARSE_PRINT((vmss.ofp, "\t=> %sBLOCK: position=%#lx size=%#lx memsize=%#lx\n",
+						  compressed ? "COMPRESSED " : "",
+						  blockpos, nbytes, nbytesinmem));
+
+			} else {
+				uint8_t val[TAG_VALSIZE_MASK];
+				unsigned k;
+				unsigned valsize = TAG_VALSIZE(tag);
+				uint64_t blockpos = ftell(vmss.dfp);
+
+				DEBUG_PARSE_PRINT((vmss.ofp, "\t=> position=%#lx size=%#x: ", blockpos, valsize));
+				if (fread(val, sizeof(val[0]), valsize, vmss.dfp) != valsize) {
+					fprintf(vmss.ofp, LOGPRX"Cannot read item.\n");
+					break;
+				}
+				for (k = 0; k < valsize; k++) {
+					/* Assume Little Endian */
+					DEBUG_PARSE_PRINT((vmss.ofp, "%02X", val[valsize - k - 1]));
+				}
+
+				if (strcmp(grps[i].name, "memory") == 0) {
+					if (strcmp(name, "regionsCount") == 0) {
+						vmss.regionscount = (uint32_t) *val;
+						if (vmss.regionscount != 0) {
+							fprintf(vmss.ofp, LOGPRX"regionsCount=%d (!= 0) NOT TESTED!",
+							        vmss.regionscount);
+						}
+					}
+					if (strcmp(name, "align_mask") == 0) {
+						vmss.alignmask = (uint32_t) *val;
+						if (vmss.alignmask != 0xff) {
+							fprintf(vmss.ofp, LOGPRX"align_mask=%d (!= 0xff) NOT TESTED!",
+							        vmss.regionscount);
+						}
+					}
+				}
+
+				DEBUG_PARSE_PRINT((vmss.ofp, "\n"));
+			}
+		}
+	}
+
+	free(grps);
+
+	if (vmss.memsize == 0) {
+		char *vmem_filename, *p;
+
+		fprintf(vmss.ofp, LOGPRX"Memory dump is not part of this vmss file.\n");
+		fclose(vmss.dfp);
+
+		fprintf(vmss.ofp, LOGPRX"Try to locate the companion vmem file ...\n");
+		/* check the companion vmem file */
+		vmem_filename = strdup(filename);
+		p = vmem_filename + strlen(vmem_filename) - 4;
+		if (strcmp(p, "vmss") != 0 && strcmp(p, "vmsn") != 0) {
+			free(vmem_filename);
+			return FALSE;
+		}
+		strcpy(p, "vmem");
+		if ((fp = fopen(vmem_filename, "r")) == NULL) {
+			free(vmem_filename);
+			error(INFO, LOGPRX"%s: %s\n", vmem_filename, strerror(errno));
+			return FALSE;
+		}
+		vmss.dfp = fp;
+		fseek(vmss.dfp, 0L, SEEK_END);
+		vmss.memsize = ftell(vmss.dfp);
+		fseek(vmss.dfp, 0L, SEEK_SET);
+
+		fprintf(vmss.ofp, LOGPRX"vmem file: %s\n\n", vmem_filename);
+		free(vmem_filename);
+	}
+
+	return TRUE;
+}
+
+uint vmware_vmss_page_size(void)
+{
+	return 4096;
+}
+
+int
+read_vmware_vmss(int fd, void *bufptr, int cnt, ulong addr, physaddr_t paddr)
+{
+	uint64_t pos = vmss.memoffset + paddr;
+
+	if (pos + cnt > vmss.memoffset + vmss.memsize) {
+		cnt -= ((pos + cnt) - (vmss.memoffset + vmss.memsize));
+		if (cnt < 0) {
+			error(INFO, LOGPRX"Read beyond the end of file! paddr=%#lx\n",
+			      paddr);
+		}
+	}
+
+        if (fseek(vmss.dfp, pos, SEEK_SET) != 0)
+		return SEEK_ERROR;
+
+        if (fread(bufptr, 1 , cnt, vmss.dfp) != cnt)
+		return READ_ERROR;
+
+	return cnt;
+}
+
+int
+write_vmware_vmss(int fd, void *bufptr, int cnt, ulong addr, physaddr_t paddr)
+{
+	return SEEK_ERROR;
+}
+
diff --git a/vmware_vmss.h b/vmware_vmss.h
new file mode 100644
index 0000000..dcbde2d
--- /dev/null
+++ b/vmware_vmss.h
@@ -0,0 +1,103 @@
+/*
+ * vmware_vmss.h
+ *
+ * Copyright (c) 2015 VMware, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * Author: Dyno Hongjun Fu <hfu@vmware.com>
+ */
+
+#define CPTDUMP_OLD_MAGIC_NUMBER       0xbed0bed0
+#define CPTDUMP_MAGIC_NUMBER           0xbed2bed2
+#define CPTDUMP_PARTIAL_MAGIC_NUMBER   0xbed3bed3
+
+#define CPTDUMP_RESTORED_MAGIC_NUMBER  0xbad1bad1
+#define CPTDUMP_NORESTORE_MAGIC_NUMBER 0xbad2bad2
+/*
+ * Poor man's bit fields
+ * TAG: | NAMELEN | NINDX | VALSIZE |
+ * bits |15      8|7     6|5       0|
+ * size |    8    |   2   |    6    |
+ */
+#define TAG_NAMELEN_MASK   0xFF
+#define TAG_NAMELEN_OFFSET    8
+#define TAG_NINDX_MASK      0x3
+#define TAG_NINDX_OFFSET      6
+#define TAG_VALSIZE_MASK   0x3F
+#define TAG_VALSIZE_OFFSET    0
+#define TAG_SIZE              2
+
+/*
+ * The value size has two special values to indicate blocks and compressed
+ * blocks.
+ */
+#define TAG_ISBLOCK TAG_VALSIZE_MASK
+#define TAG_ISBLOCK_COMPRESSED (TAG_VALSIZE_MASK-1)
+
+#define MAKE_TAG(_nl, _nidx, _nb) \
+        (((_nl)  & TAG_NAMELEN_MASK) << TAG_NAMELEN_OFFSET | \
+        ((_nidx) & TAG_NINDX_MASK)   << TAG_NINDX_OFFSET   | \
+        ((_nb)   & TAG_VALSIZE_MASK) << TAG_VALSIZE_OFFSET)
+
+#define TAG_NAMELEN(_tag) (((_tag) >> TAG_NAMELEN_OFFSET) & TAG_NAMELEN_MASK)
+#define TAG_NINDX(_tag)   (((_tag) >> TAG_NINDX_OFFSET)   & TAG_NINDX_MASK)
+#define TAG_VALSIZE(_tag) (((_tag) >> TAG_VALSIZE_OFFSET) & TAG_VALSIZE_MASK)
+
+#define NULL_TAG MAKE_TAG(0, 0, 0)
+#define NO_INDEX (-1)
+
+/*
+ * TRUE iff it's a (optionally compressed) block
+ */
+#define IS_BLOCK_TAG(_tag)   (TAG_VALSIZE(_tag) == TAG_ISBLOCK || \
+                              TAG_VALSIZE(_tag) == TAG_ISBLOCK_COMPRESSED)
+
+/*
+ * TRUE iff it's a compressed block.
+ */
+#define IS_BLOCK_COMPRESSED_TAG(_tag) (TAG_VALSIZE(_tag) == TAG_ISBLOCK_COMPRESSED)
+
+struct cptdumpheader {
+	uint32_t	id;
+	uint32_t	version;
+	uint32_t	numgroups;
+};
+typedef struct cptdumpheader	cptdumpheader;
+
+
+#define MAX_LENGTH	64
+struct cptgroupdesc {
+	char		name[MAX_LENGTH];
+	uint64_t	position;
+	uint64_t	size;
+};
+typedef struct cptgroupdesc	cptgroupdesc;
+
+struct vmssdata {
+	int32_t	cpt64bit;
+	FILE	*dfp;
+        FILE	*ofp;
+	/* about the memory */
+	uint32_t	alignmask;
+	uint32_t	regionscount;
+	uint64_t	memoffset;
+	uint64_t	memsize;
+};
+typedef struct vmssdata vmssdata;
+
+#define DEBUG_PARSE_PRINT(x)		\
+do {					\
+	if (CRASHDEBUG(1)) {		\
+		fprintf x;		\
+	}				\
+} while(0)
+
