diff -u -r rockbox-3.7-original/apps/cuesheet.c rockbox-3.7/apps/cuesheet.c
--- rockbox-3.7-original/apps/cuesheet.c	2010-10-30 10:38:36.000000000 -0400
+++ rockbox-3.7/apps/cuesheet.c	2010-11-19 10:37:57.603229892 -0500
@@ -41,6 +41,7 @@
 #include "gui/wps.h"
 
 #define CUE_DIR ROCKBOX_DIR "/cue"
+extern bool is_podcast_or_audiobook(struct mp3entry *id3);
 
 bool look_for_cuesheet_file(const char *trackpath, char *found_cue_path)
 {
@@ -319,7 +320,8 @@
 bool curr_cuesheet_skip(struct cuesheet *cue, int direction, unsigned long curr_pos)
 {
     int track = cue_find_current_track(cue, curr_pos);
-    
+    bool is_podcast = is_podcast_or_audiobook(audio_current_track());
+    logf("in curr_cuesheet_skip, is_podcast is %s\n", is_podcast?"True":"False" );
     if (direction >= 0 && track == cue->track_count - 1)
     {
         /* we want to get out of the cuesheet */
@@ -334,7 +336,7 @@
             to previous cuesheet segment. If skipping backward after
             DEFAULT_SKIP_TRESH seconds have elapsed, skip to the start of the
             current cuesheet segment */
-            if (direction == 1 || 
+            if (direction == 1 || is_podcast ||
                   ((curr_pos - cue->tracks[track].offset) < DEFAULT_SKIP_TRESH))
             {
                 track += direction;
diff -u -r rockbox-3.7-original/apps/gui/wps.c rockbox-3.7/apps/gui/wps.c
--- rockbox-3.7-original/apps/gui/wps.c	2010-10-30 10:38:37.000000000 -0400
+++ rockbox-3.7/apps/gui/wps.c	2010-11-17 11:16:23.189913676 -0500
@@ -74,6 +74,8 @@
                                 /* 3% of 30min file == 54s step size */
 #define MIN_FF_REWIND_STEP 500
 
+extern bool is_podcast_or_audiobook(struct mp3entry *id3);
+
 /* initial setup of wps_data  */
 static void wps_state_init(void);
 static void track_changed_callback(void *param);
@@ -465,7 +467,7 @@
 static void prev_track(unsigned long skip_thresh)
 {
     struct wps_state *state = skin_get_global_state();
-    if (state->id3->elapsed < skip_thresh)
+    if (state->id3->elapsed < skip_thresh || is_podcast_or_audiobook(state->id3))
     {
         audio_prev();
         return;
diff -u -r rockbox-3.7-original/apps/playback.c rockbox-3.7/apps/playback.c
--- rockbox-3.7-original/apps/playback.c	2010-11-19 10:31:13.559186577 -0500
+++ rockbox-3.7/apps/playback.c	2010-11-19 11:04:13.987185607 -0500
@@ -212,6 +212,7 @@
 
 extern struct codec_api ci;
 extern unsigned int codec_thread_id;
+extern bool is_podcast_or_audiobook(struct mp3entry *id3);
 
 /* Multiple threads */
 /* Set the watermark to trigger buffer fill (A/C) */
@@ -1001,8 +1002,7 @@
 
     /* XXX: [HACK:] Heuristic for ignoring resume position:
        automatic songchange, and new track is shorter than 20 min */
-    if (automatic_skip &&
-	thistrack_id3->length < 20L /*min*/ * 60L /* s */ * 1000L /* ms */)
+    if (automatic_skip && !is_podcast_or_audiobook(thistrack_id3) )
       {
 	thistrack_id3->offset = 0;
       }
diff -u -r rockbox-3.7-original/apps/tagtree.c rockbox-3.7/apps/tagtree.c
--- rockbox-3.7-original/apps/tagtree.c	2010-11-19 10:31:13.568184649 -0500
+++ rockbox-3.7/apps/tagtree.c	2010-11-19 11:05:36.611195007 -0500
@@ -53,6 +53,8 @@
 #include "storage.h"
 #include "dir.h"
 
+#define StrOrEmpty(x) (x==NULL)?"Null":x
+
 #define FILE_SEARCH_INSTRUCTIONS ROCKBOX_DIR "/tagnavi.config"
 
 static int tagtree_play_folder(struct tree_context* c);
@@ -171,6 +173,28 @@
 /* Track change controls */
 extern bool automatic_skip; /* Who initiated in-progress skip? (C/A-) */
 
+bool is_podcast_or_audiobook(struct mp3entry *id3)
+{
+  bool p_or_a=false;
+  if ( (strcasestr(id3->path, "/podcast") != NULL) ||
+       (id3->genre_string != NULL && strcasestr(id3->genre_string, "podcast" ) != NULL) ) {
+    p_or_a = true;
+    logf("determined %s with genre %s is a podcast\n", id3->path, StrOrEmpty(id3->genre_string));
+  } else {
+    logf("determined %s with genre %s is not a podcast\n", id3->path, StrOrEmpty(id3->genre_string));
+  }
+  
+  if ( (strcasestr(id3->path, "/audiobook" ) != NULL) ||
+    (id3->genre_string != NULL && strcasestr(id3->genre_string, "audiobook" ) != NULL)) {
+    p_or_a = true;
+    logf("determined %s with genre %s is an audiobook\n", id3->path, StrOrEmpty(id3->genre_string));
+  } else {
+    logf("determined %s with genre %s is not an audiobook\n", id3->path, StrOrEmpty(id3->genre_string));
+  }
+  
+  return p_or_a;
+}
+
 static int get_token_str(char *buf, int size)
 {
     /* Find the start. */
@@ -680,7 +704,7 @@
     {
         id3->offset = tagcache_get_numeric(&tcs, tag_lastoffset);
 	logf("tagtree_buffer_event: Set offset for %s to %lX\n", 
-	     id3->title, id3->offset);
+	     StrOrEmpty(id3->title), id3->offset);
     }
     
     /* Store our tagcache index pointer. */
@@ -695,6 +719,7 @@
     long playtime;
     long lastplayed;
     long tagcache_idx;
+    bool is_podcast = false;
     struct mp3entry *id3 = (struct mp3entry*)data;
     
     /* Do not gather data unless proper setting has been enabled. */
@@ -738,12 +763,14 @@
     tagcache_update_numeric(tagcache_idx, tag_playcount, playcount);
     tagcache_update_numeric(tagcache_idx, tag_playtime, playtime);
     tagcache_update_numeric(tagcache_idx, tag_lastplayed, lastplayed);
-
+    
+    is_podcast = is_podcast_or_audiobook(id3);
     /* XXX: save current file resume offset */
+    logf("Automatic skip?: %s \n", automatic_skip?"Yes":"No");
     tagcache_update_numeric(tagcache_idx, tag_lastoffset, 
-			    automatic_skip ? 0 : id3->offset);
+			    is_podcast && !automatic_skip ?id3->offset:0);
     logf("tagtree_track_finish_event: Save offset for %s: %lX\n", 
-	 id3->title, automatic_skip ? 0 : id3->offset);
+	 StrOrEmpty(id3->title), is_podcast && !automatic_skip ? id3->offset: 0);
 
 }
 
