diff -Nur apps/iap-git/iap-core.c apps/iap/iap-core.c
--- apps/iap-git/iap-core.c	2011-10-30 19:38:18.000000000 +0000
+++ apps/iap/iap-core.c	2011-11-02 06:52:16.000000000 +0000
@@ -34,6 +34,9 @@
 #include "kernel.h"
 #include "thread.h"
 #include "serial.h"
+#ifdef LOG2DISK
+  #include "ata_idle_notify.h"
+#endif
 #include "appevents.h"
 #include "core_alloc.h"
 
@@ -49,6 +52,11 @@
 #include "tuner.h"
 #include "ipod_remote_tuner.h"
 
+/* Used for logging to disk. */
+#ifdef LOG2DISK
+  static char logbuf[MAX_LOGBUF];
+  static int logbuf_end = 0;
+#endif
 
 /* MS_TO_TICKS converts a milisecond time period into the
  * corresponding amount of ticks. If the time period cannot
@@ -69,7 +77,7 @@
 #define IAP_EV_TICK         (1)     /* The regular task timeout */
 #define IAP_EV_MSG_RCVD     (2)     /* A complete message has been received from the device */
 #define IAP_EV_MALLOC       (3)     /* Allocate memory for the RX/TX buffers */
-        
+
 static bool iap_started = false;
 static bool iap_setupflag = false, iap_running = false;
 /* This is set to true if a SYS_POWEROFF message is received,
@@ -156,11 +164,11 @@
  * of 0 means unsupported
  */
 unsigned char lingo_versions[32][2] = {
-    {1, 8},     /* General lingo, 0x00 */
+    {1, 6},     /* General lingo, 0x00 */
     {0, 0},     /* Microphone lingo, 0x01, unsupported */
     {1, 2},     /* Simple remote lingo, 0x02 */
     {1, 5},     /* Display remote lingo, 0x03 */
-    {1, 0},     /* Extended Interface lingo, 0x04 */
+    {1, 12},     /* Extended Interface lingo, 0x04 */
     {}          /* All others are unsupported */
 };
 
@@ -223,6 +231,123 @@
     return (buf[0] << 8) | buf[1];
 }
 
+#ifdef LOGF_ENABLE
+/* Convert a buffer into a printable string, perl style
+ * buf contains the data to be converted, len is the length
+ * of the buffer.
+ *
+ * This will convert at most 1024 bytes from buf
+ */
+static char* hexstring(const unsigned char *buf, unsigned int len) {
+    static char hexbuf[4097];
+    unsigned int l;
+    const unsigned char* p;
+    unsigned char* out;
+    unsigned char h[] = {'0', '1', '2', '3', '4', '5', '6', '7',
+                         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
+
+    if (len > 1024) {
+        l = 1024;
+    } else {
+        l = len;
+    }
+    p = buf;
+    out = hexbuf;
+    do {
+        if (*p == 92) {
+            *out++ = '\\';
+            *out++ = '\\';
+        } else if ((*p>= 0x20) && (*p < 0x7F)) {
+            *out++ = *p;
+        } else {
+            *out++ = '\\';
+            *out++ = 'x';
+            *out++ = h[(*p)>>4];
+            *out++ = h[*p & 0x0F];
+        }
+    } while(--l && p++);
+
+    *out = 0x00;
+
+    return hexbuf;
+}
+#endif
+
+#ifdef LOG2DISK
+static void serial_log_flush(void *ignored)
+{
+    (void)ignored;
+    volatile int fd;
+
+    fd = open (SERIAL_LOG,O_APPEND|O_CREAT|O_RDWR);
+    if (fd>=0)
+    {
+        if (logbuf_end+1<MAX_LOGBUF-1)
+            logbuf[logbuf_end++] = '\0';
+        write(fd, logbuf, logbuf_end);
+        logbuf_end = 0;
+       close(fd);
+    }
+}
+
+static char* chartohex(char val)
+{
+    static char ret[2];
+    const char hexdigit[] = "0123456789ABCDEF";
+    ret[0] = hexdigit[(val&0xf0)>>4];
+    ret[1] = hexdigit[val&0xf];
+    return ret;
+}
+
+void serial_log_packet (const int in_packet, const char* data, const int size)
+{
+    int i;
+    int startindex;
+    char incoming[] = "IN  ";
+    char outgoing[] = "OUT ";
+    char comment[] =  "Com ";
+    const int message_additions = sizeof(incoming)+1; /* +1 is for the "\n" */
+//    if (logbuf_end + size + message_additions > MAX_LOGBUF-1)
+//        serial_log_flush(0);
+    if(in_packet == 2)
+    {
+        memcpy(&logbuf[logbuf_end], comment, sizeof(comment));
+        logbuf_end += sizeof(comment)-1;
+        startindex = 0;
+	for(i=startindex;i<size;i++)
+	{
+	    logbuf[logbuf_end++] = data[i];
+	}
+    }
+    else
+    {
+        if (in_packet)
+        {
+            memcpy(&logbuf[logbuf_end], incoming, sizeof(incoming));
+            logbuf_end += sizeof(incoming);
+            startindex = 0;
+        }
+        else
+        {
+            memcpy(&logbuf[logbuf_end], outgoing, sizeof(outgoing));
+            logbuf_end += sizeof(outgoing);
+            startindex = 3; //drop the length
+        }
+        logbuf_end--; /* remove the nul chat in the log file. */
+
+        for (i=startindex;i<size;i++)
+        {
+            char *hex = chartohex(data[i]);
+            logbuf[logbuf_end++] = hex[0];
+            logbuf[logbuf_end++] = hex[1];
+        }
+    }
+    logbuf[logbuf_end++] = '\n';
+    serial_log_flush(0);
+}
+
+#endif
+
 void iap_tx_strlcpy(const unsigned char *str)
 {
     ptrdiff_t txfree;
@@ -320,6 +445,28 @@
 static void iap_track_changed(void *ignored)
 {
     (void)ignored;
+
+    if ((interface_state == IST_EXTENDED) && device.do_notify) {
+#ifdef LOGF_ENABLE
+        logf("iap: In Extended IF Mode, Track Changed");
+#endif
+
+#ifdef LOG2DISK
+        serial_log_packet (2,"In Extended Mode, Track Changed ",31);
+#endif
+        long playlist_pos = playlist_next(0);
+        playlist_pos -= playlist_get_first_index(NULL);
+        if(playlist_pos < 0)
+            playlist_pos += playlist_amount();
+
+        IAP_TX_INIT4(0x04, 0x0027);
+        IAP_TX_PUT(0x01);
+        IAP_TX_PUT_U32(playlist_pos);
+
+        iap_send_tx();
+        return;
+    }
+
 }
 
 /* Do general setup of the needed infrastructure.
@@ -357,6 +504,9 @@
         panicf("Could not create iap thread");
     timeout_register(&iap_task_tmo, iap_task, MS_TO_TICKS(100), (intptr_t)NULL);
     add_event(PLAYBACK_EVENT_TRACK_CHANGE, false, iap_track_changed);
+#ifdef LOG2DISK
+    add_event(DISK_EVENT_SPINUP, false, serial_log_flush);
+#endif
 
     /* Since we cannot allocate memory while in interrupt context
      * post a message to our own queue to get that done
@@ -466,6 +616,13 @@
     }
     *(iap_txnext) = 0x100 - (chksum & 0xFF);
 
+#ifdef LOGF_ENABLE
+    logf("T: %s", hexstring(txstart, iap_txnext - txstart));
+#endif
+#ifdef LOG2DISK
+    serial_log_packet (0,txstart,iap_txnext - txstart);
+#endif
+
     for (i=0; i <= (iap_txnext - txstart); i++)
     {
         while(!tx_rdy()) ;
@@ -484,7 +641,7 @@
     iap_txnext = iap_txpayload;
     IAP_TX_PUT_DATA(data, len);
     iap_send_tx();
-}    
+}
 
 bool iap_getc(const unsigned char x)
 {
@@ -502,7 +659,7 @@
          return iap_getc(x);
     }
 
-    
+
     /* run state machine to detect and extract a valid frame */
     switch (s->state) {
     case ST_SYNC:
@@ -592,7 +749,7 @@
     }
 
     pkt_timeout = current_tick + IAP_PKT_TIMEOUT;
-    
+
     /* return true while still hunting for the sync and start-of-frame byte */
     return (s->state == ST_SYNC) || (s->state == ST_SOF);
 }
@@ -805,9 +962,25 @@
     if (count < 5) return;
 
     count = 0;
-    
+
     /* RemoteEventNotification */
-    
+
+    /* Mode 04 PlayStatusChangeNotification */
+    /* Are we in Extended Mode */
+    if (interface_state == IST_EXTENDED) {
+#ifdef LOGF_ENABLE
+        logf("iap: In Extended IF Mode, RemoteEventNotify");
+#endif
+        /* Return Track Position */
+        struct mp3entry *id3 = audio_current_track();
+        unsigned long time_elapsed = id3->elapsed;
+        IAP_TX_INIT4(0x04, 0x0027);
+        IAP_TX_PUT(0x04);
+        IAP_TX_PUT_U32(time_elapsed);
+
+        iap_send_tx();
+    }
+
     /* Track position (ms)  or Track position (s) */
     if (device.notifications & (BIT_N(0) | BIT_N(15)))
     {
@@ -1111,13 +1284,13 @@
         case 0x02:
         {
             /* do nothing */
-            
+
             /* GetAccessoryInfo */
             unsigned char data[] = {0x00, 0x27, 0x00};
             iap_send_pkt(data, sizeof(data));
             break;
         }
-        
+
         /* RetTunerFreq */
         case 0x0A:
             /* fall through */
@@ -1127,7 +1300,7 @@
             rmt_tuner_freq(len, buf);
             break;
         }
-        
+
         /* RdsReadyNotify, RDS station name 0x21 1E 00 + ASCII text*/
         case 0x21:
         {
@@ -1156,6 +1329,14 @@
 
     /* handle command by mode */
     length = get_u16(iap_rxstart);
+#ifdef LOG2DISK
+    serial_log_packet (1,iap_rxstart+2,(length));
+#endif
+#ifdef LOGF_ENABLE
+    logf("I: timestamp %ld", current_tick);
+    logf("R: %s", hexstring(iap_rxstart+2, (length)));
+#endif
+
     unsigned char mode = *(iap_rxstart+2);
     switch (mode) {
     case 0: iap_handlepkt_mode0(length, iap_rxstart+2); break;
diff -Nur apps/iap-git/iap-core.h apps/iap/iap-core.h
--- apps/iap-git/iap-core.h	2011-10-30 19:38:18.000000000 +0000
+++ apps/iap/iap-core.h	2011-11-02 12:22:34.000000000 +0000
@@ -26,12 +26,28 @@
 #include "playlist.h"
 #include "iap.h"
 
+/* #define LOG2DISK */
+#undef LOG2DISK
+#ifdef LOG2DISK
+  #define SERIAL_LOG "/serial.log.201111011200"
+  #define MAX_LOGBUF 2048
+#endif
+/* #define LOGF_ENABLE */
+#undef LOGF_ENABLE
+#ifdef LOGF_ENABLE
+  #include "logf.h"
+#endif
+
 /* The Model ID of the iPod we emulate. Currently a 160GB classic */
-#define IAP_IPOD_MODEL (0x00130200U)
+/* #define IAP_IPOD_MODEL (0x00130200U) */
+
+/* My Alpine works with a 5G */
+#define IAP_IPOD_MODEL (0x000B0010U)
 
 /* The firmware version we emulate. Currently 2.0.3 */
-#define IAP_IPOD_FIRMWARE_MAJOR (2)
-#define IAP_IPOD_FIRMWARE_MINOR (0)
+/* My Alpine works with 1.23 */
+#define IAP_IPOD_FIRMWARE_MAJOR (1)
+#define IAP_IPOD_FIRMWARE_MINOR (2)
 #define IAP_IPOD_FIRMWARE_REV   (3)
 
 /* Status code for IAP ack messages */
@@ -156,7 +172,7 @@
  * it might be too late at that point. See the current size of TX_BUFLEN
  */
 
-/* Initialize the TX buffer with a lingo and command ID. This will reset the 
+/* Initialize the TX buffer with a lingo and command ID. This will reset the
  * data pointer, effectively invalidating unsent information in the TX buffer.
  * There are two versions of this, one for 1 byte command IDs (all Lingoes except
  * 0x04) and one for two byte command IDs (Lingo 0x04)
@@ -188,7 +204,7 @@
         iap_txnext += 4; \
         } while (0)
 
-/* Put an arbitrary amount of data (identified by a char pointer and 
+/* Put an arbitrary amount of data (identified by a char pointer and
  * a length) into the TX buffer
  */
 #define IAP_TX_PUT_DATA(data, len) do { \
@@ -241,4 +257,8 @@
 uint32_t iap_get_trackindex(void);
 void iap_get_trackinfo(const unsigned int track, struct mp3entry* id3);
 
+#ifdef LOG2DISK
+  void serial_log_packet (const int in_packet, const char* data, const int size);
+#endif
+
 #endif
diff -Nur apps/iap-git/iap-lingo0.c apps/iap/iap-lingo0.c
--- apps/iap-git/iap-lingo0.c	2011-10-30 19:38:18.000000000 +0000
+++ apps/iap/iap-lingo0.c	2011-11-01 15:00:38.000000000 +0000
@@ -101,7 +101,7 @@
          * 0x05-N: Datafields holding the number of bits specified in 0x04
          *
          * Returns: (none)
-         * 
+         *
          * TODO:
          * BeginHighPower/EndHighPower should be send in the periodic handler,
          * depending on the current play status
@@ -132,7 +132,7 @@
                     break;
                 }
 
-                case 0x05: 
+                case 0x05:
                 {
                     /* FM transmitter sends this: */
                     /* FF 55 06 00 01 05 00 02 01 F1 (mode switch) */
@@ -209,7 +209,7 @@
          *
          * Sent from the iPod to the device
          */
-    
+
         /* EnterRemoteUIMode (0x05)
          *
          * Request Extended Interface Mode
@@ -328,7 +328,7 @@
 
             iap_send_tx();
             break;
-        } 
+        }
 
         /* ReturniPodSoftwareVersion (0x0A)
          *
@@ -414,7 +414,7 @@
          * 0x02: Lingo for which version information is returned
          * 0x03: Major protocol version for the given lingo
          * 0x04: Minor protocol version for the given lingo
-         * 
+         *
          * Returns on failure:
          * IAP_ACK_BAD_PARAM
          */
@@ -550,10 +550,10 @@
             /* Bit 7: RF Tuner lingo */
             if (lingoes & (1 << 7))
             {
-                /* ipod fm remote sends this: */ 
+                /* ipod fm remote sends this: */
                 /* FF 55 0E 00 13 00 00 00 8D 00 00 00 0E 00 00 00 03 41 */
                 radio_present = 1;
-                /* GetDevAuthenticationInfo */    
+                /* GetDevAuthenticationInfo */
                 unsigned char data4[] = {0x00, 0x14};
                 iap_send_pkt(data4, sizeof(data4));
             }
@@ -1020,10 +1020,13 @@
 
             break;
         }
-        
+
         /* The default response is IAP_ACK_BAD_PARAM */
         default:
         {
+#ifdef LOGF_ENABLE
+            logf("iap: Unsupported Mode00 Command");
+#endif
             cmd_ack(cmd, IAP_ACK_BAD_PARAM);
             break;
         }
diff -Nur apps/iap-git/iap-lingo2.c apps/iap/iap-lingo2.c
--- apps/iap-git/iap-lingo2.c	2011-10-30 19:38:18.000000000 +0000
+++ apps/iap/iap-lingo2.c	2011-11-01 15:00:38.000000000 +0000
@@ -90,7 +90,7 @@
         {
             iap_remotebtn = BUTTON_NONE;
             iap_timeoutbtn = 0;
-            
+
             if(buf[2] != 0)
             {
                 if(buf[2] & 1)
@@ -263,10 +263,13 @@
             cmd_ok(cmd);
             break;
         }
-        
+
         /* The default response is IAP_ACK_BAD_PARAM */
         default:
         {
+#ifdef LOGF_ENABLE
+            logf("iap: Unsupported Mode02 Command");
+#endif
             cmd_ack(cmd, IAP_ACK_BAD_PARAM);
             break;
         }
diff -Nur apps/iap-git/iap-lingo3.c apps/iap/iap-lingo3.c
--- apps/iap-git/iap-lingo3.c	2011-10-30 19:38:18.000000000 +0000
+++ apps/iap/iap-lingo3.c	2011-11-01 15:00:38.000000000 +0000
@@ -90,7 +90,7 @@
     {
         /* ACK (0x00)
          *
-         * Sent from the iPod to the device 
+         * Sent from the iPod to the device
          */
 
         /* GetCurrentEQProfileIndex (0x01)
@@ -122,7 +122,7 @@
          *
          * Sent from the iPod to the device
          */
-        
+
         /* SetCurrentEQProfileIndex (0x03)
          *
          * Set the active equalizer profile
@@ -848,7 +848,7 @@
                 case 0x09:
                 {
                     CHECKLEN(9);
-                    
+
                     cmd_ack(cmd, IAP_ACK_CMD_FAILED);
                     break;
                 }
@@ -859,7 +859,7 @@
                 case 0x0A:
                 {
                     CHECKLEN(7);
-                    
+
                     cmd_ack(cmd, IAP_ACK_CMD_FAILED);
                     break;
                 }
@@ -870,7 +870,7 @@
                 case 0x0B:
                 {
                     CHECKLEN(5);
-                    
+
                     cmd_ack(cmd, IAP_ACK_CMD_FAILED);
                     break;
                 }
@@ -881,7 +881,7 @@
                 case 0x0D:
                 {
                     CHECKLEN(5);
-                    
+
                     cmd_ack(cmd, IAP_ACK_CMD_FAILED);
                     break;
                 }
@@ -892,7 +892,7 @@
                 case 0x0E:
                 {
                     CHECKLEN(4);
-                    
+
                     cmd_ack(cmd, IAP_ACK_CMD_FAILED);
                     break;
                 }
@@ -1112,7 +1112,7 @@
                 {
                     /* Chapter length, set at 0 (no chapters) */
                     IAP_TX_PUT_U32(0x00);
-                    
+
                     /* Chapter name, empty */
                     IAP_TX_PUT_STRING("");
 
@@ -1222,7 +1222,7 @@
 
             break;
         }
-        
+
         /* RetIndexedPlayingTrackInfo (0x13)
          *
          * Sent from the iPod to the device
@@ -1249,7 +1249,7 @@
         case 0x14:
         {
             CHECKAUTH;
-            
+
             IAP_TX_INIT(0x03, 0x15);
             IAP_TX_PUT_U32(playlist_amount());
 
@@ -1367,7 +1367,7 @@
         case 0x1A:
         {
             IAP_TX_INIT(0x03, 0x1B);
-            
+
             iap_fill_power_state();
             iap_send_tx();
             break;
@@ -1434,7 +1434,7 @@
         {
             CHECKAUTH;
             CHECKLEN(4);
-            
+
             /* Sound check is not supported right now
              * TODO: Fix
              */
@@ -1490,10 +1490,13 @@
             iap_send_tx();
             break;
         }
-        
+
         /* The default response is IAP_ACK_BAD_PARAM */
         default:
         {
+#ifdef LOGF_ENABLE
+            logf("iap: Unsupported Mode03 Command");
+#endif
             cmd_ack(cmd, IAP_ACK_BAD_PARAM);
             break;
         }
diff -Nur apps/iap-git/iap-lingo4.c apps/iap/iap-lingo4.c
--- apps/iap-git/iap-lingo4.c	2011-10-30 19:38:18.000000000 +0000
+++ apps/iap/iap-lingo4.c	2011-11-01 15:00:38.000000000 +0000
@@ -75,7 +75,7 @@
     {
         /*Increment only if there is a playlist extension*/
         if ((extension=strrchr(playlist_file->d_name, '.')) != NULL){
-            if ((strcmp(extension, ".m3u") == 0 || 
+            if ((strcmp(extension, ".m3u") == 0 ||
                 strcmp(extension, ".m3u8") == 0))
                 nbr++;
         }
@@ -95,12 +95,24 @@
 
     /* Lingo 0x04 must have been negotiated */
     if (!DEVICE_LINGO_SUPPORTED(0x04)) {
+#ifdef LOG2DISK
+        serial_log_packet(2,"Mode04 Not Negotiated ",21);
+#endif
+#ifdef LOGF_ENABLE
+        logf("iap: Mode04 Not Negotiated");
+#endif
         cmd_ack(cmd, IAP_ACK_BAD_PARAM);
         return;
     }
 
     /* All these commands require extended interface mode */
     if (interface_state != IST_EXTENDED) {
+#ifdef LOG2DISK
+        serial_log_packet(2,"Not in Mode04 Extended Mode ",27);
+#endif
+#ifdef LOGF_ENABLE
+        logf("iap: Not in Mode04 Extended Mode");
+#endif
         cmd_ack(cmd, IAP_ACK_BAD_PARAM);
         return;
     }
@@ -115,7 +127,7 @@
             iap_send_pkt(data, sizeof(data));
             break;
         }
-        
+
         /* SetAudioBookSpeed */
         case 0x000B:
         {
@@ -123,7 +135,101 @@
             cmd_ok(cmd);
             break;
         }
-        
+        /* GetIndexedPlayingTrackInfo (0x000C)
+         *
+         * 0x00: Lingo ID: Extended Interface Protocol Lingo, always 0x04
+         * 0x01-0x02: Command, always 0x000C
+	     * 0x03: Track Info Type. See Below
+	     * 0x04-0x07: Track Index
+	     * 0x08-0x09: Chapter Index
+	     *
+	     *
+	     * Track Info Types: Return Data
+	     * 0x00 Track Capabilities. 10byte data
+	     * 0x01 Podcast Name        UTF-8 String
+	     * 0x02 Track Release Date  7Byte Data
+	     * 0x03 Track Description   UTF-8 String
+	     * 0x04 Track Song Lyrics   UTF-8 String
+	     * 0x05 Track Genre         UTF-8 String
+	     * 0x06 Track Composer      UTF-8 String
+	     * 0x07 Track Artwork Count.Artwotk Count Data
+	     * 0x08-0xff Reserved
+	     */
+
+        case 0x000C:
+        {
+        /* Switch based on the Track Info Type Requested*/
+            switch(buf[3])
+            {
+                case 0x01: /* Podcast Name*/
+                {
+                    unsigned char data4[] = {0x04, 0x00, 0x0D, 0x00, 'P', 'O', 'D', 'C', 'A', 'S', 'T', 0x00};
+                    data4[3] = 0x01; //Buf[3];
+                    iap_send_pkt(data4, sizeof(data4));
+                    break;
+                }
+                case 0x03: /* Track Description */
+                {
+                    unsigned char data5[] = {0x04, 0x00, 0x0D, 0x00, 'D', 'E', 'S', 'C', 'R', 'I', 'P', 'T', 0x00};
+                    data5[3] = 0x03; //buf[3];
+                    iap_send_pkt(data5, sizeof(data5));
+                    break;
+                }
+                case 0x04: /* Track Song Lyrics */
+                {
+                    unsigned char data6[] = {0x04, 0x00, 0x0D, 0x00, 'L', 'Y', 'R', 'I', 'C', 'S', 0x00};
+                    data6[3] = 0x04; //buf[3];
+                    iap_send_pkt(data6, sizeof(data6));
+                    break;
+                }
+                case 0x05: /* Track Genre */
+                {
+                    unsigned char data7[] = {0x04, 0x00, 0x0D, 0x00, 'G', 'E', 'N', 'R', 'E', 0x00};
+                    data7[3] = 0x05; //buf[3];
+                    iap_send_pkt(data7, sizeof(data7));
+                    break;
+                }
+                case 0x06: /* Track Composer */
+                {
+                    unsigned char data8[] = {0x04, 0x00, 0x0D, 0x00, 'C', 'O', 'M', 'P', 'O', 'S', 'E', 'R', 0x00};
+                    data8[3] = 0x06; //buf[3];
+                    iap_send_pkt(data8, sizeof(data8));
+                    break;
+                }
+                case 0x00: /* Track Capabilities 10Bytes Data */
+                {
+                    unsigned char data1[] = {0x04, 0x00, 0x0D, 0x00,
+		                            0x00, 0x00, 0x00, 0x00,
+		                            0x00, 0x00, 0x00, 0x00,
+		                            0x00, 0x00
+                                           };
+                    data1[3] = buf[3];
+                    iap_send_pkt(data1, sizeof(data1));
+                    break;
+                }
+                case 0x02: /* Track Release Date 7Byte Data */
+                {
+                    unsigned char data2[] = {0x04, 0x00, 0x0D, 0x00,
+		                            0x00, 0x00, 0x00,
+                                            0x00, 0x00, 0x00, 0x00, 0x00
+                                           };
+                    data2[3] = buf[3];
+                    iap_send_pkt(data2, sizeof(data2));
+                    break;
+                }
+                case 0x07: /* Track Artwork Count */
+                {
+                    unsigned char data3[] = {0x04, 0x00, 0x0D, 0x00,
+                                            0x00, 0x00, 0x00, 0x00
+                                           };
+                    data3[3] = buf[3];
+                    iap_send_pkt(data3, sizeof(data3));
+                    break;
+                }
+            }
+            break;
+        }
+
         /* RequestProtocolVersion (0x0012)
          *
          * This command is deprecated.
@@ -194,6 +300,16 @@
          * Sent from the iPod to the device
          */
 
+        /* ResetDBSelection (0x0016)
+           Currently we don't do anything with this.
+         */
+        case 0x0016:
+        {
+            /* respond with cmd ok packet */
+            cmd_ok(cmd);
+            break;
+        }
+
         /* SelectDBRecord */
         case 0x0017:
         {
@@ -208,7 +324,7 @@
             /* ReturnNumberCategorizedDBRecords */
             unsigned char data[] = {0x04, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00};
             unsigned long num = 0;
-            
+
             DIR* dp;
             unsigned long nbr_total_playlists = 0;
             struct dirent* playlist_file = NULL;
@@ -223,7 +339,7 @@
                     /*Increment only if there is a playlist extension*/
                         if ((extension=strrchr(playlist_file->d_name, '.'))
                         != NULL) {
-                            if ((strcmp(extension, ".m3u") == 0 || 
+                            if ((strcmp(extension, ".m3u") == 0 ||
                                 strcmp(extension, ".m3u8") == 0))
                                 nbr_total_playlists++;
                         }
@@ -240,15 +356,15 @@
             iap_send_pkt(data, sizeof(data));
             break;
         }
-        
+
         /* RetrieveCategorizedDatabaseRecords */
         case 0x001A:
         {
             /* ReturnCategorizedDatabaseRecord */
-            unsigned char data[7 + MAX_PATH] = 
+            unsigned char data[7 + MAX_PATH] =
                             {0x04, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x00,
                              'R', 'O', 'C', 'K', 'B', 'O', 'X', '\0'};
-            
+
             unsigned long item_offset = get_u32(&buf[4]);
 
             get_playlist_name(data + 7, item_offset, MAX_PATH);
@@ -260,12 +376,12 @@
             iap_send_pkt(data, 7 + strlen(data+7) + 1);
             break;
         }
-        
+
         /* GetPlayStatus */
         case 0x001C:
         {
             /* ReturnPlayStatus */
-            unsigned char data[] = {0x04, 0x00, 0x1D, 0x00, 0x00, 0x00, 
+            unsigned char data[] = {0x04, 0x00, 0x1D, 0x00, 0x00, 0x00,
                                     0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
             struct mp3entry *id3 = audio_current_track();
             unsigned long time_total = id3->length;
@@ -276,11 +392,11 @@
             if (status == AUDIO_STATUS_PLAY)
                 data[11] = 0x01; /* play */
             else if (status & AUDIO_STATUS_PAUSE)
-                data[11] = 0x02; /* pause */ 
+                data[11] = 0x02; /* pause */
             iap_send_pkt(data, sizeof(data));
             break;
         }
-        
+
         /* GetCurrentPlayingTrackIndex */
         case 0x001E:
         {
@@ -294,7 +410,7 @@
             iap_send_pkt(data, sizeof(data));
             break;
         }
-        
+
         /* GetIndexedPlayingTrackTitle */
         case 0x0020:
         /* GetIndexedPlayingTrackArtistName */
@@ -307,7 +423,7 @@
             int fd;
             size_t len;
             long tracknum = get_u32(&buf[3]);
-            
+
             data[2] = cmd + 1;
             memcpy(&id3, audio_current_track(), sizeof(id3));
             tracknum += playlist_get_first_index(NULL);
@@ -344,7 +460,7 @@
             }
             break;
         }
-        
+
         /* SetPlayStatusChangeNotification */
         case 0x0026:
         {
@@ -353,7 +469,7 @@
             cmd_ok(cmd);
             break;
         }
-        
+
         /* PlayCurrentSelection */
         case 0x0028:
         {
@@ -362,7 +478,7 @@
                 case 0x01:
                 {/*Playlist*/
                     unsigned long item_offset = get_u32(&cur_dbrecord[1]);
-                    
+
                     unsigned char selected_playlist
                     [sizeof(global_settings.playlist_catalog_dir)
                     + 1
@@ -384,7 +500,7 @@
             cmd_ok(cmd);
             break;
         }
-        
+
         /* PlayControl */
         case 0x0029:
         {
@@ -420,7 +536,7 @@
             cmd_ok(cmd);
             break;
         }
-        
+
         /* GetShuffle */
         case 0x002C:
         {
@@ -430,7 +546,7 @@
             iap_send_pkt(data, sizeof(data));
             break;
         }
-        
+
         /* SetShuffle */
         case 0x002E:
         {
@@ -453,7 +569,7 @@
             cmd_ok(cmd);
             break;
         }
-        
+
         /* GetRepeat */
         case 0x002F:
         {
@@ -468,7 +584,7 @@
             iap_send_pkt(data, sizeof(data));
             break;
         }
-        
+
         /* SetRepeat */
         case 0x0031:
         {
@@ -491,7 +607,15 @@
             cmd_ok(cmd);
             break;
         }
-        
+
+        /* Get */
+        case 0x0032:
+        {
+            /* We don't do anything with the data so just respond with cmd ok packet */
+            cmd_ok(cmd);
+            break;
+        }
+
         /* GetMonoDisplayImageLimits */
         case 0x0033:
         {
@@ -503,7 +627,7 @@
             iap_send_pkt(data, sizeof(data));
             break;
         }
-        
+
         /* GetNumPlayingTracks */
         case 0x0035:
         {
@@ -514,25 +638,28 @@
             iap_send_pkt(data, sizeof(data));
             break;
         }
-        
+
         /* SetCurrentPlayingTrack */
         case 0x0037:
         {
             int paused = (is_wps_fading() || (audio_status() & AUDIO_STATUS_PAUSE));
             long tracknum = get_u32(&buf[3]);
-            
+
             audio_pause();
             audio_skip(tracknum - playlist_next(0));
             if (!paused)
                 audio_resume();
-            
+
             /* respond with cmd ok packet */
             cmd_ok(cmd);
             break;
         }
-        
+
         default:
         {
+#ifdef LOGF_ENABLE
+            logf("iap: Unsupported Mode04 Command");
+#endif
             /* The default response is IAP_ACK_BAD_PARAM */
             cmd_ack(cmd, IAP_ACK_BAD_PARAM);
             break;
