diff --git a/src/mares_iconhd.c b/src/mares_iconhd.c
index 8739030..27d5596 100644
--- a/src/mares_iconhd.c
+++ b/src/mares_iconhd.c
@@ -463,7 +463,7 @@ mares_iconhd_extract_dives (dc_device_t *abstract, const unsigned char data[], u
 	if (model == ICONHDNET)
 		header = 0x80;
 	else if (model == SMART)
-		header = 4; // Type and number of samples only!
+		header = 6; // Type and number of samples only!
 
 	// Get the end of the profile ring buffer.
 	unsigned int eop = 0;
@@ -509,14 +509,16 @@ mares_iconhd_extract_dives (dc_device_t *abstract, const unsigned char data[], u
 		unsigned int headersize = 0x5C;
 		unsigned int samplesize = 8;
 		unsigned int fingerprint = 6;
+		unsigned int divetime = 0;
 		if (model == ICONHDNET) {
 			headersize = 0x80;
 			samplesize = 12;
 		} else if (model == SMART) {
 			if (mode == FREEDIVE) {
-				headersize = 0x2E;
-				samplesize = 6;
+				headersize = 0x50;
+				samplesize = 14;
 				fingerprint = 0x20;
+				divetime = array_uint16_le (buffer + offset - headersize + 36);
 			} else {
 				headersize = 0x5C;
 				samplesize = 8;
@@ -528,7 +530,7 @@ mares_iconhd_extract_dives (dc_device_t *abstract, const unsigned char data[], u
 		// If the buffer does not contain that much bytes, we reached the
 		// end of the ringbuffer. The current dive is incomplete (partially
 		// overwritten with newer data), and processing should stop.
-		unsigned int nbytes = 4 + headersize + nsamples * samplesize;
+		unsigned int nbytes = 4 + headersize + nsamples * samplesize + 2 * divetime;
 		if (model == ICONHDNET)
 			nbytes += (nsamples / 4) * 8;
 		if (offset < nbytes)
