diff --git a/extensions/snap.c b/extensions/snap.c
index dedc286..d5fda80 100644
--- a/extensions/snap.c
+++ b/extensions/snap.c
@@ -35,7 +35,7 @@ static int verify_paddr(physaddr_t);
 static void init_ram_segments(void);
 static int print_progress(const char *, ulong);
 
-#if defined(X86) || defined(X86_64) || defined(IA64) || defined(PPC64)
+#if defined(X86) || defined(X86_64) || defined(IA64) || defined(PPC64) || defined(ARM)
 int supported = TRUE;
 #else
 int supported = FALSE;
@@ -160,7 +160,7 @@ char *help_snap[] = {
  
         "  This command takes a snapshot of physical memory and creates an ELF vmcore.",
 	"  The default vmcore is a kdump-style dumpfile.  Supported on x86, x86_64,",
-	"  ia64 and ppc64 architectures only.",
+	"  ia64 and ppc64, arm architectures only.",
 	" ",
 	"    -n  create a netdump-style vmcore (n/a on x86_64).",
         NULL
@@ -356,11 +356,28 @@ struct elf_prstatus_ia64 {
         __u32 pr_fpvalid;         	  /* True if math co-processor being used.  */
 };
 
+/*
+ *  arm specific
+ */
+struct user_regs_struct_arm {
+	__u32 regs[18];
+};
+
+#define ELF_NGREG_ARM (sizeof (struct user_regs_struct_arm) / sizeof(__u32))
+typedef __u32 elf_gregset_arm_t[ELF_NGREG_ARM];
+
+struct elf_prstatus_arm {
+	char pad[72];
+	elf_gregset_arm_t pr_reg;      /* GP registers */
+	__u32 pr_fpvalid;              /* True if math co-processor being used.  */
+};
+
 union prstatus {
 	struct elf_prstatus_i386 x86; 
 	struct elf_prstatus_x86_64 x86_64; 
 	struct elf_prstatus_ppc64 ppc64;
 	struct elf_prstatus_ia64 ia64;
+	struct elf_prstatus_arm arm;
 };
 
 static size_t
@@ -418,6 +435,9 @@ generate_elf_header(int type, int fd, char *filename)
 	} else if (machine_type("PPC64")) {
 		e_machine = EM_PPC64;
 		prstatus_len = sizeof(prstatus.ppc64);
+	} else if (machine_type("ARM")) {
+		e_machine = EM_ARM;
+		prstatus_len = sizeof(prstatus.arm);
 	}
 
 	/* should be enought for the notes + roundup + two blocks */
@@ -538,6 +558,18 @@ generate_elf_header(int type, int fd, char *filename)
 			load[i].p_flags = PF_R | PF_W | PF_X;
 			load[i].p_align = (type == NETDUMP_ELF64) ? PAGESIZE() : 0;
 			break;
+
+		case EM_ARM:
+			nt = &vt->node_table[n++];
+			load[i].p_vaddr = PTOV(nt->start_paddr); /* FIXME!*/
+			console("p_vaddr = %p\n", load[i].p_vaddr);
+			load[i].p_paddr = nt->start_paddr; /* FIXME */
+			console("p_paddr = %p\n", load[i].p_paddr);
+			load[i].p_filesz = nt->size * PAGESIZE();
+			load[i].p_memsz = load[i].p_filesz;
+			load[i].p_flags = PF_R | PF_W | PF_X;
+			load[i].p_align = (type == NETDUMP_ELF64) ? PAGESIZE() : 0;
+			break;
 		}
 
 		l_offset += load[i].p_filesz;
diff --git a/netdump.c b/netdump.c
index 4011f36..f69db76 100644
--- a/netdump.c
+++ b/netdump.c
@@ -236,6 +236,11 @@ is_netdump(char *file, ulong source_query)
 			    source_query))
 				goto bailout;
 			break;
+		case EM_ARM:
+			if (machine_type_mismatch(file, "ARM", NULL,
+			    source_query))
+				goto bailout;
+			break;
 
 		default:
 			if (machine_type_mismatch(file, "(unknown)", NULL,
diff --git a/symbols.c b/symbols.c
index a68b585..9edda13 100755
--- a/symbols.c
+++ b/symbols.c
@@ -3019,6 +3019,11 @@ is_kernel(char *file)
 				goto bailout;
 			break;
 
+		case EM_ARM:
+			if (machine_type_mismatch(file, "ARM", NULL, 0))
+				goto bailout;
+			break;
+
 		default:
 			if (machine_type_mismatch(file, "(unknown)", NULL, 0))
 				goto bailout;
