+{
+ if( first == last ) return 1;
+ int n = 1;
+ Track *src = track, *dst = src->previous;
+ if( edl->session->gang_tracks != GANG_NONE ) {
+ while( src && !src->master ) src = src->previous;
+ if( !src ) src = first;
+ Track *nxt = src->next;
+ while( nxt && !nxt->master ) { ++n; nxt = nxt->next; }
+ dst = src->previous;
+ while( dst && !dst->master ) { dst = dst->previous; }
+ }
+ if( src == dst ) return 1;
+ move_tracks(src, dst, n);
+ return 0;
+}
+
+int Tracks::move_track_down(Track *track)
+{
+ if( first == last ) return 1;
+ int n = 1;
+ Track *src = track, *dst = src->next;
+ if( edl->session->gang_tracks != GANG_NONE ) {
+ while( src && !src->master ) src = src->previous;
+ if( !src ) src = first;
+ Track *nxt = src->next;
+ while( nxt && !nxt->master ) { ++n; nxt = nxt->next; }
+ if( nxt ) {
+ nxt = nxt->next;
+ while( nxt && !nxt->master ) { nxt = nxt->next; }
+ }
+ else
+ nxt = first;
+ dst = nxt;
+ }
+ else
+ dst = !dst ? first : dst->next;
+ if( src == dst ) return 1;
+ move_tracks(src, dst, n);
+ return 0;
+}
+
+
+int Tracks::move_tracks_up()
+{
+ if( first == last ) return 1;
+ int n = 1;
+ Track *src = first, *dst = 0;
+ if( edl->session->gang_tracks != GANG_NONE ) {
+ Track *nxt = src->next;
+ while( nxt && !nxt->master ) { ++n; nxt = nxt->next; }
+ }
+ if( src == dst ) return 1;
+ move_tracks(src, dst, n);
+ return 0;
+}
+
+int Tracks::move_tracks_down()
+{
+ if( first == last ) return 1;
+ int n = 1;
+ Track *src = last, *dst = first;
+ if( edl->session->gang_tracks != GANG_NONE ) {
+ while( src && !src->master ) { ++n; src = src->previous; }
+ }
+ if( src == dst ) return 1;
+ move_tracks(src, dst, n);
+ return 0;
+}
+
+
+int Tracks::swap_track_up(Track *track)