Index: 2.0-ongoing-import-timestamp/gtk2_ardour/editor_audio_import.cc
===================================================================
--- 2.0-ongoing-import-timestamp/gtk2_ardour/editor_audio_import.cc	(revision 5338)
+++ 2.0-ongoing-import-timestamp/gtk2_ardour/editor_audio_import.cc	(working copy)
@@ -683,8 +683,11 @@
 	ustring region_name;
 	uint32_t input_chan = 0;
 	uint32_t output_chan = 0;
+	bool use_timestamp;
+	
+	use_timestamp = (pos == -1);
 
-	if (pos == -1) { // "use timestamp"
+	if (use_timestamp) {
 		if (sources[0]->natural_position() != 0) {
 			pos = sources[0]->natural_position();
 		} else {
@@ -697,11 +700,16 @@
 		/* take all the sources we have and package them up as a region */
 
 		region_name = region_name_from_path (paths.front(), (sources.size() > 1), false);
-		
-		regions.push_back (boost::dynamic_pointer_cast<AudioRegion> 
+		boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> 
 				   (RegionFactory::create (sources, 0, sources[0]->length(), region_name, 0,
-							   Region::Flag (Region::DefaultFlags|Region::WholeFile|Region::External))));
+							   Region::Flag (Region::DefaultFlags|Region::WholeFile|Region::External)));
+							   
+        if (use_timestamp) {
+		    ar->special_set_position(sources[0]->natural_position());
+		}
 		
+		regions.push_back (ar);
+		
 	} else if (target_regions == -1 || target_regions > 1) {
 
 		/* take each source and create a region for each one */
@@ -718,11 +726,15 @@
 			boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource> (*x);
 
 			region_name = region_name_from_path (afs->path(), false, true, sources.size(), n);
-
-			regions.push_back (boost::dynamic_pointer_cast<AudioRegion> 
+			boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> 
 					   (RegionFactory::create (just_one, 0, (*x)->length(), region_name, 0,
-								   Region::Flag (Region::DefaultFlags|Region::WholeFile|Region::External))));
+								   Region::Flag (Region::DefaultFlags|Region::WholeFile|Region::External)));
 
+            if (use_timestamp) {
+    		    ar->special_set_position((*x)->natural_position());
+    		}
+
+			regions.push_back (ar);
 		}
 	}
 
Index: 2.0-ongoing-import-timestamp/libs/ardour/ardour/sndfileimportable.h
===================================================================
--- 2.0-ongoing-import-timestamp/libs/ardour/ardour/sndfileimportable.h	(revision 5338)
+++ 2.0-ongoing-import-timestamp/libs/ardour/ardour/sndfileimportable.h	(working copy)
@@ -38,11 +38,13 @@
 	nframes_t length() const;
 	nframes_t samplerate() const;
 	void      seek (nframes_t pos);
+	nframes_t natural_position() const;
 
    protected:
 	SF_INFO sf_info;
 	boost::shared_ptr<SNDFILE> in;
-
+	nframes_t timecode;
+	int64_t get_timecode_info (SNDFILE*, SF_BROADCAST_INFO*, bool&);
 };
 
 }
Index: 2.0-ongoing-import-timestamp/libs/ardour/ardour/importable_source.h
===================================================================
--- 2.0-ongoing-import-timestamp/libs/ardour/ardour/importable_source.h	(revision 5338)
+++ 2.0-ongoing-import-timestamp/libs/ardour/ardour/importable_source.h	(working copy)
@@ -36,6 +36,7 @@
 	virtual nframes_t length() const = 0;
 	virtual nframes_t samplerate() const = 0;
 	virtual void      seek (nframes_t pos) = 0;
+	virtual nframes_t natural_position() const = 0;
 };
 
 }
Index: 2.0-ongoing-import-timestamp/libs/ardour/ardour/resampled_source.h
===================================================================
--- 2.0-ongoing-import-timestamp/libs/ardour/ardour/resampled_source.h	(revision 5338)
+++ 2.0-ongoing-import-timestamp/libs/ardour/ardour/resampled_source.h	(working copy)
@@ -40,6 +40,7 @@
 	nframes_t length() const { return source->length(); }
 	nframes_t samplerate() const { return source->samplerate(); }
 	void      seek (nframes_t pos) { source->seek (pos); }
+	nframes_t natural_position() const { return source->natural_position(); }
 	
 	static const uint32_t blocksize;
 	
Index: 2.0-ongoing-import-timestamp/libs/ardour/ardour/caimportable.h
===================================================================
--- 2.0-ongoing-import-timestamp/libs/ardour/ardour/caimportable.h	(revision 5338)
+++ 2.0-ongoing-import-timestamp/libs/ardour/ardour/caimportable.h	(working copy)
@@ -38,6 +38,7 @@
 	nframes_t length() const;
 	nframes_t samplerate() const;
 	void      seek (nframes_t pos);
+	nframes_t natural_position() const { return 0; }
 
    protected:
 	mutable CAAudioFile af;
Index: 2.0-ongoing-import-timestamp/libs/ardour/ardour/audiofilesource.h
===================================================================
--- 2.0-ongoing-import-timestamp/libs/ardour/ardour/audiofilesource.h	(revision 5338)
+++ 2.0-ongoing-import-timestamp/libs/ardour/ardour/audiofilesource.h	(working copy)
@@ -125,6 +125,8 @@
 
 	bool can_be_analysed() const { return _length > 0; } 
 
+	virtual void set_timeline_position (int64_t pos);
+
 	static bool find (Glib::ustring path, bool must_exist, bool embedded, bool& is_new, uint16_t& chan,
 			  Glib::ustring& found_path, std::string& found_name);
 
@@ -164,7 +166,6 @@
 
 	static uint64_t header_position_offset;
 
-	virtual void set_timeline_position (int64_t pos);
 	virtual void set_header_timeline_position () = 0;
 
 	bool removable() const;
Index: 2.0-ongoing-import-timestamp/libs/ardour/sndfileimportable.cc
===================================================================
--- 2.0-ongoing-import-timestamp/libs/ardour/sndfileimportable.cc	(revision 5338)
+++ 2.0-ongoing-import-timestamp/libs/ardour/sndfileimportable.cc	(working copy)
@@ -1,16 +1,43 @@
 #include <ardour/sndfileimportable.h>
 #include <sndfile.h>
 #include <iostream>
+#include <cstring>
 #include <string.h>
 
 using namespace ARDOUR;
 using namespace std;
 
+/* FIXME: this was copied from sndfilesource.cc, at some point these should be merged */
+int64_t
+SndFileImportableSource::get_timecode_info (SNDFILE* sf, SF_BROADCAST_INFO* binfo, bool& exists)
+{
+	if (sf_command (sf, SFC_GET_BROADCAST_INFO, binfo, sizeof (*binfo)) != SF_TRUE) {
+		exists = false;
+		return 0;
+	} 
+	
+	exists = true;
+	int64_t ret = (uint32_t) binfo->time_reference_high;
+	ret <<= 32;
+	ret |= (uint32_t) binfo->time_reference_low;
+	return ret;
+}
+
 SndFileImportableSource::SndFileImportableSource (const string& path)
 {
 	memset(&sf_info, 0 , sizeof(sf_info));
 	in.reset( sf_open(path.c_str(), SFM_READ, &sf_info), sf_close);
 	if (!in) throw failed_constructor();
+	
+	SF_BROADCAST_INFO binfo;
+	bool timecode_exists;
+
+	memset (&binfo, 0, sizeof (binfo));
+	timecode = get_timecode_info (in.get(), &binfo, timecode_exists);
+	
+	if (!timecode_exists) {
+		timecode = 0;
+	}
 }
 
 SndFileImportableSource::~SndFileImportableSource ()
@@ -48,3 +75,9 @@
 {
 	sf_seek (in.get(), 0, SEEK_SET);
 }
+
+nframes_t
+SndFileImportableSource::natural_position () const
+{
+	return timecode;
+}
Index: 2.0-ongoing-import-timestamp/libs/ardour/import.cc
===================================================================
--- 2.0-ongoing-import-timestamp/libs/ardour/import.cc	(revision 5338)
+++ 2.0-ongoing-import-timestamp/libs/ardour/import.cc	(working copy)
@@ -193,8 +193,11 @@
 
 static bool
 create_mono_sources_for_writing (const vector<string>& new_paths, Session& sess,
-		uint samplerate, vector<boost::shared_ptr<AudioFileSource> >& newfiles)
+		uint samplerate, vector<boost::shared_ptr<AudioFileSource> >& newfiles,
+		nframes_t timeline_position)
 {
+    boost::shared_ptr<AudioFileSource> afs;
+    
 	for (vector<string>::const_iterator i = new_paths.begin();
 			i != new_paths.end(); ++i)
 	{
@@ -215,7 +218,9 @@
 			return false;
 		}
 
-		newfiles.push_back(boost::dynamic_pointer_cast<AudioFileSource>(source));
+		afs = boost::dynamic_pointer_cast<AudioFileSource>(source);
+		afs->set_timeline_position(timeline_position);
+		newfiles.push_back(afs);
 	}
 	return true;
 }
@@ -337,7 +342,7 @@
 			fatal << "THIS IS NOT IMPLEMENTED YET, IT SHOULD NEVER GET CALLED!!! DYING!" << endl;
 			status.cancel = !map_existing_mono_sources (new_paths, *this, frame_rate(), newfiles, this);
 		} else {
-			status.cancel = !create_mono_sources_for_writing (new_paths, *this, frame_rate(), newfiles);
+			status.cancel = !create_mono_sources_for_writing (new_paths, *this, frame_rate(), newfiles, source->natural_position());
 		}
 
 		// copy on cancel/failure so that any files that were created will be removed below
@@ -366,7 +371,7 @@
 
 		for (AudioSources::iterator x = all_new_sources.begin(); x != all_new_sources.end(); ++x)
 		{
-			(*x)->update_header(0, *now, xnow);
+			(*x)->update_header((*x)->natural_position(), *now, xnow);
 			(*x)->done_with_peakfile_writes ();
 			
 			/* now that there is data there, requeue the file for analysis */
