[SCM] gsequencer/master: New upstream version 0.7.122.20

jkraehemann-guest at users.alioth.debian.org jkraehemann-guest at users.alioth.debian.org
Thu Apr 13 09:30:28 UTC 2017


The following commit has been merged in the master branch:
commit 63e2ba649b9f0d32f7640f1fb24ef30ae53a8790
Author: Joël Krähemann <jkraehemann-guest at users.alioth.debian.org>
Date:   Thu Apr 13 10:43:22 2017 +0200

    New upstream version 0.7.122.20

diff --git a/ChangeLog b/ChangeLog
index 00d9a62..706c5bb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,31 @@
+ags (0.7.122.20)
+
+	[ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ]
+	* fixed automation to use previous value if range doesn't match
+	* added functional test to check editor workflow
+
+ags (0.7.122.19)
+
+	[ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ]
+	* implemented AgsEffectSeparator for AgsLine and AgsEffectLine
+	* removed gtk separator in AgsLine and AgsEffectLine
+	* disabled AgsDestroyWorker
+
+ags (0.7.122.18)
+
+	[ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ]
+	* fixed dead-lock as removing line member
+	* improved plugin browser to reset plugin type
+	* improved the speed of functional tests
+	* added functional test to check line member sanity
+
+ags (0.7.122.17)
+
+	[ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ]
+	* implemented AgsClearAudioSignal task
+	* fixed ags_synth_update() it didn't clear the buffers correctly
+	* added functional test to check link sanity
+
 ags (0.7.122.16)
 
 	[ Joël Krähemann (Maintainer of Advanced Gtk+ Sequencer) ]
diff --git a/INSTALL b/INSTALL
index 6e90e07..2099840 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,7 +1,7 @@
 Installation Instructions
 *************************
 
-Copyright (C) 1994-1996, 1999-2002, 2004-2012 Free Software Foundation,
+Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation,
 Inc.
 
    Copying and distribution of this file, with or without modification,
@@ -12,8 +12,8 @@ without warranty of any kind.
 Basic Installation
 ==================
 
-   Briefly, the shell commands `./configure; make; make install' should
-configure, build, and install this package.  The following
+   Briefly, the shell command `./configure && make && make install'
+should configure, build, and install this package.  The following
 more-detailed instructions are generic; see the `README' file for
 instructions specific to this package.  Some packages provide this
 `INSTALL' file but do not implement all of the features documented
diff --git a/Makefile.am b/Makefile.am
index 7943e9c..2801c1f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -12,8 +12,10 @@ AM_CPPFLAGS = -std=gnu99 -include /usr/include/errno.h -I$(top_srcdir) -DDESTDIR
 CFLAGS = @CFLAGS@
 LDFLAGS = @LDFLAGS@
 LIBTOOL_DEPS = @LIBTOOL_DEPS@
+
 gsequencer_CFLAGS = @GSEQUENCER_CFLAGS@
 gsequencer_LDFLAGS = @GSEQUENCER_LDFLAGS@
+
 midi2xml_CFLAGS = @GSEQUENCER_CFLAGS@
 midi2xml_LDFLAGS = @GSEQUENCER_LDFLAGS@
 
@@ -33,6 +35,10 @@ libgsequencer_LTLIBRARIES = libgsequencer.la
 EXTRA_DIST = COPYING.docs config.h config.h.in gtk-doc.make gsequencer.share acsite.m4 aclocal.m4 gsequencer.1 README ags_example.xml gsequencer-documentation midi2xml.1 ags_functional_note_edit_test.xml
 
 EXTRA_DIST += \
+	functional-system-tests.mk.am \
+	functional-system-tests.mk.in
+
+EXTRA_DIST += \
 	docs/reference/libags/libags-sections.txt \
 	docs/reference/libags/libags.types \
 	docs/reference/libags-audio/libags_audio-sections.txt \
@@ -42,7 +48,7 @@ EXTRA_DIST += \
 
 man1_MANS = gsequencer.1 midi2xml.1
 
-CLEANFILES = 
+CLEANFILES = functional-system-tests.mk
 
 # pkg-config
 pkgconfigdir = $(libdir)/pkgconfig
@@ -916,6 +922,7 @@ libags_audio_task_h_sources = \
 	ags/audio/task/ags_cancel_channel.h \
 	ags/audio/task/ags_cancel_recall.h \
 	ags/audio/task/ags_change_soundcard.h \
+	ags/audio/task/ags_clear_audio_signal.h \
 	ags/audio/task/ags_clear_buffer.h \
 	ags/audio/task/ags_export_output.h \
 	ags/audio/task/ags_free_selection.h \
@@ -978,6 +985,7 @@ libags_audio_task_c_sources = \
 	ags/audio/task/ags_cancel_channel.c \
 	ags/audio/task/ags_cancel_recall.c \
 	ags/audio/task/ags_change_soundcard.c \
+	ags/audio/task/ags_clear_audio_signal.c \
 	ags/audio/task/ags_clear_buffer.c \
 	ags/audio/task/ags_export_output.c \
 	ags/audio/task/ags_free_selection.c \
@@ -1089,6 +1097,7 @@ libgsequencer_h_sources = \
 	ags/X/ags_effect_line.h \
 	ags/X/ags_effect_pad_callbacks.h \
 	ags/X/ags_effect_pad.h \
+	ags/X/ags_effect_separator.h \
 	ags/X/ags_export_soundcard_callbacks.h \
 	ags/X/ags_export_soundcard.h \
 	ags/X/ags_export_window_callbacks.h \
@@ -1187,6 +1196,7 @@ libgsequencer_c_sources = \
 	ags/X/ags_effect_line_callbacks.c \
 	ags/X/ags_effect_pad.c \
 	ags/X/ags_effect_pad_callbacks.c \
+	ags/X/ags_effect_separator.c \
 	ags/X/ags_export_soundcard.c \
 	ags/X/ags_export_soundcard_callbacks.c \
 	ags/X/ags_export_window.c \
@@ -1551,6 +1561,9 @@ midi2xml_LDADD = libags_audio.la libags_server.la libags_gui.la libags_thread.la
 
 midi2xml_SOURCES = ags/midi2xml_main.c
 
+ags-integration-test: 
+	$(MAKE) -C $(top_srcdir) -f functional-system-tests.mk ags-check-system
+
 ags-docs-local:
 	$(MAKE) -C $(top_srcdir)/docs/reference/libags
 	cd $(top_srcdir)
@@ -1655,7 +1668,7 @@ clean-local:
 	rm -f $(top_builddir)/docs/reference/libags-audio/Makefile
 	rm -f $(top_builddir)/docs/reference/libags-gui/Makefile
 	rm -f $(top_builddir)/docs/reference/libgsequencer/Makefile
-
+	rm -f $(top_builddir)/functional-system-tests.mk
 
 gen-symbols-ags:
 	rm -f libags.sym
diff --git a/Makefile.in b/Makefile.in
index f82ff8b..df7cc93 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -103,6 +103,9 @@ check_PROGRAMS = ags_thread_test$(EXEEXT) ags_turtle_test$(EXEEXT) \
 	ags_xorg_application_context_test$(EXEEXT) \
 	ags_functional_audio_test$(EXEEXT) \
 	ags_functional_machine_add_and_destroy_test$(EXEEXT) \
+	ags_functional_machine_link_test$(EXEEXT) \
+	ags_functional_line_member_add_and_destroy_test$(EXEEXT) \
+	ags_functional_editor_workflow_test$(EXEEXT) \
 	ags_functional_panel_test$(EXEEXT) \
 	ags_functional_mixer_test$(EXEEXT) \
 	ags_functional_drum_test$(EXEEXT) \
@@ -161,8 +164,7 @@ am__installdirs = "$(DESTDIR)$(libdir)" \
 	"$(DESTDIR)$(man1dir)" "$(DESTDIR)$(appdatadir)" \
 	"$(DESTDIR)$(docdir)" "$(DESTDIR)$(pkgconfigdir)" \
 	"$(DESTDIR)$(includedir)"
-LTLIBRARIES = $(lib_LTLIBRARIES) $(libgsequencer_LTLIBRARIES) \
-	$(noinst_LTLIBRARIES)
+LTLIBRARIES = $(lib_LTLIBRARIES) $(libgsequencer_LTLIBRARIES)
 am__DEPENDENCIES_1 =
 libags_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
@@ -328,6 +330,7 @@ am__objects_12 = $(am__objects_1) \
 	ags/audio/task/libags_audio_la-ags_cancel_channel.lo \
 	ags/audio/task/libags_audio_la-ags_cancel_recall.lo \
 	ags/audio/task/libags_audio_la-ags_change_soundcard.lo \
+	ags/audio/task/libags_audio_la-ags_clear_audio_signal.lo \
 	ags/audio/task/libags_audio_la-ags_clear_buffer.lo \
 	ags/audio/task/libags_audio_la-ags_export_output.lo \
 	ags/audio/task/libags_audio_la-ags_free_selection.lo \
@@ -568,6 +571,7 @@ am__objects_21 = $(am__objects_1) \
 	ags/X/libgsequencer_la-ags_effect_line_callbacks.lo \
 	ags/X/libgsequencer_la-ags_effect_pad.lo \
 	ags/X/libgsequencer_la-ags_effect_pad_callbacks.lo \
+	ags/X/libgsequencer_la-ags_effect_separator.lo \
 	ags/X/libgsequencer_la-ags_export_soundcard.lo \
 	ags/X/libgsequencer_la-ags_export_soundcard_callbacks.lo \
 	ags/X/libgsequencer_la-ags_export_window.lo \
@@ -759,13 +763,14 @@ libgsequencer_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
 	$(libgsequencer_la_CFLAGS) $(CFLAGS) \
 	$(libgsequencer_la_LDFLAGS) $(LDFLAGS) -o $@
-libgsequencer_test_la_DEPENDENCIES = libgsequencer.la libags_audio.la \
-	libags_server.la libags_gui.la libags_thread.la libags.la \
+am__DEPENDENCIES_2 = libgsequencer.la libags_audio.la libags_server.la \
+	libags_gui.la libags_thread.la libags.la $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+	$(am__DEPENDENCIES_1)
+libgsequencer_test_la_DEPENDENCIES = $(am__DEPENDENCIES_2)
 am_libgsequencer_test_la_OBJECTS =  \
 	ags/test/X/libgsequencer_test_la-gsequencer_setup_util.lo \
 	ags/test/X/libgsequencer_test_la-ags_functional_test_util.lo
@@ -848,11 +853,14 @@ ags_devout_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 am_ags_functional_audio_test_OBJECTS = ags/test/audio/ags_functional_audio_test-ags_functional_audio_test.$(OBJEXT)
 ags_functional_audio_test_OBJECTS =  \
 	$(am_ags_functional_audio_test_OBJECTS)
-ags_functional_audio_test_DEPENDENCIES = libags_audio.la \
-	libags_server.la libags_gui.la libags_thread.la libags.la \
+am__DEPENDENCIES_3 = libgsequencer.la libags_audio.la libags_server.la \
+	libags_gui.la libags_thread.la libags.la libgsequencer_test.la \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+ags_functional_audio_test_DEPENDENCIES = $(am__DEPENDENCIES_3)
 ags_functional_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
 	$(ags_functional_audio_test_CFLAGS) $(CFLAGS) \
@@ -860,44 +868,46 @@ ags_functional_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 am_ags_functional_drum_test_OBJECTS = ags/test/X/machine/ags_functional_drum_test-ags_functional_drum_test.$(OBJEXT)
 ags_functional_drum_test_OBJECTS =  \
 	$(am_ags_functional_drum_test_OBJECTS)
-ags_functional_drum_test_DEPENDENCIES = libgsequencer.la \
-	libags_audio.la libags_server.la libags_gui.la \
-	libags_thread.la libags.la libgsequencer_test.la \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+ags_functional_drum_test_DEPENDENCIES = $(am__DEPENDENCIES_3)
 ags_functional_drum_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
 	$(ags_functional_drum_test_CFLAGS) $(CFLAGS) \
 	$(ags_functional_drum_test_LDFLAGS) $(LDFLAGS) -o $@
+am_ags_functional_editor_workflow_test_OBJECTS = ags/test/X/ags_functional_editor_workflow_test-ags_functional_editor_workflow_test.$(OBJEXT)
+ags_functional_editor_workflow_test_OBJECTS =  \
+	$(am_ags_functional_editor_workflow_test_OBJECTS)
+ags_functional_editor_workflow_test_DEPENDENCIES =  \
+	$(am__DEPENDENCIES_3)
+ags_functional_editor_workflow_test_LINK = $(LIBTOOL) $(AM_V_lt) \
+	--tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+	$(CCLD) $(ags_functional_editor_workflow_test_CFLAGS) \
+	$(CFLAGS) $(ags_functional_editor_workflow_test_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_ags_functional_ffplayer_test_OBJECTS = ags/test/X/machine/ags_functional_ffplayer_test-ags_functional_ffplayer_test.$(OBJEXT)
 ags_functional_ffplayer_test_OBJECTS =  \
 	$(am_ags_functional_ffplayer_test_OBJECTS)
-ags_functional_ffplayer_test_DEPENDENCIES = libgsequencer.la \
-	libags_audio.la libags_server.la libags_gui.la \
-	libags_thread.la libags.la libgsequencer_test.la \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+ags_functional_ffplayer_test_DEPENDENCIES = $(am__DEPENDENCIES_3)
 ags_functional_ffplayer_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
 	$(ags_functional_ffplayer_test_CFLAGS) $(CFLAGS) \
 	$(ags_functional_ffplayer_test_LDFLAGS) $(LDFLAGS) -o $@
+am_ags_functional_line_member_add_and_destroy_test_OBJECTS = ags/test/X/ags_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.$(OBJEXT)
+ags_functional_line_member_add_and_destroy_test_OBJECTS =  \
+	$(am_ags_functional_line_member_add_and_destroy_test_OBJECTS)
+ags_functional_line_member_add_and_destroy_test_DEPENDENCIES =  \
+	$(am__DEPENDENCIES_3)
+ags_functional_line_member_add_and_destroy_test_LINK = $(LIBTOOL) \
+	$(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) \
+	$(ags_functional_line_member_add_and_destroy_test_CFLAGS) \
+	$(CFLAGS) \
+	$(ags_functional_line_member_add_and_destroy_test_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_ags_functional_machine_add_and_destroy_test_OBJECTS = ags/test/X/ags_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.$(OBJEXT)
 ags_functional_machine_add_and_destroy_test_OBJECTS =  \
 	$(am_ags_functional_machine_add_and_destroy_test_OBJECTS)
 ags_functional_machine_add_and_destroy_test_DEPENDENCIES =  \
-	libgsequencer.la libags_audio.la libags_server.la \
-	libags_gui.la libags_thread.la libags.la libgsequencer_test.la \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+	$(am__DEPENDENCIES_3)
 ags_functional_machine_add_and_destroy_test_LINK = $(LIBTOOL) \
 	$(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
 	--mode=link $(CCLD) \
@@ -905,17 +915,18 @@ ags_functional_machine_add_and_destroy_test_LINK = $(LIBTOOL) \
 	$(CFLAGS) \
 	$(ags_functional_machine_add_and_destroy_test_LDFLAGS) \
 	$(LDFLAGS) -o $@
+am_ags_functional_machine_link_test_OBJECTS = ags/test/X/ags_functional_machine_link_test-ags_functional_machine_link_test.$(OBJEXT)
+ags_functional_machine_link_test_OBJECTS =  \
+	$(am_ags_functional_machine_link_test_OBJECTS)
+ags_functional_machine_link_test_DEPENDENCIES = $(am__DEPENDENCIES_3)
+ags_functional_machine_link_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(ags_functional_machine_link_test_CFLAGS) $(CFLAGS) \
+	$(ags_functional_machine_link_test_LDFLAGS) $(LDFLAGS) -o $@
 am_ags_functional_matrix_test_OBJECTS = ags/test/X/machine/ags_functional_matrix_test-ags_functional_matrix_test.$(OBJEXT)
 ags_functional_matrix_test_OBJECTS =  \
 	$(am_ags_functional_matrix_test_OBJECTS)
-ags_functional_matrix_test_DEPENDENCIES = libgsequencer.la \
-	libags_audio.la libags_server.la libags_gui.la \
-	libags_thread.la libags.la libgsequencer_test.la \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+ags_functional_matrix_test_DEPENDENCIES = $(am__DEPENDENCIES_3)
 ags_functional_matrix_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
 	$(ags_functional_matrix_test_CFLAGS) $(CFLAGS) \
@@ -923,14 +934,7 @@ ags_functional_matrix_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 am_ags_functional_mixer_test_OBJECTS = ags/test/X/machine/ags_functional_mixer_test-ags_functional_mixer_test.$(OBJEXT)
 ags_functional_mixer_test_OBJECTS =  \
 	$(am_ags_functional_mixer_test_OBJECTS)
-ags_functional_mixer_test_DEPENDENCIES = libgsequencer.la \
-	libags_audio.la libags_server.la libags_gui.la \
-	libags_thread.la libags.la libgsequencer_test.la \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+ags_functional_mixer_test_DEPENDENCIES = $(am__DEPENDENCIES_3)
 ags_functional_mixer_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
 	$(ags_functional_mixer_test_CFLAGS) $(CFLAGS) \
@@ -938,14 +942,7 @@ ags_functional_mixer_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 am_ags_functional_note_edit_test_OBJECTS = ags/test/X/ags_functional_note_edit_test-ags_functional_note_edit_test.$(OBJEXT)
 ags_functional_note_edit_test_OBJECTS =  \
 	$(am_ags_functional_note_edit_test_OBJECTS)
-ags_functional_note_edit_test_DEPENDENCIES = libgsequencer.la \
-	libags_audio.la libags_server.la libags_gui.la \
-	libags_thread.la libags.la libgsequencer_test.la \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+ags_functional_note_edit_test_DEPENDENCIES = $(am__DEPENDENCIES_3)
 ags_functional_note_edit_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
 	$(ags_functional_note_edit_test_CFLAGS) $(CFLAGS) \
@@ -953,14 +950,7 @@ ags_functional_note_edit_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 am_ags_functional_panel_test_OBJECTS = ags/test/X/machine/ags_functional_panel_test-ags_functional_panel_test.$(OBJEXT)
 ags_functional_panel_test_OBJECTS =  \
 	$(am_ags_functional_panel_test_OBJECTS)
-ags_functional_panel_test_DEPENDENCIES = libgsequencer.la \
-	libags_audio.la libags_server.la libags_gui.la \
-	libags_thread.la libags.la libgsequencer_test.la \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+ags_functional_panel_test_DEPENDENCIES = $(am__DEPENDENCIES_3)
 ags_functional_panel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
 	$(ags_functional_panel_test_CFLAGS) $(CFLAGS) \
@@ -968,14 +958,7 @@ ags_functional_panel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 am_ags_functional_synth_test_OBJECTS = ags/test/X/machine/ags_functional_synth_test-ags_functional_synth_test.$(OBJEXT)
 ags_functional_synth_test_OBJECTS =  \
 	$(am_ags_functional_synth_test_OBJECTS)
-ags_functional_synth_test_DEPENDENCIES = libgsequencer.la \
-	libags_audio.la libags_server.la libags_gui.la \
-	libags_thread.la libags.la libgsequencer_test.la \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+ags_functional_synth_test_DEPENDENCIES = $(am__DEPENDENCIES_3)
 ags_functional_synth_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
 	$(ags_functional_synth_test_CFLAGS) $(CFLAGS) \
@@ -1140,8 +1123,11 @@ SOURCES = $(libags_la_SOURCES) $(libags_audio_la_SOURCES) \
 	$(ags_devout_test_SOURCES) \
 	$(ags_functional_audio_test_SOURCES) \
 	$(ags_functional_drum_test_SOURCES) \
+	$(ags_functional_editor_workflow_test_SOURCES) \
 	$(ags_functional_ffplayer_test_SOURCES) \
+	$(ags_functional_line_member_add_and_destroy_test_SOURCES) \
 	$(ags_functional_machine_add_and_destroy_test_SOURCES) \
+	$(ags_functional_machine_link_test_SOURCES) \
 	$(ags_functional_matrix_test_SOURCES) \
 	$(ags_functional_mixer_test_SOURCES) \
 	$(ags_functional_note_edit_test_SOURCES) \
@@ -1163,8 +1149,11 @@ DIST_SOURCES = $(libags_la_SOURCES) $(libags_audio_la_SOURCES) \
 	$(ags_devout_test_SOURCES) \
 	$(ags_functional_audio_test_SOURCES) \
 	$(ags_functional_drum_test_SOURCES) \
+	$(ags_functional_editor_workflow_test_SOURCES) \
 	$(ags_functional_ffplayer_test_SOURCES) \
+	$(ags_functional_line_member_add_and_destroy_test_SOURCES) \
 	$(ags_functional_machine_add_and_destroy_test_SOURCES) \
+	$(ags_functional_machine_link_test_SOURCES) \
 	$(ags_functional_matrix_test_SOURCES) \
 	$(ags_functional_mixer_test_SOURCES) \
 	$(ags_functional_note_edit_test_SOURCES) \
@@ -1448,6 +1437,7 @@ GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
 GOBJECT_LIBS = @GOBJECT_LIBS@
 GREP = @GREP@
 GSEQUENCER_CFLAGS = @GSEQUENCER_CFLAGS@
+GSEQUENCER_FUNCTIONAL_TEST_LDADD = @GSEQUENCER_FUNCTIONAL_TEST_LDADD@
 GSEQUENCER_LDFLAGS = @GSEQUENCER_LDFLAGS@
 GTKDOC_CHECK = @GTKDOC_CHECK@
 GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
@@ -1469,6 +1459,7 @@ LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBASOUND2_CFLAGS = @LIBASOUND2_CFLAGS@
 LIBASOUND2_LIBS = @LIBASOUND2_LIBS@
+LIBGSEQUENCER_TEST_LIBADD = @LIBGSEQUENCER_TEST_LIBADD@
 LIBINSTPATCH_CFLAGS = @LIBINSTPATCH_CFLAGS@
 LIBINSTPATCH_LIBS = @LIBINSTPATCH_LIBS@
 LIBOBJS = @LIBOBJS@
@@ -1617,6 +1608,7 @@ EXTRA_DIST = COPYING.docs config.h config.h.in gtk-doc.make \
 	gsequencer.share acsite.m4 aclocal.m4 gsequencer.1 README \
 	ags_example.xml gsequencer-documentation midi2xml.1 \
 	ags_functional_note_edit_test.xml \
+	functional-system-tests.mk.am functional-system-tests.mk.in \
 	docs/reference/libags/libags-sections.txt \
 	docs/reference/libags/libags.types \
 	docs/reference/libags-audio/libags_audio-sections.txt \
@@ -1666,7 +1658,8 @@ EXTRA_DIST = COPYING.docs config.h config.h.in gtk-doc.make \
 man1_MANS = gsequencer.1 midi2xml.1
 
 # clean
-CLEANFILES = $(appdata_DATA) $(pkgconfig_DATA)
+CLEANFILES = functional-system-tests.mk $(appdata_DATA) \
+	$(pkgconfig_DATA)
 
 # pkg-config
 pkgconfigdir = $(libdir)/pkgconfig
@@ -1900,75 +1893,112 @@ ags_xorg_application_context_test_SOURCES = ags/test/X/ags_xorg_application_cont
 ags_xorg_application_context_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
 ags_xorg_application_context_test_LDFLAGS = -pthread $(LDFLAGS)
 ags_xorg_application_context_test_LDADD = libgsequencer.la libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la -lcunit -lm -lrt $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
-noinst_LTLIBRARIES = libgsequencer_test.la
+
+# libadd and ldadd
+libgsequencer_test_LIBADD = @LIBGSEQUENCER_TEST_LIBADD@ \
+	libgsequencer.la libags_audio.la libags_server.la \
+	libags_gui.la libags_thread.la libags.la -lcunit -lrt -lm \
+	$(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) \
+	$(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) \
+	$(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) \
+	$(CAIRO_LIBS) $(GTK_LIBS)
+gsequencer_functional_test_LDADD = @GSEQUENCER_FUNCTIONAL_TEST_LDADD@ \
+	libgsequencer.la libags_audio.la libags_server.la \
+	libags_gui.la libags_thread.la libags.la libgsequencer_test.la \
+	-lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) \
+	$(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) \
+	$(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) \
+	$(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+check_LTLIBRARIES = libgsequencer_test.la
 
 # functional test util library
 libgsequencer_test_la_SOURCES = ags/test/X/gsequencer_setup_util.c ags/test/X/gsequencer_setup_util.h ags/test/X/ags_functional_test_util.c ags/test/X/ags_functional_test_util.h ags/test/X/libgsequencer.h
 libgsequencer_test_la_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
 libgsequencer_test_la_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
-libgsequencer_test_la_LIBADD = libgsequencer.la libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+libgsequencer_test_la_LIBADD = $(libgsequencer_test_LIBADD)
 
 # functional audio test
 ags_functional_audio_test_SOURCES = ags/test/audio/ags_functional_audio_test.c
 ags_functional_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS)
 ags_functional_audio_test_LDFLAGS = -pthread $(LDFLAGS)
-ags_functional_audio_test_LDADD = libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS)
+ags_functional_audio_test_LDADD = $(gsequencer_functional_test_LDADD)
 
 # functional machine add and destroy test
 ags_functional_machine_add_and_destroy_test_SOURCES = ags/test/X/ags_functional_machine_add_and_destroy_test.c
 ags_functional_machine_add_and_destroy_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
 ags_functional_machine_add_and_destroy_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
 ags_functional_machine_add_and_destroy_test_LDFLAGS = -pthread $(LDFLAGS)
-ags_functional_machine_add_and_destroy_test_LDADD = libgsequencer.la libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la libgsequencer_test.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+ags_functional_machine_add_and_destroy_test_LDADD = $(gsequencer_functional_test_LDADD)
+
+# functional machine link test
+ags_functional_machine_link_test_SOURCES = ags/test/X/ags_functional_machine_link_test.c
+ags_functional_machine_link_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_functional_machine_link_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_functional_machine_link_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_functional_machine_link_test_LDADD = $(gsequencer_functional_test_LDADD)
+
+# functional line member add and destroy test
+ags_functional_line_member_add_and_destroy_test_SOURCES = ags/test/X/ags_functional_line_member_add_and_destroy_test.c
+ags_functional_line_member_add_and_destroy_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_functional_line_member_add_and_destroy_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_functional_line_member_add_and_destroy_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_functional_line_member_add_and_destroy_test_LDADD = $(gsequencer_functional_test_LDADD)
+
+# functional editor workflow test
+ags_functional_editor_workflow_test_SOURCES = ags/test/X/ags_functional_editor_workflow_test.c
+ags_functional_editor_workflow_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_functional_editor_workflow_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_functional_editor_workflow_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_functional_editor_workflow_test_LDADD = $(gsequencer_functional_test_LDADD)
 
 # functional panel test
 ags_functional_panel_test_SOURCES = ags/test/X/machine/ags_functional_panel_test.c
 ags_functional_panel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
 ags_functional_panel_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
 ags_functional_panel_test_LDFLAGS = -pthread $(LDFLAGS)
-ags_functional_panel_test_LDADD = libgsequencer.la libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la libgsequencer_test.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+ags_functional_panel_test_LDADD = $(gsequencer_functional_test_LDADD)
 
 # functional mixer test
 ags_functional_mixer_test_SOURCES = ags/test/X/machine/ags_functional_mixer_test.c
 ags_functional_mixer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
 ags_functional_mixer_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
 ags_functional_mixer_test_LDFLAGS = -pthread $(LDFLAGS)
-ags_functional_mixer_test_LDADD = libgsequencer.la libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la libgsequencer_test.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+ags_functional_mixer_test_LDADD = $(gsequencer_functional_test_LDADD)
 
 # functional drum test
 ags_functional_drum_test_SOURCES = ags/test/X/machine/ags_functional_drum_test.c
 ags_functional_drum_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
 ags_functional_drum_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
 ags_functional_drum_test_LDFLAGS = -pthread $(LDFLAGS)
-ags_functional_drum_test_LDADD = libgsequencer.la libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la libgsequencer_test.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+ags_functional_drum_test_LDADD = $(gsequencer_functional_test_LDADD)
 
 # functional matrix test
 ags_functional_matrix_test_SOURCES = ags/test/X/machine/ags_functional_matrix_test.c
 ags_functional_matrix_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
 ags_functional_matrix_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
 ags_functional_matrix_test_LDFLAGS = -pthread $(LDFLAGS)
-ags_functional_matrix_test_LDADD = libgsequencer.la libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la libgsequencer_test.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+ags_functional_matrix_test_LDADD = $(gsequencer_functional_test_LDADD)
 
 # functional synth test
 ags_functional_synth_test_SOURCES = ags/test/X/machine/ags_functional_synth_test.c
 ags_functional_synth_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
 ags_functional_synth_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
 ags_functional_synth_test_LDFLAGS = -pthread $(LDFLAGS)
-ags_functional_synth_test_LDADD = libgsequencer.la libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la libgsequencer_test.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+ags_functional_synth_test_LDADD = $(gsequencer_functional_test_LDADD)
 
 # functional ffplayer test
 ags_functional_ffplayer_test_SOURCES = ags/test/X/machine/ags_functional_ffplayer_test.c
 ags_functional_ffplayer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
 ags_functional_ffplayer_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
 ags_functional_ffplayer_test_LDFLAGS = -pthread $(LDFLAGS)
-ags_functional_ffplayer_test_LDADD = libgsequencer.la libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la libgsequencer_test.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+ags_functional_ffplayer_test_LDADD = $(gsequencer_functional_test_LDADD)
 
 # functional note edit test
 ags_functional_note_edit_test_SOURCES = ags/test/X/ags_functional_note_edit_test.c
 ags_functional_note_edit_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
 ags_functional_note_edit_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
 ags_functional_note_edit_test_LDFLAGS = -pthread $(LDFLAGS)
-ags_functional_note_edit_test_LDADD = libgsequencer.la libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la libgsequencer_test.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+ags_functional_note_edit_test_LDADD = $(gsequencer_functional_test_LDADD)
 TESTS = $(check_PROGRAMS)
 
 # libags all files
@@ -2622,6 +2652,7 @@ libags_audio_task_h_sources = \
 	ags/audio/task/ags_cancel_channel.h \
 	ags/audio/task/ags_cancel_recall.h \
 	ags/audio/task/ags_change_soundcard.h \
+	ags/audio/task/ags_clear_audio_signal.h \
 	ags/audio/task/ags_clear_buffer.h \
 	ags/audio/task/ags_export_output.h \
 	ags/audio/task/ags_free_selection.h \
@@ -2683,6 +2714,7 @@ libags_audio_task_c_sources = \
 	ags/audio/task/ags_cancel_channel.c \
 	ags/audio/task/ags_cancel_recall.c \
 	ags/audio/task/ags_change_soundcard.c \
+	ags/audio/task/ags_clear_audio_signal.c \
 	ags/audio/task/ags_clear_buffer.c \
 	ags/audio/task/ags_export_output.c \
 	ags/audio/task/ags_free_selection.c \
@@ -2793,6 +2825,7 @@ libgsequencer_h_sources = \
 	ags/X/ags_effect_line.h \
 	ags/X/ags_effect_pad_callbacks.h \
 	ags/X/ags_effect_pad.h \
+	ags/X/ags_effect_separator.h \
 	ags/X/ags_export_soundcard_callbacks.h \
 	ags/X/ags_export_soundcard.h \
 	ags/X/ags_export_window_callbacks.h \
@@ -2890,6 +2923,7 @@ libgsequencer_c_sources = \
 	ags/X/ags_effect_line_callbacks.c \
 	ags/X/ags_effect_pad.c \
 	ags/X/ags_effect_pad_callbacks.c \
+	ags/X/ags_effect_separator.c \
 	ags/X/ags_export_soundcard.c \
 	ags/X/ags_export_soundcard_callbacks.c \
 	ags/X/ags_export_window.c \
@@ -3307,6 +3341,17 @@ libags_gui.pc: $(top_builddir)/config.status $(srcdir)/libags_gui.pc.in
 libgsequencer.pc: $(top_builddir)/config.status $(srcdir)/libgsequencer.pc.in
 	cd $(top_builddir) && $(SHELL) ./config.status $@
 
+clean-checkLTLIBRARIES:
+	-test -z "$(check_LTLIBRARIES)" || rm -f $(check_LTLIBRARIES)
+	@list='$(check_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
 install-libLTLIBRARIES: $(lib_LTLIBRARIES)
 	@$(NORMAL_INSTALL)
 	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
@@ -3376,17 +3421,6 @@ clean-libgsequencerLTLIBRARIES:
 	  echo rm -f $${locs}; \
 	  rm -f $${locs}; \
 	}
-
-clean-noinstLTLIBRARIES:
-	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
-	@list='$(noinst_LTLIBRARIES)'; \
-	locs=`for p in $$list; do echo $$p; done | \
-	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
-	      sort -u`; \
-	test -z "$$locs" || { \
-	  echo rm -f $${locs}; \
-	  rm -f $${locs}; \
-	}
 ags/lib/$(am__dirstamp):
 	@$(MKDIR_P) ags/lib
 	@: > ags/lib/$(am__dirstamp)
@@ -3788,6 +3822,9 @@ ags/audio/task/libags_audio_la-ags_cancel_recall.lo:  \
 ags/audio/task/libags_audio_la-ags_change_soundcard.lo:  \
 	ags/audio/task/$(am__dirstamp) \
 	ags/audio/task/$(DEPDIR)/$(am__dirstamp)
+ags/audio/task/libags_audio_la-ags_clear_audio_signal.lo:  \
+	ags/audio/task/$(am__dirstamp) \
+	ags/audio/task/$(DEPDIR)/$(am__dirstamp)
 ags/audio/task/libags_audio_la-ags_clear_buffer.lo:  \
 	ags/audio/task/$(am__dirstamp) \
 	ags/audio/task/$(DEPDIR)/$(am__dirstamp)
@@ -4382,6 +4419,8 @@ ags/X/libgsequencer_la-ags_effect_pad.lo: ags/X/$(am__dirstamp) \
 	ags/X/$(DEPDIR)/$(am__dirstamp)
 ags/X/libgsequencer_la-ags_effect_pad_callbacks.lo:  \
 	ags/X/$(am__dirstamp) ags/X/$(DEPDIR)/$(am__dirstamp)
+ags/X/libgsequencer_la-ags_effect_separator.lo: ags/X/$(am__dirstamp) \
+	ags/X/$(DEPDIR)/$(am__dirstamp)
 ags/X/libgsequencer_la-ags_export_soundcard.lo: ags/X/$(am__dirstamp) \
 	ags/X/$(DEPDIR)/$(am__dirstamp)
 ags/X/libgsequencer_la-ags_export_soundcard_callbacks.lo:  \
@@ -5022,6 +5061,13 @@ ags/test/X/machine/ags_functional_drum_test-ags_functional_drum_test.$(OBJEXT):
 ags_functional_drum_test$(EXEEXT): $(ags_functional_drum_test_OBJECTS) $(ags_functional_drum_test_DEPENDENCIES) $(EXTRA_ags_functional_drum_test_DEPENDENCIES) 
 	@rm -f ags_functional_drum_test$(EXEEXT)
 	$(AM_V_CCLD)$(ags_functional_drum_test_LINK) $(ags_functional_drum_test_OBJECTS) $(ags_functional_drum_test_LDADD) $(LIBS)
+ags/test/X/ags_functional_editor_workflow_test-ags_functional_editor_workflow_test.$(OBJEXT):  \
+	ags/test/X/$(am__dirstamp) \
+	ags/test/X/$(DEPDIR)/$(am__dirstamp)
+
+ags_functional_editor_workflow_test$(EXEEXT): $(ags_functional_editor_workflow_test_OBJECTS) $(ags_functional_editor_workflow_test_DEPENDENCIES) $(EXTRA_ags_functional_editor_workflow_test_DEPENDENCIES) 
+	@rm -f ags_functional_editor_workflow_test$(EXEEXT)
+	$(AM_V_CCLD)$(ags_functional_editor_workflow_test_LINK) $(ags_functional_editor_workflow_test_OBJECTS) $(ags_functional_editor_workflow_test_LDADD) $(LIBS)
 ags/test/X/machine/ags_functional_ffplayer_test-ags_functional_ffplayer_test.$(OBJEXT):  \
 	ags/test/X/machine/$(am__dirstamp) \
 	ags/test/X/machine/$(DEPDIR)/$(am__dirstamp)
@@ -5029,6 +5075,13 @@ ags/test/X/machine/ags_functional_ffplayer_test-ags_functional_ffplayer_test.$(O
 ags_functional_ffplayer_test$(EXEEXT): $(ags_functional_ffplayer_test_OBJECTS) $(ags_functional_ffplayer_test_DEPENDENCIES) $(EXTRA_ags_functional_ffplayer_test_DEPENDENCIES) 
 	@rm -f ags_functional_ffplayer_test$(EXEEXT)
 	$(AM_V_CCLD)$(ags_functional_ffplayer_test_LINK) $(ags_functional_ffplayer_test_OBJECTS) $(ags_functional_ffplayer_test_LDADD) $(LIBS)
+ags/test/X/ags_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.$(OBJEXT):  \
+	ags/test/X/$(am__dirstamp) \
+	ags/test/X/$(DEPDIR)/$(am__dirstamp)
+
+ags_functional_line_member_add_and_destroy_test$(EXEEXT): $(ags_functional_line_member_add_and_destroy_test_OBJECTS) $(ags_functional_line_member_add_and_destroy_test_DEPENDENCIES) $(EXTRA_ags_functional_line_member_add_and_destroy_test_DEPENDENCIES) 
+	@rm -f ags_functional_line_member_add_and_destroy_test$(EXEEXT)
+	$(AM_V_CCLD)$(ags_functional_line_member_add_and_destroy_test_LINK) $(ags_functional_line_member_add_and_destroy_test_OBJECTS) $(ags_functional_line_member_add_and_destroy_test_LDADD) $(LIBS)
 ags/test/X/ags_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.$(OBJEXT):  \
 	ags/test/X/$(am__dirstamp) \
 	ags/test/X/$(DEPDIR)/$(am__dirstamp)
@@ -5036,6 +5089,13 @@ ags/test/X/ags_functional_machine_add_and_destroy_test-ags_functional_machine_ad
 ags_functional_machine_add_and_destroy_test$(EXEEXT): $(ags_functional_machine_add_and_destroy_test_OBJECTS) $(ags_functional_machine_add_and_destroy_test_DEPENDENCIES) $(EXTRA_ags_functional_machine_add_and_destroy_test_DEPENDENCIES) 
 	@rm -f ags_functional_machine_add_and_destroy_test$(EXEEXT)
 	$(AM_V_CCLD)$(ags_functional_machine_add_and_destroy_test_LINK) $(ags_functional_machine_add_and_destroy_test_OBJECTS) $(ags_functional_machine_add_and_destroy_test_LDADD) $(LIBS)
+ags/test/X/ags_functional_machine_link_test-ags_functional_machine_link_test.$(OBJEXT):  \
+	ags/test/X/$(am__dirstamp) \
+	ags/test/X/$(DEPDIR)/$(am__dirstamp)
+
+ags_functional_machine_link_test$(EXEEXT): $(ags_functional_machine_link_test_OBJECTS) $(ags_functional_machine_link_test_DEPENDENCIES) $(EXTRA_ags_functional_machine_link_test_DEPENDENCIES) 
+	@rm -f ags_functional_machine_link_test$(EXEEXT)
+	$(AM_V_CCLD)$(ags_functional_machine_link_test_LINK) $(ags_functional_machine_link_test_OBJECTS) $(ags_functional_machine_link_test_LDADD) $(LIBS)
 ags/test/X/machine/ags_functional_matrix_test-ags_functional_matrix_test.$(OBJEXT):  \
 	ags/test/X/machine/$(am__dirstamp) \
 	ags/test/X/machine/$(DEPDIR)/$(am__dirstamp)
@@ -5252,6 +5312,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_line_callbacks.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_pad.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_pad_callbacks.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_separator.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ags/X/$(DEPDIR)/libgsequencer_la-ags_export_soundcard.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ags/X/$(DEPDIR)/libgsequencer_la-ags_export_soundcard_callbacks.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ags/X/$(DEPDIR)/libgsequencer_la-ags_export_window.Plo at am__quote@
@@ -5583,6 +5644,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ags/audio/task/$(DEPDIR)/libags_audio_la-ags_cancel_channel.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ags/audio/task/$(DEPDIR)/libags_audio_la-ags_cancel_recall.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ags/audio/task/$(DEPDIR)/libags_audio_la-ags_change_soundcard.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_audio_signal.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_buffer.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ags/audio/task/$(DEPDIR)/libags_audio_la-ags_export_output.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ags/audio/task/$(DEPDIR)/libags_audio_la-ags_free_selection.Plo at am__quote@
@@ -5693,7 +5755,10 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ags/server/$(DEPDIR)/libags_server_la-ags_server.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ags/server/$(DEPDIR)/libags_server_la-ags_server_application_context.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ags/server/$(DEPDIR)/libags_server_la-ags_service_provider.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ags/test/X/$(DEPDIR)/ags_functional_editor_workflow_test-ags_functional_editor_workflow_test.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ags/test/X/$(DEPDIR)/ags_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ags/test/X/$(DEPDIR)/ags_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ags/test/X/$(DEPDIR)/ags_functional_machine_link_test-ags_functional_machine_link_test.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ags/test/X/$(DEPDIR)/ags_functional_note_edit_test-ags_functional_note_edit_test.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ags/test/X/$(DEPDIR)/ags_xorg_application_context_test-ags_xorg_application_context_test.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ags/test/X/$(DEPDIR)/libgsequencer_test_la-ags_functional_test_util.Plo at am__quote@
@@ -6751,6 +6816,13 @@ ags/audio/task/libags_audio_la-ags_change_soundcard.lo: ags/audio/task/ags_chang
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_change_soundcard.lo `test -f 'ags/audio/task/ags_change_soundcard.c' || echo '$(srcdir)/'`ags/audio/task/ags_change_soundcard.c
 
+ags/audio/task/libags_audio_la-ags_clear_audio_signal.lo: ags/audio/task/ags_clear_audio_signal.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_clear_audio_signal.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_audio_signal.Tpo -c -o ags/audio/task/libags_audio_la-ags_clear_audio_signal.lo `test -f 'ags/audio/task/ags_clear_audio_signal.c' || echo '$(srcdir)/'`ags/audio/task/ags_clear_audio_signal.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_audio_signal.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_audio_signal.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/audio/task/ags_clear_audio_signal.c' object='ags/audio/task/libags_audio_la-ags_clear_audio_signal.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -c -o ags/audio/task/libags_audio_la-ags_clear_audio_signal.lo `test -f 'ags/audio/task/ags_clear_audio_signal.c' || echo '$(srcdir)/'`ags/audio/task/ags_clear_audio_signal.c
+
 ags/audio/task/libags_audio_la-ags_clear_buffer.lo: ags/audio/task/ags_clear_buffer.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libags_audio_la_CFLAGS) $(CFLAGS) -MT ags/audio/task/libags_audio_la-ags_clear_buffer.lo -MD -MP -MF ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_buffer.Tpo -c -o ags/audio/task/libags_audio_la-ags_clear_buffer.lo `test -f 'ags/audio/task/ags_clear_buffer.c' || echo '$(srcdir)/'`ags/audio/task/ags_clear_buffer.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_buffer.Tpo ags/audio/task/$(DEPDIR)/libags_audio_la-ags_clear_buffer.Plo
@@ -8081,6 +8153,13 @@ ags/X/libgsequencer_la-ags_effect_pad_callbacks.lo: ags/X/ags_effect_pad_callbac
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_effect_pad_callbacks.lo `test -f 'ags/X/ags_effect_pad_callbacks.c' || echo '$(srcdir)/'`ags/X/ags_effect_pad_callbacks.c
 
+ags/X/libgsequencer_la-ags_effect_separator.lo: ags/X/ags_effect_separator.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_effect_separator.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_separator.Tpo -c -o ags/X/libgsequencer_la-ags_effect_separator.lo `test -f 'ags/X/ags_effect_separator.c' || echo '$(srcdir)/'`ags/X/ags_effect_separator.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_separator.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_effect_separator.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/X/ags_effect_separator.c' object='ags/X/libgsequencer_la-ags_effect_separator.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -c -o ags/X/libgsequencer_la-ags_effect_separator.lo `test -f 'ags/X/ags_effect_separator.c' || echo '$(srcdir)/'`ags/X/ags_effect_separator.c
+
 ags/X/libgsequencer_la-ags_export_soundcard.lo: ags/X/ags_export_soundcard.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_la_CFLAGS) $(CFLAGS) -MT ags/X/libgsequencer_la-ags_export_soundcard.lo -MD -MP -MF ags/X/$(DEPDIR)/libgsequencer_la-ags_export_soundcard.Tpo -c -o ags/X/libgsequencer_la-ags_export_soundcard.lo `test -f 'ags/X/ags_export_soundcard.c' || echo '$(srcdir)/'`ags/X/ags_export_soundcard.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/X/$(DEPDIR)/libgsequencer_la-ags_export_soundcard.Tpo ags/X/$(DEPDIR)/libgsequencer_la-ags_export_soundcard.Plo
@@ -9446,6 +9525,20 @@ ags/test/X/machine/ags_functional_drum_test-ags_functional_drum_test.obj: ags/te
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_drum_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_drum_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/ags_functional_drum_test-ags_functional_drum_test.obj `if test -f 'ags/test/X/machine/ags_functional_drum_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_drum_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_drum_test.c'; fi`
 
+ags/test/X/ags_functional_editor_workflow_test-ags_functional_editor_workflow_test.o: ags/test/X/ags_functional_editor_workflow_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_editor_workflow_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_editor_workflow_test_CFLAGS) $(CFLAGS) -MT ags/test/X/ags_functional_editor_workflow_test-ags_functional_editor_workflow_test.o -MD -MP -MF ags/test/X/$(DEPDIR)/ags_functional_editor_workflow_test-ags_functional_editor_workflow_test.Tpo -c -o ags/test/X/ags_functional_editor_workflow_test-ags_functional_editor_workflow_test.o `test -f 'ags/test/X/ags_functional_editor_workflow_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_editor_workflow_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/ags_functional_editor_workflow_test-ags_functional_editor_workflow_test.Tpo ags/test/X/$(DEPDIR)/ags_functional_editor_workflow_test-ags_functional_editor_workflow_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/ags_functional_editor_workflow_test.c' object='ags/test/X/ags_functional_editor_workflow_test-ags_functional_editor_workflow_test.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_editor_workflow_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_editor_workflow_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/ags_functional_editor_workflow_test-ags_functional_editor_workflow_test.o `test -f 'ags/test/X/ags_functional_editor_workflow_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_editor_workflow_test.c
+
+ags/test/X/ags_functional_editor_workflow_test-ags_functional_editor_workflow_test.obj: ags/test/X/ags_functional_editor_workflow_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_editor_workflow_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_editor_workflow_test_CFLAGS) $(CFLAGS) -MT ags/test/X/ags_functional_editor_workflow_test-ags_functional_editor_workflow_test.obj -MD -MP -MF ags/test/X/$(DEPDIR)/ags_functional_editor_workflow_test-ags_functional_editor_workflow_test.Tpo -c -o ags/test/X/ags_functional_editor_workflow_test-ags_functional_editor_workflow_test.obj `if test -f 'ags/test/X/ags_functional_editor_workflow_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_editor_workflow_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_editor_workflow_test.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/ags_functional_editor_workflow_test-ags_functional_editor_workflow_test.Tpo ags/test/X/$(DEPDIR)/ags_functional_editor_workflow_test-ags_functional_editor_workflow_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/ags_functional_editor_workflow_test.c' object='ags/test/X/ags_functional_editor_workflow_test-ags_functional_editor_workflow_test.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_editor_workflow_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_editor_workflow_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/ags_functional_editor_workflow_test-ags_functional_editor_workflow_test.obj `if test -f 'ags/test/X/ags_functional_editor_workflow_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_editor_workflow_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_editor_workflow_test.c'; fi`
+
 ags/test/X/machine/ags_functional_ffplayer_test-ags_functional_ffplayer_test.o: ags/test/X/machine/ags_functional_ffplayer_test.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_ffplayer_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_ffplayer_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/ags_functional_ffplayer_test-ags_functional_ffplayer_test.o -MD -MP -MF ags/test/X/machine/$(DEPDIR)/ags_functional_ffplayer_test-ags_functional_ffplayer_test.Tpo -c -o ags/test/X/machine/ags_functional_ffplayer_test-ags_functional_ffplayer_test.o `test -f 'ags/test/X/machine/ags_functional_ffplayer_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_ffplayer_test.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/ags_functional_ffplayer_test-ags_functional_ffplayer_test.Tpo ags/test/X/machine/$(DEPDIR)/ags_functional_ffplayer_test-ags_functional_ffplayer_test.Po
@@ -9460,6 +9553,20 @@ ags/test/X/machine/ags_functional_ffplayer_test-ags_functional_ffplayer_test.obj
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_ffplayer_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_ffplayer_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/ags_functional_ffplayer_test-ags_functional_ffplayer_test.obj `if test -f 'ags/test/X/machine/ags_functional_ffplayer_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_ffplayer_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_ffplayer_test.c'; fi`
 
+ags/test/X/ags_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.o: ags/test/X/ags_functional_line_member_add_and_destroy_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_line_member_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_line_member_add_and_destroy_test_CFLAGS) $(CFLAGS) -MT ags/test/X/ags_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.o -MD -MP -MF ags/test/X/$(DEPDIR)/ags_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Tpo -c -o ags/test/X/ags_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.o `test -f 'ags/test/X/ags_functional_line_member_add_and_destroy_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_line_member_add_and_destroy_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/ags_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Tpo ags/test/X/$(DEPDIR)/ags_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/ags_functional_line_member_add_and_destroy_test.c' object='ags/test/X/ags_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_line_member_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_line_member_add_and_destroy_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/ags_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.o `test -f 'ags/test/X/ags_functional_line_member_add_and_destroy_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_line_member_add_and_destroy_test.c
+
+ags/test/X/ags_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.obj: ags/test/X/ags_functional_line_member_add_and_destroy_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_line_member_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_line_member_add_and_destroy_test_CFLAGS) $(CFLAGS) -MT ags/test/X/ags_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.obj -MD -MP -MF ags/test/X/$(DEPDIR)/ags_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Tpo -c -o ags/test/X/ags_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.obj `if test -f 'ags/test/X/ags_functional_line_member_add_and_destroy_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_line_member_add_and_destroy_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_line_member_add_and_destroy_test.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/ags_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Tpo ags/test/X/$(DEPDIR)/ags_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/ags_functional_line_member_add_and_destroy_test.c' object='ags/test/X/ags_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_line_member_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_line_member_add_and_destroy_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/ags_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.obj `if test -f 'ags/test/X/ags_functional_line_member_add_and_destroy_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_line_member_add_and_destroy_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_line_member_add_and_destroy_test.c'; fi`
+
 ags/test/X/ags_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.o: ags/test/X/ags_functional_machine_add_and_destroy_test.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_machine_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_machine_add_and_destroy_test_CFLAGS) $(CFLAGS) -MT ags/test/X/ags_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.o -MD -MP -MF ags/test/X/$(DEPDIR)/ags_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.Tpo -c -o ags/test/X/ags_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.o `test -f 'ags/test/X/ags_functional_machine_add_and_destroy_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_machine_add_and_destroy_test.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/ags_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.Tpo ags/test/X/$(DEPDIR)/ags_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.Po
@@ -9474,6 +9581,20 @@ ags/test/X/ags_functional_machine_add_and_destroy_test-ags_functional_machine_ad
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_machine_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_machine_add_and_destroy_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/ags_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.obj `if test -f 'ags/test/X/ags_functional_machine_add_and_destroy_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_machine_add_and_destroy_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_machine_add_and_destroy_test.c'; fi`
 
+ags/test/X/ags_functional_machine_link_test-ags_functional_machine_link_test.o: ags/test/X/ags_functional_machine_link_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_machine_link_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_machine_link_test_CFLAGS) $(CFLAGS) -MT ags/test/X/ags_functional_machine_link_test-ags_functional_machine_link_test.o -MD -MP -MF ags/test/X/$(DEPDIR)/ags_functional_machine_link_test-ags_functional_machine_link_test.Tpo -c -o ags/test/X/ags_functional_machine_link_test-ags_functional_machine_link_test.o `test -f 'ags/test/X/ags_functional_machine_link_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_machine_link_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/ags_functional_machine_link_test-ags_functional_machine_link_test.Tpo ags/test/X/$(DEPDIR)/ags_functional_machine_link_test-ags_functional_machine_link_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/ags_functional_machine_link_test.c' object='ags/test/X/ags_functional_machine_link_test-ags_functional_machine_link_test.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_machine_link_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_machine_link_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/ags_functional_machine_link_test-ags_functional_machine_link_test.o `test -f 'ags/test/X/ags_functional_machine_link_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_machine_link_test.c
+
+ags/test/X/ags_functional_machine_link_test-ags_functional_machine_link_test.obj: ags/test/X/ags_functional_machine_link_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_machine_link_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_machine_link_test_CFLAGS) $(CFLAGS) -MT ags/test/X/ags_functional_machine_link_test-ags_functional_machine_link_test.obj -MD -MP -MF ags/test/X/$(DEPDIR)/ags_functional_machine_link_test-ags_functional_machine_link_test.Tpo -c -o ags/test/X/ags_functional_machine_link_test-ags_functional_machine_link_test.obj `if test -f 'ags/test/X/ags_functional_machine_link_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_machine_link_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_machine_link_test.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/ags_functional_machine_link_test-ags_functional_machine_link_test.Tpo ags/test/X/$(DEPDIR)/ags_functional_machine_link_test-ags_functional_machine_link_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/ags_functional_machine_link_test.c' object='ags/test/X/ags_functional_machine_link_test-ags_functional_machine_link_test.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_machine_link_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_machine_link_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/ags_functional_machine_link_test-ags_functional_machine_link_test.obj `if test -f 'ags/test/X/ags_functional_machine_link_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_machine_link_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_machine_link_test.c'; fi`
+
 ags/test/X/machine/ags_functional_matrix_test-ags_functional_matrix_test.o: ags/test/X/machine/ags_functional_matrix_test.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_functional_matrix_test_CPPFLAGS) $(CPPFLAGS) $(ags_functional_matrix_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/ags_functional_matrix_test-ags_functional_matrix_test.o -MD -MP -MF ags/test/X/machine/$(DEPDIR)/ags_functional_matrix_test-ags_functional_matrix_test.Tpo -c -o ags/test/X/machine/ags_functional_matrix_test-ags_functional_matrix_test.o `test -f 'ags/test/X/machine/ags_functional_matrix_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_matrix_test.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/ags_functional_matrix_test-ags_functional_matrix_test.Tpo ags/test/X/machine/$(DEPDIR)/ags_functional_matrix_test-ags_functional_matrix_test.Po
@@ -10037,7 +10158,7 @@ check-TESTS:
 	log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
 	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
 	exit $$?;
-recheck: all $(check_PROGRAMS)
+recheck: all $(check_LTLIBRARIES) $(check_PROGRAMS)
 	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
 	@set +e; $(am__set_TESTS_bases); \
 	bases=`for i in $$bases; do echo $$i; done \
@@ -10160,6 +10281,27 @@ ags_functional_machine_add_and_destroy_test.log: ags_functional_machine_add_and_
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ags_functional_machine_link_test.log: ags_functional_machine_link_test$(EXEEXT)
+	@p='ags_functional_machine_link_test$(EXEEXT)'; \
+	b='ags_functional_machine_link_test'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ags_functional_line_member_add_and_destroy_test.log: ags_functional_line_member_add_and_destroy_test$(EXEEXT)
+	@p='ags_functional_line_member_add_and_destroy_test$(EXEEXT)'; \
+	b='ags_functional_line_member_add_and_destroy_test'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ags_functional_editor_workflow_test.log: ags_functional_editor_workflow_test$(EXEEXT)
+	@p='ags_functional_editor_workflow_test$(EXEEXT)'; \
+	b='ags_functional_editor_workflow_test'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
 ags_functional_panel_test.log: ags_functional_panel_test$(EXEEXT)
 	@p='ags_functional_panel_test$(EXEEXT)'; \
 	b='ags_functional_panel_test'; \
@@ -10388,7 +10530,7 @@ distcleancheck: distclean
 	       $(distcleancheck_listfiles) ; \
 	       exit 1; } >&2
 check-am: all-am
-	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) $(check_LTLIBRARIES) $(check_PROGRAMS)
 	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
 check: check-am
 all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(MANS) $(DATA) $(HEADERS)
@@ -10502,9 +10644,9 @@ ags-docs-am: ags-docs-local
 
 clean: clean-am
 
-clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
-	clean-libLTLIBRARIES clean-libgsequencerLTLIBRARIES \
-	clean-libtool clean-local clean-noinstLTLIBRARIES \
+clean-am: clean-binPROGRAMS clean-checkLTLIBRARIES clean-checkPROGRAMS \
+	clean-generic clean-libLTLIBRARIES \
+	clean-libgsequencerLTLIBRARIES clean-libtool clean-local \
 	mostlyclean-am
 
 distclean: distclean-am
@@ -10584,10 +10726,10 @@ uninstall-man: uninstall-man1
 
 .PHONY: CTAGS GTAGS TAGS ags-docs-am ags-docs-local all all-am \
 	am--refresh check check-TESTS check-am clean clean-binPROGRAMS \
-	clean-checkPROGRAMS clean-cscope clean-generic \
-	clean-libLTLIBRARIES clean-libgsequencerLTLIBRARIES \
-	clean-libtool clean-local clean-noinstLTLIBRARIES cscope \
-	cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
+	clean-checkLTLIBRARIES clean-checkPROGRAMS clean-cscope \
+	clean-generic clean-libLTLIBRARIES \
+	clean-libgsequencerLTLIBRARIES clean-libtool clean-local \
+	cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
 	dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \
 	distcheck distclean distclean-compile distclean-generic \
 	distclean-hdr distclean-libtool distclean-tags distcleancheck \
@@ -10613,6 +10755,9 @@ uninstall-man: uninstall-man1
 .PRECIOUS: Makefile
 
 
+ags-integration-test: 
+	$(MAKE) -C $(top_srcdir) -f functional-system-tests.mk ags-check-system
+
 ags-docs-local:
 	$(MAKE) -C $(top_srcdir)/docs/reference/libags
 	cd $(top_srcdir)
@@ -10717,6 +10862,7 @@ clean-local:
 	rm -f $(top_builddir)/docs/reference/libags-audio/Makefile
 	rm -f $(top_builddir)/docs/reference/libags-gui/Makefile
 	rm -f $(top_builddir)/docs/reference/libgsequencer/Makefile
+	rm -f $(top_builddir)/functional-system-tests.mk
 
 gen-symbols-ags:
 	rm -f libags.sym
diff --git a/ags/X/ags_editor.c b/ags/X/ags_editor.c
index 9f78b31..1a22fee 100644
--- a/ags/X/ags_editor.c
+++ b/ags/X/ags_editor.c
@@ -205,7 +205,8 @@ ags_editor_init(AgsEditor *editor)
 		     (GtkWidget *) editor->toolbar,
 		     FALSE, FALSE, 0);
 
-  paned = (GtkHPaned *) gtk_hpaned_new();
+  editor->paned = 
+    paned = (GtkHPaned *) gtk_hpaned_new();
   gtk_box_pack_start((GtkBox *) editor,
 		     (GtkWidget *) paned,
 		     TRUE, TRUE, 0);
diff --git a/ags/X/ags_editor.h b/ags/X/ags_editor.h
index 4a21878..c3a858a 100644
--- a/ags/X/ags_editor.h
+++ b/ags/X/ags_editor.h
@@ -67,7 +67,9 @@ struct _AgsEditor
   gchar *build_id;
 
   GObject *soundcard;
-
+  
+  GtkHPaned *paned;
+  
   AgsMachineSelector *machine_selector;
   AgsMachine *selected_machine;
 
diff --git a/ags/X/ags_effect_line.c b/ags/X/ags_effect_line.c
index e52eb76..2ffd9be 100644
--- a/ags/X/ags_effect_line.c
+++ b/ags/X/ags_effect_line.c
@@ -54,7 +54,9 @@
 
 #include <ags/X/ags_window.h>
 #include <ags/X/ags_machine.h>
+#include <ags/X/ags_effect_pad.h>
 #include <ags/X/ags_line_member.h>
+#include <ags/X/ags_effect_separator.h>
 
 #include <ags/X/task/ags_add_line_member.h>
 
@@ -583,7 +585,7 @@ ags_effect_line_add_ladspa_effect(AgsEffectLine *effect_line,
 				  gchar *effect)
 {
   AgsLineMember *line_member;
-  GtkSeparator *separator;
+  AgsEffectSeparator *separator;
   GtkAdjustment *adjustment;
   
   AgsAddLineMember *add_line_member;
@@ -711,22 +713,20 @@ ags_effect_line_add_ladspa_effect(AgsEffectLine *effect_line,
   pthread_mutex_unlock(channel_mutex);
 
   /* add separator */
-  separator = gtk_hseparator_new();
-  gtk_widget_set_size_request(separator,
-			      120, -1);
-  g_object_set_data(separator,
-		    AGS_EFFECT_LINE_SEPARATOR_FILENAME,
-		    filename);
-  g_object_set_data(separator,
-		    AGS_EFFECT_LINE_SEPARATOR_EFFECT,
-		    effect);
+  separator = ags_effect_separator_new();
+  g_object_set(separator,
+	       "text\0", effect,
+	       "filename\0", filename,
+	       "effect\0", effect,
+	       NULL);
+  
   gtk_table_attach(effect_line->table,
 		   (GtkWidget *) separator,
 		   0, AGS_EFFECT_LINE_COLUMNS_COUNT,
 		   y, y + 1,
 		   GTK_FILL, GTK_FILL,
 		   0, 0);
-  gtk_widget_show(separator);
+  gtk_widget_show_all(separator);
 
   y++;
 
@@ -932,7 +932,7 @@ ags_effect_line_add_lv2_effect(AgsEffectLine *effect_line,
 			       gchar *effect)
 {
   AgsLineMember *line_member;
-  GtkSeparator *separator;
+  AgsEffectSeparator *separator;
   GtkAdjustment *adjustment;
 
   AgsAddLineMember *add_line_member;
@@ -1060,23 +1060,20 @@ ags_effect_line_add_lv2_effect(AgsEffectLine *effect_line,
   pthread_mutex_unlock(channel_mutex);
 
   /* add separator */
-  separator = gtk_hseparator_new();
-  gtk_widget_set_size_request(separator,
-			      120, -1);
-  g_object_set_data(separator,
-		    AGS_EFFECT_LINE_SEPARATOR_FILENAME,
-		    filename);
-  g_object_set_data(separator,
-		    AGS_EFFECT_LINE_SEPARATOR_EFFECT,
-		    effect);
+  separator = ags_effect_separator_new();
+  g_object_set(separator,
+	       "text\0", effect,
+	       "filename\0", filename,
+	       "effect\0", effect,
+	       NULL);
   gtk_table_attach(effect_line->table,
 		   (GtkWidget *) separator,
 		   0, AGS_EFFECT_LINE_COLUMNS_COUNT,
 		   y, y + 1,
 		   GTK_FILL, GTK_FILL,
 		   0, 0);
-  gtk_widget_show(separator);
-
+  gtk_widget_show_all(separator);
+  
   y++;
 
   /* load ports */
@@ -1412,27 +1409,37 @@ ags_effect_line_real_remove_effect(AgsEffectLine *effect_line,
     effect = AGS_RECALL_LADSPA(recall->data)->effect;
   }
 
+  /* destroy separator */
   control_start =
     control = gtk_container_get_children((GtkContainer *) effect_line->table);
 
   while(control != NULL){
-    if(GTK_IS_SEPARATOR(control->data) &&
-       !strcmp(filename,
-	       g_object_get_data(control->data,
-				 AGS_EFFECT_LINE_SEPARATOR_FILENAME)) &&
-       !strcmp(effect,
-	       g_object_get_data(control->data,
-				 AGS_EFFECT_LINE_SEPARATOR_EFFECT))){
-      gtk_widget_destroy(control->data);
+    gchar *separator_filename;
+    gchar *separator_effect;
+    
+    if(AGS_IS_EFFECT_SEPARATOR(control->data)){
+      g_object_get(control->data,
+		   "filename\0", &separator_filename,
+		   "effect\0", &separator_effect,
+		   NULL);
       
-      break;
+      if(separator_filename != NULL &&
+	 separator_effect != NULL &&
+	 !g_strcmp0(filename,
+		    separator_filename) &&
+	 !g_strcmp0(effect,
+		    separator_effect)){
+	gtk_widget_destroy(control->data);
+      
+	break;
+      }
     }
-
-    control->next;
+    
+    control = control->next;
   }
   
   g_list_free(control_start);
-  
+    
   /* destroy controls */
   port = AGS_RECALL(recall->data)->port;
   remove_specifier = NULL;
diff --git a/ags/X/ags_effect_separator.c b/ags/X/ags_effect_separator.c
new file mode 100644
index 0000000..53caa43
--- /dev/null
+++ b/ags/X/ags_effect_separator.c
@@ -0,0 +1,290 @@
+/* GSequencer - Advanced GTK Sequencer
+ * Copyright (C) 2005-2017 Joël Krähemann
+ *
+ * This file is part of GSequencer.
+ *
+ * GSequencer is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GSequencer is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GSequencer.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <ags/X/ags_effect_separator.h>
+
+#include <ags/object/ags_connectable.h>
+
+void ags_effect_separator_class_init(AgsEffectSeparatorClass *effect_separator);
+void ags_effect_separator_init(AgsEffectSeparator *effect_separator);
+void ags_effect_separator_connectable_interface_init(AgsConnectableInterface *connectable);
+void ags_effect_separator_set_property(GObject *gobject,
+				       guint prop_id,
+				       const GValue *value,
+				       GParamSpec *param_spec);
+void ags_effect_separator_get_property(GObject *gobject,
+				       guint prop_id,
+				       GValue *value,
+				       GParamSpec *param_spec);
+
+/**
+ * SECTION:ags_effect_separator
+ * @short_description: A effect separator widget
+ * @title: AgsEffectSeparator
+ * @section_id:
+ * @include: ags/widget/ags_effect_separator.h
+ *
+ * #AgsEffectSeparator is a widget representing an separator of effects.
+ */
+
+enum{
+  PROP_0,
+  PROP_FILENAME,
+  PROP_EFFECT,
+  PROP_TEXT,
+};
+
+static gpointer ags_effect_separator_parent_class = NULL;
+
+GType
+ags_effect_separator_get_type(void)
+{
+  static GType ags_type_effect_separator = 0;
+
+  if(!ags_type_effect_separator){
+    static const GTypeInfo ags_effect_separator_info = {
+      sizeof(AgsEffectSeparatorClass),
+      NULL, /* base_init */
+      NULL, /* base_finalize */
+      (GClassInitFunc) ags_effect_separator_class_init,
+      NULL, /* class_finalize */
+      NULL, /* class_data */
+      sizeof(AgsEffectSeparator),
+      0,    /* n_preallocs */
+      (GInstanceInitFunc) ags_effect_separator_init,
+    };
+
+    static const GInterfaceInfo ags_connectable_interface_info = {
+      (GInterfaceInitFunc) ags_effect_separator_connectable_interface_init,
+      NULL, /* interface_finalize */
+      NULL, /* interface_data */
+    };
+
+    ags_type_effect_separator = g_type_register_static(GTK_TYPE_HBOX,
+						       "AgsEffectSeparator\0", &ags_effect_separator_info,
+						       0);
+
+    g_type_add_interface_static(ags_type_effect_separator,
+				AGS_TYPE_CONNECTABLE,
+				&ags_connectable_interface_info);
+  }
+
+  return(ags_type_effect_separator);
+}
+
+void
+ags_effect_separator_class_init(AgsEffectSeparatorClass *effect_separator)
+{
+  GObjectClass *gobject;
+  GParamSpec *param_spec;
+
+  ags_effect_separator_parent_class = g_type_class_peek_parent(effect_separator);
+
+  /* GObjectClass */
+  gobject = (GObjectClass *) effect_separator;
+
+  gobject->set_property = ags_effect_separator_set_property;
+  gobject->get_property = ags_effect_separator_get_property;
+
+  /* properties */
+  /**
+   * AgsEffectSeparator:filename:
+   *
+   * The filename.
+   * 
+   * Since: 0.7.122.19
+   */
+  param_spec = g_param_spec_string("filename\0",
+				   "filename\0",
+				   "The filename\0",
+				   NULL,
+				   G_PARAM_READABLE | G_PARAM_WRITABLE);
+  g_object_class_install_property(gobject,
+				  PROP_FILENAME,
+				  param_spec);
+
+  /**
+   * AgsEffectSeparator:effect:
+   *
+   * The effect.
+   * 
+   * Since: 0.7.122.19
+   */
+  param_spec = g_param_spec_string("effect\0",
+				   "effect\0",
+				   "The effect\0",
+				   NULL,
+				   G_PARAM_READABLE | G_PARAM_WRITABLE);
+  g_object_class_install_property(gobject,
+				  PROP_EFFECT,
+				  param_spec);
+
+  /**
+   * AgsEffectSeparator:text:
+   *
+   * The text.
+   * 
+   * Since: 0.7.122.19
+   */
+  param_spec = g_param_spec_string("text\0",
+				   "text\0",
+				   "The text\0",
+				   NULL,
+				   G_PARAM_READABLE | G_PARAM_WRITABLE);
+  g_object_class_install_property(gobject,
+				  PROP_TEXT,
+				  param_spec);
+
+}
+
+void
+ags_effect_separator_connectable_interface_init(AgsConnectableInterface *connectable)
+{
+  connectable->connect = NULL;
+  connectable->disconnect = NULL;
+}
+
+void
+ags_effect_separator_init(AgsEffectSeparator *effect_separator)
+{
+  GtkSeparator *separator;
+  
+  effect_separator->filename = NULL;
+  effect_separator->effect = NULL;
+
+  /* heading separator */
+  separator = gtk_hseparator_new();
+  gtk_box_pack_start(effect_separator,
+		     separator,
+		     TRUE, TRUE,
+		     0);
+
+  /* label */
+  effect_separator->label = gtk_label_new(NULL);
+  gtk_box_pack_start(effect_separator,
+		     effect_separator->label,
+		     FALSE, FALSE,
+		     0);
+
+  /* trailing separator */
+  separator = gtk_hseparator_new();
+  gtk_box_pack_start(effect_separator,
+		     separator,
+		     TRUE, TRUE,
+		     0);
+}
+
+void
+ags_effect_separator_set_property(GObject *gobject,
+				  guint prop_id,
+				  const GValue *value,
+				  GParamSpec *param_spec)
+{
+  AgsEffectSeparator *effect_separator;
+
+  effect_separator = AGS_EFFECT_SEPARATOR(gobject);
+
+  switch(prop_id){
+  case PROP_FILENAME:
+    {
+      gchar *filename;
+      
+      filename = g_value_get_string(value);
+
+      effect_separator->filename = g_strdup(filename);
+    }
+    break;
+  case PROP_EFFECT:
+    {
+      gchar *effect;
+      
+      effect = g_value_get_string(value);
+
+      effect_separator->effect = g_strdup(effect);
+    }
+    break;
+  case PROP_TEXT:
+    {
+      gchar *text;
+      
+      text = g_value_get_string(value);
+
+      gtk_label_set_text(effect_separator->label,
+			 text);
+    }
+    break;
+  default:
+    G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec);
+    break;
+  }
+}
+
+void
+ags_effect_separator_get_property(GObject *gobject,
+				  guint prop_id,
+				  GValue *value,
+				  GParamSpec *param_spec)
+{
+  AgsEffectSeparator *effect_separator;
+
+  effect_separator = AGS_EFFECT_SEPARATOR(gobject);
+
+  switch(prop_id){
+  case PROP_FILENAME:
+    {
+      g_value_set_string(value, effect_separator->filename);
+    }
+    break;
+  case PROP_EFFECT:
+    {
+      g_value_set_string(value, effect_separator->effect);
+    }
+    break;
+  case PROP_TEXT:
+    {
+      g_value_set_string(value,
+			 gtk_label_get_text(effect_separator->label));
+    }
+    break;
+  default:
+    G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec);
+    break;
+  }
+}
+
+/**
+ * ags_effect_separator_new:
+ *
+ * Creates an #AgsEffectSeparator. Note, use rather its implementation #AgsVEffectSeparator or
+ * #AgsHEffectSeparator.
+ *
+ * Returns: a new #AgsEffectSeparator
+ *
+ * Since: 0.7.122.19
+ */
+AgsEffectSeparator*
+ags_effect_separator_new()
+{
+  AgsEffectSeparator *effect_separator;
+
+  effect_separator = (AgsEffectSeparator *) g_object_new(AGS_TYPE_EFFECT_SEPARATOR,
+							 NULL);
+  
+  return(effect_separator);
+}
diff --git a/ags/X/ags_effect_separator.h b/ags/X/ags_effect_separator.h
new file mode 100644
index 0000000..45da8f4
--- /dev/null
+++ b/ags/X/ags_effect_separator.h
@@ -0,0 +1,57 @@
+/* GSequencer - Advanced GTK Sequencer
+ * Copyright (C) 2005-2017 Joël Krähemann
+ *
+ * This file is part of GSequencer.
+ *
+ * GSequencer is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GSequencer is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GSequencer.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __AGS_EFFECT_SEPARATOR_H__
+#define __AGS_EFFECT_SEPARATOR_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <gtk/gtk.h>
+
+#define AGS_TYPE_EFFECT_SEPARATOR                (ags_effect_separator_get_type())
+#define AGS_EFFECT_SEPARATOR(obj)                (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_EFFECT_SEPARATOR, AgsEffectSeparator))
+#define AGS_EFFECT_SEPARATOR_CLASS(class)        (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_EFFECT_SEPARATOR, AgsEffectSeparatorClass))
+#define AGS_IS_EFFECT_SEPARATOR(obj)             (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AGS_TYPE_EFFECT_SEPARATOR))
+#define AGS_IS_EFFECT_SEPARATOR_CLASS(class)     (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_EFFECT_SEPARATOR))
+#define AGS_EFFECT_SEPARATOR_GET_CLASS(obj)      (G_TYPE_INSTANCE_GET_CLASS ((obj), AGS_TYPE_EFFECT_SEPARATOR, AgsEffectSeparatorClass))
+
+typedef struct _AgsEffectSeparator AgsEffectSeparator;
+typedef struct _AgsEffectSeparatorClass AgsEffectSeparatorClass;
+
+struct _AgsEffectSeparator
+{
+  GtkHBox hbox;
+
+  gchar *filename;
+  gchar *effect;
+
+  GtkLabel *label;
+};
+
+struct _AgsEffectSeparatorClass
+{
+  GtkHBoxClass hbox;
+};
+
+GType ags_effect_separator_get_type(void);
+
+AgsEffectSeparator* ags_effect_separator_new();
+
+#endif /*__AGS_EFFECT_SEPARATOR_H__*/
diff --git a/ags/X/ags_ladspa_browser.c b/ags/X/ags_ladspa_browser.c
index 9ede857..f7cc9b9 100644
--- a/ags/X/ags_ladspa_browser.c
+++ b/ags/X/ags_ladspa_browser.c
@@ -156,7 +156,8 @@ ags_ladspa_browser_init(AgsLadspaBrowser *ladspa_browser)
 		     FALSE, FALSE,
 		     0);
 
-  combo_box = (GtkComboBoxText *) gtk_combo_box_text_new();
+  ladspa_browser->filename = 
+    combo_box = (GtkComboBoxText *) gtk_combo_box_text_new();
   gtk_box_pack_start(GTK_BOX(ladspa_browser->plugin),
 		     GTK_WIDGET(combo_box),
 		     FALSE, FALSE,
@@ -184,7 +185,8 @@ ags_ladspa_browser_init(AgsLadspaBrowser *ladspa_browser)
 		     FALSE, FALSE,
 		     0);
 
-  combo_box = (GtkComboBoxText *) gtk_combo_box_text_new();
+  ladspa_browser->effect = 
+    combo_box = (GtkComboBoxText *) gtk_combo_box_text_new();
   gtk_box_pack_start(GTK_BOX(ladspa_browser->plugin),
 		     GTK_WIDGET(combo_box),
 		     FALSE, FALSE,
diff --git a/ags/X/ags_ladspa_browser.h b/ags/X/ags_ladspa_browser.h
index 02d5374..35c4ce1 100644
--- a/ags/X/ags_ladspa_browser.h
+++ b/ags/X/ags_ladspa_browser.h
@@ -41,6 +41,10 @@ struct _AgsLadspaBrowser
   gchar *path;
 
   GtkHBox *plugin;
+  
+  GtkComboBox *filename;
+  GtkComboBox *effect;
+  
   GtkVBox *description;
 
   GtkWidget *preview;
diff --git a/ags/X/ags_line.c b/ags/X/ags_line.c
index 0f910a5..bc29ec1 100644
--- a/ags/X/ags_line.c
+++ b/ags/X/ags_line.c
@@ -58,6 +58,7 @@
 #include <ags/X/ags_machine.h>
 #include <ags/X/ags_pad.h>
 #include <ags/X/ags_line_member.h>
+#include <ags/X/ags_effect_separator.h>
 
 #include <ladspa.h>
 #include <dlfcn.h>
@@ -764,7 +765,7 @@ ags_line_add_ladspa_effect(AgsLine *line,
 			   gchar *effect)
 {
   AgsLineMember *line_member;
-  GtkSeparator *separator;
+  AgsEffectSeparator *separator;
   GtkAdjustment *adjustment;
 
   AgsRecallHandler *recall_handler;
@@ -804,20 +805,17 @@ ags_line_add_ladspa_effect(AgsLine *line,
   }
 
   /* add separator */
-  separator = gtk_hseparator_new();
-  gtk_widget_set_size_request(separator,
-			      120, -1);
-  g_object_set_data(separator,
-		    AGS_LINE_SEPARATOR_FILENAME,
-		    filename);
-  g_object_set_data(separator,
-		    AGS_LINE_SEPARATOR_EFFECT,
-		    effect);
+  separator = ags_effect_separator_new();
+  g_object_set(separator,
+	       "text\0", effect,
+	       "filename\0", filename,
+	       "effect\0", effect,
+	       NULL);
   ags_expander_add(line->expander,
-		   (GtkWidget *) separator,
-		   0, y,
-		   AGS_LINE_COLUMNS_COUNT, 1);
-  gtk_widget_show(separator);
+  		   (GtkWidget *) separator,
+  		   0, y,
+  		   AGS_LINE_COLUMNS_COUNT, 1);
+  gtk_widget_show_all(separator);
 
   y++;
   
@@ -1012,7 +1010,7 @@ ags_line_add_lv2_effect(AgsLine *line,
 			gchar *effect)
 {
   AgsLineMember *line_member;
-  GtkSeparator *separator;
+  AgsEffectSeparator *separator;
   GtkAdjustment *adjustment;
 
   AgsRecallHandler *recall_handler;
@@ -1060,21 +1058,18 @@ ags_line_add_lv2_effect(AgsLine *line,
   }
 
   /* add separator */
-  separator = gtk_hseparator_new();
-  gtk_widget_set_size_request(separator,
-			      120, -1);
-  g_object_set_data(separator,
-		    AGS_LINE_SEPARATOR_FILENAME,
-		    filename);
-  g_object_set_data(separator,
-		    AGS_LINE_SEPARATOR_EFFECT,
-		    effect);
+  separator = ags_effect_separator_new();
+  g_object_set(separator,
+	       "text\0", effect,
+	       "filename\0", filename,
+	       "effect\0", effect,
+	       NULL);
   ags_expander_add(line->expander,
-		   (GtkWidget *) separator,
-		   0, y,
-		   AGS_LINE_COLUMNS_COUNT, 1);
-  gtk_widget_show(separator);
-
+  		   (GtkWidget *) separator,
+  		   0, y,
+  		   AGS_LINE_COLUMNS_COUNT, 1);
+  gtk_widget_show_all(separator);
+  
   y++;
   
   /* load ports */
@@ -1364,11 +1359,11 @@ ags_line_real_remove_effect(AgsLine *line,
 						    AGS_TYPE_RECALL_LV2,
 						    G_TYPE_NONE)) != NULL){
     if((AGS_RECALL_TEMPLATE & (AGS_RECALL(recall->data)->flags)) != 0){
-      nth_effect++;
+      nth_effect += 1;
     }
 
     if((AGS_RECALL_BULK_MODE & (AGS_RECALL(recall->data)->flags)) != 0){
-      n_bulk++;
+      n_bulk += 1;
     }
 
     if(nth_effect - n_bulk == nth + 1){
@@ -1398,23 +1393,35 @@ ags_line_real_remove_effect(AgsLine *line,
     effect = AGS_RECALL_LADSPA(recall->data)->effect;
   }
   
+  pthread_mutex_unlock(channel_mutex);
+
+  /* destroy separator */
   control_start =
     control = gtk_container_get_children((GtkContainer *) line->expander->table);
 
   while(control != NULL){
-    if(GTK_IS_SEPARATOR(control->data) &&
-       !strcmp(filename,
-	       g_object_get_data(control->data,
-				 AGS_LINE_SEPARATOR_FILENAME)) &&
-       !strcmp(effect,
-	       g_object_get_data(control->data,
-				 AGS_LINE_SEPARATOR_EFFECT))){
-      gtk_widget_destroy(control->data);
+    gchar *separator_filename;
+    gchar *separator_effect;
+    
+    if(AGS_IS_EFFECT_SEPARATOR(control->data)){
+      g_object_get(control->data,
+		   "filename\0", &separator_filename,
+		   "effect\0", &separator_effect,
+		   NULL);
       
-      break;
+      if(separator_filename != NULL &&
+	 separator_effect != NULL &&
+	 !g_strcmp0(filename,
+		    separator_filename) &&
+	 !g_strcmp0(effect,
+		    separator_effect)){
+	gtk_widget_destroy(control->data);
+      
+	break;
+      }
     }
-
-    control->next;
+    
+    control = control->next;
   }
   
   g_list_free(control_start);
@@ -1467,8 +1474,6 @@ ags_line_real_remove_effect(AgsLine *line,
     port = port->next;
   }
 
-  pthread_mutex_unlock(channel_mutex);
-
   if(remove_specifier != NULL){
     remove_specifier[i] = NULL;
   }
diff --git a/ags/X/ags_line_callbacks.c b/ags/X/ags_line_callbacks.c
index 45e5172..1781792 100644
--- a/ags/X/ags_line_callbacks.c
+++ b/ags/X/ags_line_callbacks.c
@@ -177,8 +177,6 @@ ags_line_add_effect_callback(AgsChannel *channel,
   pthread_mutex_t *application_mutex;
 
   /* lock gdk threads */
-  gdk_threads_enter();
-
   window = (AgsWindow *) gtk_widget_get_toplevel((GtkWidget *) line);
 
   application_context = (AgsApplicationContext *) window->application_context;
@@ -198,7 +196,6 @@ ags_line_add_effect_callback(AgsChannel *channel,
 						      AGS_TYPE_GUI_THREAD);
 
   /*  */
-  gdk_threads_enter();
 
   /* get machine and machine editor */
   machine = (AgsMachine *) gtk_widget_get_ancestor((GtkWidget *) line,
@@ -339,11 +336,6 @@ ags_line_add_effect_callback(AgsChannel *channel,
   /* free lists */
   g_list_free(pad_editor_start);
   g_list_free(line_editor_start);
-
-  gdk_threads_leave();
-
-  /* unlock gdk threads */
-  gdk_threads_leave();
 }
 
 void
@@ -368,6 +360,8 @@ ags_line_remove_effect_callback(AgsChannel *channel,
 
   application_context = (AgsApplicationContext *) window->application_context;
 
+  gdk_threads_leave();
+
   mutex_manager = ags_mutex_manager_get_instance();
   application_mutex = ags_mutex_manager_get_application_mutex(mutex_manager);
 
@@ -383,14 +377,8 @@ ags_line_remove_effect_callback(AgsChannel *channel,
 						      AGS_TYPE_GUI_THREAD);
 
   /*  */
-  gdk_threads_enter();
-
   ags_line_remove_effect(line,
 			 nth);
-
-  gdk_threads_leave();
-
-  gdk_threads_leave();
 }
 
 void
diff --git a/ags/X/ags_line_member_editor_callbacks.c b/ags/X/ags_line_member_editor_callbacks.c
index e4fb3d6..5ee6a4d 100644
--- a/ags/X/ags_line_member_editor_callbacks.c
+++ b/ags/X/ags_line_member_editor_callbacks.c
@@ -290,7 +290,7 @@ ags_line_member_editor_remove_callback(GtkWidget *button,
   AgsMachineEditor *machine_editor;
   AgsLineEditor *line_editor;
 
-  GList *line_member;
+  GList *line_member, *line_member_next;
   GList *list, *list_start, *pad, *pad_start;
   GList *children;
   guint nth;
@@ -370,18 +370,19 @@ ags_line_member_editor_remove_callback(GtkWidget *button,
     /* iterate line member */
     if(line != NULL){
       for(nth = 0; line_member != NULL; nth++){
-
+	line_member_next = line_member->next;
+	
 	children = gtk_container_get_children((GtkContainer *) GTK_CONTAINER(line_member->data));
 
 	if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(children->data))){
 	  ags_line_member_editor_plugin_browser_response_destroy_entry();
-	
+
 	  /* remove effect */
 	  ags_line_remove_effect(line,
 				 nth);
 	}
       
-	line_member = line_member->next;
+	line_member = line_member_next;
       }
     }
   }else{
diff --git a/ags/X/ags_lv2_browser.c b/ags/X/ags_lv2_browser.c
index 849309e..fae16e3 100644
--- a/ags/X/ags_lv2_browser.c
+++ b/ags/X/ags_lv2_browser.c
@@ -155,7 +155,8 @@ ags_lv2_browser_init(AgsLv2Browser *lv2_browser)
 		     FALSE, FALSE,
 		     0);
 
-  combo_box = (GtkComboBoxText *) gtk_combo_box_text_new();
+  lv2_browser->filename = 
+    combo_box = (GtkComboBoxText *) gtk_combo_box_text_new();
   gtk_box_pack_start(GTK_BOX(lv2_browser->plugin),
 		     GTK_WIDGET(combo_box),
 		     FALSE, FALSE,
@@ -183,7 +184,8 @@ ags_lv2_browser_init(AgsLv2Browser *lv2_browser)
 		     FALSE, FALSE,
 		     0);
 
-  combo_box = (GtkComboBoxText *) gtk_combo_box_text_new();
+  lv2_browser->effect = 
+    combo_box = (GtkComboBoxText *) gtk_combo_box_text_new();
   gtk_box_pack_start(GTK_BOX(lv2_browser->plugin),
 		     GTK_WIDGET(combo_box),
 		     FALSE, FALSE,
diff --git a/ags/X/ags_lv2_browser.h b/ags/X/ags_lv2_browser.h
index d2f125c..b9c7f8a 100644
--- a/ags/X/ags_lv2_browser.h
+++ b/ags/X/ags_lv2_browser.h
@@ -41,6 +41,10 @@ struct _AgsLv2Browser
   gchar *path;
 
   GtkHBox *plugin;
+
+  GtkComboBox *filename;
+  GtkComboBox *effect;
+
   GtkVBox *description;
 
   GtkWidget *preview;
diff --git a/ags/X/ags_machine_callbacks.c b/ags/X/ags_machine_callbacks.c
index 9aef6cb..53d2449 100644
--- a/ags/X/ags_machine_callbacks.c
+++ b/ags/X/ags_machine_callbacks.c
@@ -393,9 +393,13 @@ ags_machine_popup_properties_activate_callback(GtkWidget *widget, AgsMachine *ma
   machine->properties = (GtkDialog *) ags_machine_editor_new(machine);
   g_signal_connect_after(machine->properties, "destroy\0",
 			 G_CALLBACK(ags_machine_popup_properties_destroy_callback), machine);
+
   gtk_window_set_default_size((GtkWindow *) machine->properties, -1, 400);
+  
   ags_connectable_connect(AGS_CONNECTABLE(machine->properties));
+
   ags_applicable_reset(AGS_APPLICABLE(machine->properties));
+
   gtk_widget_show_all((GtkWidget *) machine->properties);
 
   return(0);
diff --git a/ags/X/ags_navigation.c b/ags/X/ags_navigation.c
index 3801586..5d73deb 100644
--- a/ags/X/ags_navigation.c
+++ b/ags/X/ags_navigation.c
@@ -757,13 +757,9 @@ ags_navigation_duration_time_queue_draw(GtkWidget *widget)
 
   gchar *str;
   
-  gdk_threads_enter();
-
   navigation = AGS_NAVIGATION(widget);
 
   if(navigation->soundcard == NULL){
-    gdk_threads_leave();
-    
     return(TRUE);
   }
 
@@ -775,8 +771,6 @@ ags_navigation_duration_time_queue_draw(GtkWidget *widget)
   
   gtk_widget_queue_draw((GtkWidget *) navigation->duration_time);
 
-  gdk_threads_leave();
-
   return(TRUE);
 }
 
diff --git a/ags/X/ags_output_listing_editor.h b/ags/X/ags_output_listing_editor.h
index bfdbfd4..3050302 100644
--- a/ags/X/ags_output_listing_editor.h
+++ b/ags/X/ags_output_listing_editor.h
@@ -36,7 +36,7 @@
 #define AGS_IS_OUTPUT_LISTING_EDITOR_CLASS(class)     (G_TYPE_CHECK_CLASS_TYPE ((class), AGS_TYPE_OUTPUT_LISTING_EDITOR))
 #define AGS_OUTPUT_LISTING_EDITOR_GET_CLASS(obj)      (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_OUTPUT_LISTING_EDITOR, AgsOutputListingEditorClass))
 
-  typedef struct _AgsOutputListingEditor AgsOutputListingEditor;
+typedef struct _AgsOutputListingEditor AgsOutputListingEditor;
 typedef struct _AgsOutputListingEditorClass AgsOutputListingEditorClass;
 
 struct _AgsOutputListingEditor
diff --git a/ags/X/ags_plugin_browser_callbacks.c b/ags/X/ags_plugin_browser_callbacks.c
index b38c574..93b9015 100644
--- a/ags/X/ags_plugin_browser_callbacks.c
+++ b/ags/X/ags_plugin_browser_callbacks.c
@@ -40,6 +40,9 @@ void
 ags_plugin_browser_ok_callback(GtkWidget *button,
 			       AgsPluginBrowser *plugin_browser)
 {
+  gtk_combo_box_set_active(plugin_browser->plugin_type,
+			   -1);
+  
   gtk_widget_hide((GtkWidget *) plugin_browser);
 }
 
@@ -47,6 +50,9 @@ void
 ags_plugin_browser_cancel_callback(GtkWidget *button,
 				   AgsPluginBrowser *plugin_browser)
 {
+  gtk_combo_box_set_active(plugin_browser->plugin_type,
+			   -1);
+
   gtk_widget_hide((GtkWidget *) plugin_browser);
 }
 
diff --git a/ags/X/ags_xorg_application_context.c b/ags/X/ags_xorg_application_context.c
index b330051..65d4652 100644
--- a/ags/X/ags_xorg_application_context.c
+++ b/ags/X/ags_xorg_application_context.c
@@ -111,6 +111,10 @@
 #include <ags/audio/thread/ags_soundcard_thread.h>
 #include <ags/audio/thread/ags_sequencer_thread.h>
 
+#include <ags/X/ags_effect_pad.h>
+#include <ags/X/ags_effect_line.h>
+#include <ags/X/ags_effect_separator.h>
+
 #include <ags/X/file/ags_gui_file_xml.h>
 #include <ags/X/file/ags_simple_file.h>
 
@@ -783,6 +787,7 @@ ags_xorg_application_context_init(AgsXorgApplicationContext *xorg_application_co
   xorg_application_context->worker = NULL;
 
   /* AgsDestroyWorker */
+  /*
   destroy_worker = ags_destroy_worker_new();
   g_object_ref(destroy_worker);
   ags_thread_add_child_extended(AGS_THREAD(audio_loop),
@@ -791,7 +796,8 @@ ags_xorg_application_context_init(AgsXorgApplicationContext *xorg_application_co
   xorg_application_context->worker = g_list_prepend(xorg_application_context->worker,
 						    destroy_worker);
   ags_thread_start(destroy_worker);
-
+  */
+  
   /* AgsThreadPool */
   xorg_application_context->thread_pool = AGS_TASK_THREAD(AGS_APPLICATION_CONTEXT(xorg_application_context)->task_thread)->thread_pool;
 
@@ -1188,6 +1194,9 @@ ags_xorg_application_context_register_types(AgsApplicationContext *application_c
 {
   ags_gui_thread_get_type();
 
+  /* */
+  ags_connectable_get_type();
+  
   /*  */
   ags_lv2_manager_get_type();
   ags_lv2_urid_manager_get_type();
@@ -1280,6 +1289,7 @@ ags_xorg_application_context_register_types(AgsApplicationContext *application_c
   ags_effect_bulk_get_type();
   ags_effect_pad_get_type();
   ags_effect_line_get_type();
+  ags_effect_separator_get_type();
 
   ags_bulk_member_get_type();
   ags_line_member_get_type();  
diff --git a/ags/X/editor/ags_machine_selector.c b/ags/X/editor/ags_machine_selector.c
index 961fc08..b988169 100644
--- a/ags/X/editor/ags_machine_selector.c
+++ b/ags/X/editor/ags_machine_selector.c
@@ -156,6 +156,8 @@ ags_machine_selector_init(AgsMachineSelector *machine_selector)
 		     GTK_WIDGET(machine_selector->menu_button),
 		     FALSE, FALSE,
 		     0);
+
+  machine_selector->machine_selection = NULL;
 }
 
 void
diff --git a/ags/X/editor/ags_machine_selector.h b/ags/X/editor/ags_machine_selector.h
index 75492fd..d6f2252 100644
--- a/ags/X/editor/ags_machine_selector.h
+++ b/ags/X/editor/ags_machine_selector.h
@@ -57,6 +57,8 @@ struct _AgsMachineSelector
   GtkMenu *popup;
   
   GtkWidget *current;
+
+  GtkDialog *machine_selection;
 };
 
 struct _AgsMachineSelectorClass
diff --git a/ags/X/editor/ags_machine_selector_callbacks.c b/ags/X/editor/ags_machine_selector_callbacks.c
index 5a1c011..d15602e 100644
--- a/ags/X/editor/ags_machine_selector_callbacks.c
+++ b/ags/X/editor/ags_machine_selector_callbacks.c
@@ -99,7 +99,8 @@ ags_machine_selector_popup_link_index_callback(GtkWidget *menu_item, AgsMachineS
 
   window = list->data;
 
-  machine_selection = (AgsMachineSelection *) ags_machine_selection_new(window);
+  machine_selector->machine_selection =
+    machine_selection = (AgsMachineSelection *) ags_machine_selection_new(window);
 
   if((AGS_MACHINE_SELECTOR_NOTATION & (machine_selector->flags)) != 0){
     machine_selection->flags |= AGS_MACHINE_SELECTION_NOTATION;
@@ -153,6 +154,9 @@ ags_machine_selector_selection_response(GtkWidget *machine_selection,
 				    machine);
   }
 
+  /* unset machine selection and destroy */
+  machine_selector->machine_selection = NULL;
+
   gtk_widget_destroy(machine_selection);
 }
 
diff --git a/ags/X/machine/ags_synth.c b/ags/X/machine/ags_synth.c
index ed60bdb..0bd69c5 100644
--- a/ags/X/machine/ags_synth.c
+++ b/ags/X/machine/ags_synth.c
@@ -53,6 +53,7 @@
 #include <ags/audio/recall/ags_count_beats_audio_run.h>
 #include <ags/audio/recall/ags_play_notation_audio_run.h>
 
+#include <ags/audio/task/ags_clear_audio_signal.h>
 #include <ags/audio/task/ags_apply_synth.h>
 
 #include <ags/widget/ags_expander_set.h>
@@ -587,7 +588,8 @@ ags_synth_update(AgsSynth *synth)
   
   AgsAudio *audio;
   AgsChannel *channel;
-  
+
+  AgsClearAudioSignal *clear_audio_signal;
   AgsApplySynth *apply_synth;
 
   AgsMutexManager *mutex_manager;
@@ -598,7 +600,8 @@ ags_synth_update(AgsSynth *synth)
   
   GList *input_pad, *input_pad_start;
   GList *input_line, *input_line_start;
-
+  GList *task;
+  
   guint output_lines;
   guint wave;
   guint attack, frame_count;
@@ -698,7 +701,7 @@ ags_synth_update(AgsSynth *synth)
   
   g_list_free(input_pad_start);
 
-  /* write output */
+  /* clear output */
   input_pad_start = 
     input_pad = gtk_container_get_children((GtkContainer *) synth->input_pad);
 
@@ -708,7 +711,46 @@ ags_synth_update(AgsSynth *synth)
   output_lines = audio->output_lines;
 
   pthread_mutex_unlock(audio_mutex);
+
+  task = NULL;
+
+  while(channel != NULL){
+    AgsAudioSignal *template;
+    
+    /* lookup channel mutex */
+    pthread_mutex_lock(application_mutex);
+
+    channel_mutex = ags_mutex_manager_lookup(mutex_manager,
+					     (GObject *) channel);
+  
+    pthread_mutex_unlock(application_mutex);
+
+    /* clear task */
+    pthread_mutex_lock(channel_mutex);
+
+    template = ags_audio_signal_get_template(channel->first_recycling->audio_signal);
+
+    pthread_mutex_unlock(channel_mutex);
+
+    clear_audio_signal = ags_clear_audio_signal_new(template);
+    task = g_list_prepend(task,
+			  clear_audio_signal);
+    
+    /* iterate */
+    pthread_mutex_lock(channel_mutex);
+
+    channel = channel->next;
+
+    pthread_mutex_unlock(channel_mutex);
+  }
+  
+  /* write output */
+  pthread_mutex_lock(audio_mutex);
   
+  channel = audio->output;
+
+  pthread_mutex_unlock(audio_mutex);
+
   while(input_pad != NULL){
     /* do it so */
     input_line = gtk_container_get_children((GtkContainer *) AGS_PAD(input_pad->data)->expander_set);
@@ -727,16 +769,18 @@ ags_synth_update(AgsSynth *synth)
 				      frequency, phase, start_frequency,
 				      volume,
 				      loop_start, loop_end);
-
-    ags_task_thread_append_task(task_thread,
-				AGS_TASK(apply_synth));
+    task = g_list_prepend(task,
+			  apply_synth);
 
     input_pad = input_pad->next;
   }
   
   g_list_free(input_pad_start);
-
+  
   gdk_threads_leave();
+
+  ags_task_thread_append_tasks(task_thread,
+			       g_list_reverse(task));
 }
 
 /**
diff --git a/ags/audio/ags_recall_audio.c b/ags/audio/ags_recall_audio.c
index f7cc542..00a0bd4 100644
--- a/ags/audio/ags_recall_audio.c
+++ b/ags/audio/ags_recall_audio.c
@@ -478,7 +478,7 @@ ags_recall_audio_automate(AgsRecall *recall)
 			 &loop_left, &loop_right,
 			 &do_loop);
 
-  return_prev_on_failure = FALSE;
+  return_prev_on_failure = TRUE;
 
   if(do_loop &&
      loop_left <= note_offset){
diff --git a/ags/audio/ags_recall_channel.c b/ags/audio/ags_recall_channel.c
index 31d986e..d3814a2 100644
--- a/ags/audio/ags_recall_channel.c
+++ b/ags/audio/ags_recall_channel.c
@@ -576,7 +576,7 @@ ags_recall_channel_automate(AgsRecall *recall)
 			 &loop_left, &loop_right,
 			 &do_loop);
 
-  return_prev_on_failure = FALSE;
+  return_prev_on_failure = TRUE;
   
   if(do_loop &&
      loop_left <= note_offset){
diff --git a/ags/audio/task/ags_apply_synth.c b/ags/audio/task/ags_apply_synth.c
index e7f6eaa..b160d5a 100644
--- a/ags/audio/task/ags_apply_synth.c
+++ b/ags/audio/task/ags_apply_synth.c
@@ -621,23 +621,6 @@ ags_apply_synth_launch(AgsTask *task)
 
   factor = 1.0;
 
-  /* clear */
-  for(i = 0; channel != NULL && i < apply_synth->count; i++){
-    audio_signal = ags_audio_signal_get_template(channel->first_recycling->audio_signal);
-
-    /* clear the stream */
-    stream = audio_signal->stream_beginning;
-
-    while(stream != NULL){
-      ags_audio_buffer_util_clear_buffer(stream->data, 1,
-					 audio_signal->buffer_size, ags_audio_buffer_util_format_from_soundcard(audio_signal->format));
-      
-      stream = stream->next;
-    }
-
-    channel = channel->next;
-  }
-
   /* fill */
   channel = apply_synth->start_channel;
 
diff --git a/ags/audio/task/ags_clear_audio_signal.c b/ags/audio/task/ags_clear_audio_signal.c
new file mode 100644
index 0000000..c6d3457
--- /dev/null
+++ b/ags/audio/task/ags_clear_audio_signal.c
@@ -0,0 +1,283 @@
+/* GSequencer - Advanced GTK Sequencer
+ * Copyright (C) 2005-2015 Joël Krähemann
+ *
+ * This file is part of GSequencer.
+ *
+ * GSequencer is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GSequencer is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GSequencer.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <ags/audio/task/ags_clear_audio_signal.h>
+
+#include <ags/object/ags_connectable.h>
+
+#include <math.h>
+
+void ags_clear_audio_signal_class_init(AgsClearAudioSignalClass *clear_audio_signal);
+void ags_clear_audio_signal_connectable_interface_init(AgsConnectableInterface *connectable);
+void ags_clear_audio_signal_init(AgsClearAudioSignal *clear_audio_signal);
+void ags_clear_audio_signal_set_property(GObject *gobject,
+				       guint prop_id,
+				       const GValue *value,
+				       GParamSpec *param_spec);
+void ags_clear_audio_signal_get_property(GObject *gobject,
+				       guint prop_id,
+				       GValue *value,
+				       GParamSpec *param_spec);
+void ags_clear_audio_signal_connect(AgsConnectable *connectable);
+void ags_clear_audio_signal_disconnect(AgsConnectable *connectable);
+void ags_clear_audio_signal_finalize(GObject *gobject);
+
+void ags_clear_audio_signal_launch(AgsTask *task);
+
+/**
+ * SECTION:ags_clear_audio_signal
+ * @short_description: clear audio_signal object from recycling
+ * @title: AgsClearAudioSignal
+ * @section_id:
+ * @include: ags/audio/task/ags_clear_audio_signal.h
+ *
+ * The #AgsClearAudioSignal task clears #AgsAudioSignal from #AgsRecycling.
+ */
+
+static gpointer ags_clear_audio_signal_parent_class = NULL;
+static AgsConnectableInterface *ags_clear_audio_signal_parent_connectable_interface;
+
+enum{
+  PROP_0,
+  PROP_AUDIO_SIGNAL,
+};
+
+GType
+ags_clear_audio_signal_get_type()
+{
+  static GType ags_type_clear_audio_signal = 0;
+
+  if(!ags_type_clear_audio_signal){
+    static const GTypeInfo ags_clear_audio_signal_info = {
+      sizeof (AgsClearAudioSignalClass),
+      NULL, /* base_init */
+      NULL, /* base_finalize */
+      (GClassInitFunc) ags_clear_audio_signal_class_init,
+      NULL, /* class_finalize */
+      NULL, /* class_data */
+      sizeof (AgsClearAudioSignal),
+      0,    /* n_preallocs */
+      (GInstanceInitFunc) ags_clear_audio_signal_init,
+    };
+
+    static const GInterfaceInfo ags_connectable_interface_info = {
+      (GInterfaceInitFunc) ags_clear_audio_signal_connectable_interface_init,
+      NULL, /* interface_finalize */
+      NULL, /* interface_data */
+    };
+
+    ags_type_clear_audio_signal = g_type_register_static(AGS_TYPE_TASK,
+						  "AgsClearAudioSignal\0",
+						  &ags_clear_audio_signal_info,
+						  0);
+
+    g_type_add_interface_static(ags_type_clear_audio_signal,
+				AGS_TYPE_CONNECTABLE,
+				&ags_connectable_interface_info);
+  }
+  
+  return (ags_type_clear_audio_signal);
+}
+
+void
+ags_clear_audio_signal_class_init(AgsClearAudioSignalClass *clear_audio_signal)
+{
+  GObjectClass *gobject;
+  AgsTaskClass *task;
+  GParamSpec *param_spec;
+
+  ags_clear_audio_signal_parent_class = g_type_class_peek_parent(clear_audio_signal);
+
+  /* GObjectClass */
+  gobject = (GObjectClass *) clear_audio_signal;
+
+  gobject->set_property = ags_clear_audio_signal_set_property;
+  gobject->get_property = ags_clear_audio_signal_get_property;
+
+  gobject->finalize = ags_clear_audio_signal_finalize;
+
+  /* properties */
+  /**
+   * AgsClearAudioSignal:audio-signal:
+   *
+   * The assigned #AgsAudioSignal
+   * 
+   * Since: 0.7.122.17
+   */
+  param_spec = g_param_spec_object("audio-signal\0",
+				   "audio signal of clear audio signal\0",
+				   "The audio signal of clear audio signal task\0",
+				   AGS_TYPE_AUDIO_SIGNAL,
+				   G_PARAM_READABLE | G_PARAM_WRITABLE);
+  g_object_class_install_property(gobject,
+				  PROP_AUDIO_SIGNAL,
+				  param_spec);
+
+  /* AgsTaskClass */
+  task = (AgsTaskClass *) clear_audio_signal;
+
+  task->launch = ags_clear_audio_signal_launch;
+}
+
+void
+ags_clear_audio_signal_connectable_interface_init(AgsConnectableInterface *connectable)
+{
+  ags_clear_audio_signal_parent_connectable_interface = g_type_interface_peek_parent(connectable);
+
+  connectable->connect = ags_clear_audio_signal_connect;
+  connectable->disconnect = ags_clear_audio_signal_disconnect;
+}
+
+void
+ags_clear_audio_signal_init(AgsClearAudioSignal *clear_audio_signal)
+{
+  clear_audio_signal->audio_signal = NULL;
+}
+
+void
+ags_clear_audio_signal_set_property(GObject *gobject,
+				  guint prop_id,
+				  const GValue *value,
+				  GParamSpec *param_spec)
+{
+  AgsClearAudioSignal *clear_audio_signal;
+
+  clear_audio_signal = AGS_CLEAR_AUDIO_SIGNAL(gobject);
+
+  switch(prop_id){
+  case PROP_AUDIO_SIGNAL:
+    {
+      AgsAudioSignal *audio_signal;
+
+      audio_signal = (AgsAudioSignal *) g_value_get_object(value);
+
+      if(clear_audio_signal->audio_signal == (GObject *) audio_signal){
+	return;
+      }
+
+      if(clear_audio_signal->audio_signal != NULL){
+	g_object_unref(clear_audio_signal->audio_signal);
+      }
+
+      if(audio_signal != NULL){
+	g_object_ref(audio_signal);
+      }
+
+      clear_audio_signal->audio_signal = (GObject *) audio_signal;
+    }
+    break;
+  default:
+    G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec);
+    break;
+  }
+}
+
+void
+ags_clear_audio_signal_get_property(GObject *gobject,
+				  guint prop_id,
+				  GValue *value,
+				  GParamSpec *param_spec)
+{
+  AgsClearAudioSignal *clear_audio_signal;
+
+  clear_audio_signal = AGS_CLEAR_AUDIO_SIGNAL(gobject);
+
+  switch(prop_id){
+  case PROP_AUDIO_SIGNAL:
+    {
+      g_value_set_object(value, clear_audio_signal->audio_signal);
+    }
+    break;
+  default:
+    G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, param_spec);
+    break;
+  }
+}
+
+void
+ags_clear_audio_signal_connect(AgsConnectable *connectable)
+{
+  ags_clear_audio_signal_parent_connectable_interface->connect(connectable);
+
+  /* empty */
+}
+
+void
+ags_clear_audio_signal_disconnect(AgsConnectable *connectable)
+{
+  ags_clear_audio_signal_parent_connectable_interface->disconnect(connectable);
+
+  /* empty */
+}
+
+void
+ags_clear_audio_signal_finalize(GObject *gobject)
+{
+  G_OBJECT_CLASS(ags_clear_audio_signal_parent_class)->finalize(gobject);
+
+  /* empty */
+}
+
+void
+ags_clear_audio_signal_launch(AgsTask *task)
+{
+  AgsClearAudioSignal *clear_audio_signal;
+  
+  AgsAudioSignal *audio_signal;
+
+  GList *stream;
+
+  clear_audio_signal = AGS_CLEAR_AUDIO_SIGNAL(task);
+
+  /* clear */
+  audio_signal = clear_audio_signal->audio_signal;
+
+  /* clear the stream */
+  stream = audio_signal->stream_beginning;
+  
+  while(stream != NULL){
+    ags_audio_buffer_util_clear_buffer(stream->data, 1,
+				       audio_signal->buffer_size, ags_audio_buffer_util_format_from_soundcard(audio_signal->format));
+    
+    stream = stream->next;
+  }
+}
+
+/**
+ * ags_clear_audio_signal_new:
+ * @audio_signal: the #AgsAudioSignal to clear
+ *
+ * Creates an #AgsClearAudioSignal.
+ *
+ * Returns: an new #AgsClearAudioSignal.
+ *
+ * Since: 0.7.122.17
+ */
+AgsClearAudioSignal*
+ags_clear_audio_signal_new(AgsAudioSignal *audio_signal)
+{
+  AgsClearAudioSignal *clear_audio_signal;
+
+  clear_audio_signal = (AgsClearAudioSignal *) g_object_new(AGS_TYPE_CLEAR_AUDIO_SIGNAL,
+							      NULL);
+  
+  clear_audio_signal->audio_signal = audio_signal;
+
+  return(clear_audio_signal);
+}
diff --git a/ags/audio/task/ags_clear_audio_signal.h b/ags/audio/task/ags_clear_audio_signal.h
new file mode 100644
index 0000000..3722718
--- /dev/null
+++ b/ags/audio/task/ags_clear_audio_signal.h
@@ -0,0 +1,57 @@
+/* GSequencer - Advanced GTK Sequencer
+ * Copyright (C) 2005-2015 Joël Krähemann
+ *
+ * This file is part of GSequencer.
+ *
+ * GSequencer is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GSequencer is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GSequencer.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __AGS_CLEAR_AUDIO_SIGNAL_H__
+#define __AGS_CLEAR_AUDIO_SIGNAL_H__
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <ags/thread/ags_task.h>
+
+#include <ags/audio/ags_recycling.h>
+#include <ags/audio/ags_audio_signal.h>
+
+#define AGS_TYPE_CLEAR_AUDIO_SIGNAL                (ags_clear_audio_signal_get_type())
+#define AGS_CLEAR_AUDIO_SIGNAL(obj)                (G_TYPE_CHECK_INSTANCE_CAST((obj), AGS_TYPE_CLEAR_AUDIO_SIGNAL, AgsClearAudioSignal))
+#define AGS_CLEAR_AUDIO_SIGNAL_CLASS(class)        (G_TYPE_CHECK_CLASS_CAST((class), AGS_TYPE_CLEAR_AUDIO_SIGNAL, AgsClearAudioSignalClass))
+#define AGS_IS_CLEAR_AUDIO_SIGNAL(obj)             (G_TYPE_CHECK_INSTANCE_TYPE((obj), AGS_TYPE_CLEAR_AUDIO_SIGNAL))
+#define AGS_IS_CLEAR_AUDIO_SIGNAL_CLASS(class)     (G_TYPE_CHECK_CLASS_TYPE((class), AGS_TYPE_CLEAR_AUDIO_SIGNAL))
+#define AGS_CLEAR_AUDIO_SIGNAL_GET_CLASS(obj)      (G_TYPE_INSTANCE_GET_CLASS((obj), AGS_TYPE_CLEAR_AUDIO_SIGNAL, AgsClearAudioSignalClass))
+
+typedef struct _AgsClearAudioSignal AgsClearAudioSignal;
+typedef struct _AgsClearAudioSignalClass AgsClearAudioSignalClass;
+
+struct _AgsClearAudioSignal
+{
+  AgsTask task;
+
+  AgsAudioSignal *audio_signal;
+};
+
+struct _AgsClearAudioSignalClass
+{
+  AgsTaskClass task;
+};
+
+GType ags_clear_audio_signal_get_type();
+
+AgsClearAudioSignal* ags_clear_audio_signal_new(AgsAudioSignal *audio_signal);
+
+#endif /*__AGS_CLEAR_AUDIO_SIGNAL_H__*/
diff --git a/ags/gsequencer_main.c b/ags/gsequencer_main.c
index 1e61f1f..e2b60c5 100644
--- a/ags/gsequencer_main.c
+++ b/ags/gsequencer_main.c
@@ -1348,7 +1348,7 @@ main(int argc, char **argv)
 
   //ao_initialize();
 
-  gdk_threads_enter();
+  //  gdk_threads_enter();
   //  g_thread_init(NULL);
   gtk_init(&argc, &argv);
 
diff --git a/ags/object/ags_concurrent_tree.c b/ags/object/ags_concurrent_tree.c
index 1a8bf4f..4e9374c 100644
--- a/ags/object/ags_concurrent_tree.c
+++ b/ags/object/ags_concurrent_tree.c
@@ -174,8 +174,11 @@ ags_concurrent_tree_lock_context(AgsConcurrentTree *concurrent_tree)
 
 
   pthread_mutex_lock(&exclusive_lock);
-  
+
+  //FIXME:JK: check depenendencies - probably should be pthread_mutex_trylock()
   pthread_mutex_lock(parent_mutex);
+  parent_locked = TRUE;
+  
   pthread_mutex_lock(mutex);
 
   pthread_mutex_unlock(&exclusive_lock);
diff --git a/ags/object/ags_connection.c b/ags/object/ags_connection.c
index bf3f1b8..92325b4 100644
--- a/ags/object/ags_connection.c
+++ b/ags/object/ags_connection.c
@@ -232,7 +232,7 @@ ags_connection_find_type(GList *connection,
 
   while(connection != NULL){
     if(AGS_IS_CONNECTION(connection->data) &&
-       g_type_is_a(G_OBJECT_TYPE(connection->data),
+       g_type_is_a(G_OBJECT_TYPE(G_OBJECT(connection->data)),
 				 connection_type)){
       return(connection);
     }
diff --git a/ags/test/X/ags_functional_editor_workflow_test.c b/ags/test/X/ags_functional_editor_workflow_test.c
new file mode 100644
index 0000000..4c138dd
--- /dev/null
+++ b/ags/test/X/ags_functional_editor_workflow_test.c
@@ -0,0 +1,660 @@
+/* GSequencer - Advanced GTK Sequencer
+ * Copyright (C) 2005-2017 Joël Krähemann
+ *
+ * This file is part of GSequencer.
+ *
+ * GSequencer is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GSequencer is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GSequencer.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <CUnit/CUnit.h>
+#include <CUnit/Basic.h>
+
+#include <ags/libags.h>
+#include <ags/libags-audio.h>
+
+#include <ags/gsequencer_main.h>
+
+#include <ags/test/X/libgsequencer.h>
+
+#include "gsequencer_setup_util.h"
+#include "ags_functional_test_util.h"
+
+int ags_functional_editor_workflow_test_init_suite();
+int ags_functional_editor_workflow_test_clean_suite();
+
+void ags_functional_editor_workflow_test_drum();
+void ags_functional_editor_workflow_test_matrix();
+void ags_functional_editor_workflow_test_ffplayer();
+void ags_functional_editor_workflow_test_edit_all();
+void ags_functional_editor_workflow_test_fill_all();
+
+#define AGS_FUNCTIONAL_EDITOR_WORKFLOW_TEST_CONFIG "[generic]\n" \
+  "autosave-thread=false\n"			       \
+  "simple-file=true\n"				       \
+  "disable-feature=experimental\n"		       \
+  "segmentation=4/4\n"				       \
+  "\n"						       \
+  "[thread]\n"					       \
+  "model=super-threaded\n"			       \
+  "super-threaded-scope=channel\n"		       \
+  "lock-global=ags-thread\n"			       \
+  "lock-parent=ags-recycling-thread\n"		       \
+  "\n"						       \
+  "[soundcard-0]\n"				       \
+  "backend=alsa\n"                                     \
+  "device=hw:0,0\n"                                    \
+  "samplerate=44100\n"				       \
+  "buffer-size=1024\n"				       \
+  "pcm-channels=2\n"				       \
+  "dsp-channels=2\n"				       \
+  "format=16\n"					       \
+  "\n"						       \
+  "[recall]\n"					       \
+  "auto-sense=true\n"				       \
+  "\n"
+
+extern AgsApplicationContext *ags_application_context;
+
+extern struct sigaction ags_test_sigact;
+
+extern volatile gboolean ags_show_start_animation;
+
+AgsGuiThread *gui_thread;
+AgsTaskThread *task_thread;
+
+/* The suite initialization function.
+ * Opens the temporary file used by the tests.
+ * Returns zero on success, non-zero otherwise.
+ */
+int
+ags_functional_editor_workflow_test_init_suite()
+{
+  AgsConfig *config;
+
+  config = ags_config_get_instance();
+  ags_config_load_from_data(config,
+			    AGS_FUNCTIONAL_EDITOR_WORKFLOW_TEST_CONFIG,
+			    strlen(AGS_FUNCTIONAL_EDITOR_WORKFLOW_TEST_CONFIG));
+
+  ags_functional_test_util_setup_and_launch();
+
+  /* get gui thread */
+  gui_thread = ags_thread_find_type(ags_application_context->main_loop,
+				    AGS_TYPE_GUI_THREAD);
+
+  /* get task thread */
+  task_thread = ags_thread_find_type(ags_application_context->main_loop,
+				     AGS_TYPE_TASK_THREAD);
+
+  /* window and editor size */
+  ags_functional_test_util_file_default_window_resize();
+
+  ags_functional_test_util_file_default_editor_resize();
+ 
+  return(0);
+}
+
+/* The suite cleanup function.
+ * Closes the temporary file used by the tests.
+ * Returns zero on success, non-zero otherwise.
+ */
+int
+ags_functional_editor_workflow_test_clean_suite()
+{  
+  ags_thread_stop(gui_thread);  
+
+  return(0);
+}
+
+void
+ags_functional_editor_workflow_test_drum()
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
+  AgsEditor *editor;
+  AgsMachine *machine;
+  AgsMachineSelector *machine_selector;
+  AgsMachineSelection *machine_selection;
+  
+  GList *list_start, *list;
+
+  gchar *machine_str;
+  
+  guint nth_machine;
+  gboolean success;
+
+  xorg_application_context = ags_application_context;
+
+  nth_machine = 0;
+
+  /* add drum */
+  success = ags_functional_test_util_add_machine(NULL,
+						 "Drum");
+
+  CU_ASSERT(success == TRUE);
+
+  ags_functional_test_util_idle();
+
+  /* get machine */
+  gdk_threads_enter();
+
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+
+  if(list != NULL &&
+     AGS_IS_DRUM(list->data)){
+    machine = list->data;
+  }else{
+    machine = NULL;
+  }
+  
+  CU_ASSERT(machine != NULL);
+
+  /*
+   *  add machine to editor
+   */
+
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  window = xorg_application_context->window;
+  editor = window->editor;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  /* add index and link */
+  success = ags_functional_test_util_machine_selection_add_index();
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_selector_select(nth_machine);
+  
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_selection_link_index();
+
+  CU_ASSERT(success == TRUE);
+
+  /* select machine */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_selector = editor->machine_selector;
+  machine_selection = machine_selector->machine_selection;
+
+  machine_str = g_strdup_printf("%s: %s\0",
+				G_OBJECT_TYPE_NAME(machine),
+				machine->name);
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_machine_selection_select(machine_str);
+  
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_dialog_ok(machine_selection);
+
+  CU_ASSERT(success == TRUE);
+}
+
+void
+ags_functional_editor_workflow_test_matrix()
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
+  AgsEditor *editor;
+  AgsMachine *machine;
+  AgsMachineSelector *machine_selector;
+  AgsMachineSelection *machine_selection;
+  
+  GList *list_start, *list;
+
+  gchar *machine_str;
+
+  guint nth_machine;
+  gboolean success;
+
+  xorg_application_context = ags_application_context;
+
+  nth_machine = 1;
+  
+  /* add matrix */
+  success = ags_functional_test_util_add_machine(NULL,
+						 "Matrix");
+
+  CU_ASSERT(success == TRUE);
+
+  ags_functional_test_util_idle();
+
+  /* get machine */
+  gdk_threads_enter();
+
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+
+  if(list != NULL &&
+     AGS_IS_MATRIX(list->data)){
+    machine = list->data;
+  }else{
+    machine = NULL;
+  }
+  
+  CU_ASSERT(machine != NULL);
+
+  /*
+   *  add machine to editor
+   */
+
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  window = xorg_application_context->window;
+  editor = window->editor;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  /* add index set link */
+  success = ags_functional_test_util_machine_selection_add_index();
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_selector_select(nth_machine);
+  
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_selection_link_index();
+
+  CU_ASSERT(success == TRUE);
+
+  /* select machine */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_selector = editor->machine_selector;
+  machine_selection = machine_selector->machine_selection;
+
+  machine_str = g_strdup_printf("%s: %s\0",
+				G_OBJECT_TYPE_NAME(machine),
+				machine->name);
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+  
+  success = ags_functional_test_util_machine_selection_select(machine_str);
+  
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_dialog_ok(machine_selection);
+
+  CU_ASSERT(success == TRUE);
+}
+
+void
+ags_functional_editor_workflow_test_ffplayer()
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
+  AgsEditor *editor;
+  AgsMachine *machine;
+  AgsMachineSelector *machine_selector;
+  AgsMachineSelection *machine_selection;
+    
+  GList *list_start, *list;
+
+  gchar *machine_str;
+
+  guint nth_machine;
+  gboolean success;
+
+  xorg_application_context = ags_application_context;
+
+  nth_machine = 2;
+  
+  /* add fplayer */
+  success = ags_functional_test_util_add_machine(NULL,
+						 "FPlayer");
+
+  CU_ASSERT(success == TRUE);
+
+  ags_functional_test_util_idle();
+
+  /* get machine */
+  gdk_threads_enter();
+
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+
+  if(list != NULL &&
+     AGS_IS_FFPLAYER(list->data)){
+    machine = list->data;
+  }else{
+    machine = NULL;
+  }
+  
+  CU_ASSERT(machine != NULL);
+
+  /*
+   *  add machine to editor
+   */
+
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  window = xorg_application_context->window;
+  editor = window->editor;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  /* add index and link */
+  success = ags_functional_test_util_machine_selection_add_index();
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_selector_select(nth_machine);
+  
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_selection_link_index();
+
+  CU_ASSERT(success == TRUE);
+
+  /* select machine */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_selector = editor->machine_selector;
+  machine_selection = machine_selector->machine_selection;
+
+  machine_str = g_strdup_printf("%s: %s\0",
+				G_OBJECT_TYPE_NAME(machine),
+				machine->name);
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_machine_selection_select(machine_str);
+  
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_dialog_ok(machine_selection);
+
+  CU_ASSERT(success == TRUE);
+}
+
+void
+ags_functional_editor_workflow_test_edit_all()
+{
+  guint nth_machine;
+  guint i, j;
+  gboolean success;
+
+  /*
+   * edit drum
+   */
+
+  nth_machine = 0;
+  
+  /* set zoom */
+  success = ags_functional_test_util_toolbar_zoom(AGS_FUNCTIONAL_TEST_UTIL_TOOLBAR_ZOOM_1_TO_4);
+
+  CU_ASSERT(success == TRUE);
+
+  /* edit tool */
+  success = ags_functional_test_util_toolbar_edit_click();
+
+  CU_ASSERT(success == TRUE);
+
+  /* select index */
+  success = ags_functional_test_util_machine_selector_select(nth_machine);
+  
+  CU_ASSERT(success == TRUE);
+
+  /* add drum kick pattern 2/4 */
+  success = TRUE;
+  
+  for(i = 0; i < 64 && success;){
+    success = ags_functional_test_util_pattern_edit_add_point(i, 0);
+
+    i += 8;
+  }
+
+  for(i = 4; i < 64 && success;){
+    success = ags_functional_test_util_pattern_edit_add_point(i, 1);
+
+    i += 8;
+  }
+
+  CU_ASSERT(success == TRUE);
+
+  /*
+   * edit matrix
+   */
+
+  nth_machine = 1;
+
+  /* select index */
+  success = ags_functional_test_util_machine_selector_select(nth_machine);
+  
+  CU_ASSERT(success == TRUE);
+
+  /* set zoom */
+  success = ags_functional_test_util_toolbar_zoom(AGS_FUNCTIONAL_TEST_UTIL_TOOLBAR_ZOOM_1_TO_8);
+
+  CU_ASSERT(success == TRUE);
+
+  /* add matrix baseline pattern 8/8 */
+  success = TRUE;
+  
+  for(i = 0; i < 32 && success;){
+    for(j = 0; j < 56 && success;){
+      success = ags_functional_test_util_pattern_edit_add_point(i * 8 + j, 15);
+
+      j += 8;
+    }
+
+    if(!success){
+      break;
+    }
+    
+    success = ags_functional_test_util_pattern_edit_add_point(i * 8 + 56, 14);
+    
+    i += 8;
+  }
+
+  CU_ASSERT(success == TRUE);
+
+  /*
+   * edit ffplayer
+   */
+
+  nth_machine = 2;
+
+  /* select index */
+  success = ags_functional_test_util_machine_selector_select(nth_machine);
+  
+  CU_ASSERT(success == TRUE);
+
+  /* set zoom */
+  success = ags_functional_test_util_toolbar_zoom(AGS_FUNCTIONAL_TEST_UTIL_TOOLBAR_ZOOM_1_TO_4);
+
+  CU_ASSERT(success == TRUE);
+
+  /* add matrix baseline pattern 4/4 */
+  success = TRUE;
+  
+  for(i = 0; i < 64 && success;){
+    success = ags_functional_test_util_note_edit_add_point(i, i + 1,
+							   rand() % 10);
+    
+    i += 8;
+  }
+
+  CU_ASSERT(success == TRUE);
+}
+
+void
+ags_functional_editor_workflow_test_fill_all()
+{
+  guint nth_machine;
+
+}
+
+int
+main(int argc, char **argv)
+{
+  CU_pSuite pSuite = NULL;
+
+  AgsConfig *config;
+
+  pthread_t *animation_thread;
+
+  struct sched_param param;
+  struct rlimit rl;
+  struct sigaction sa;
+
+  gchar *rc_filename;
+  
+  int result;
+
+  const rlim_t kStackSize = 64L * 1024L * 1024L;   // min stack size = 64 Mb
+
+#ifdef AGS_USE_TIMER
+  timer_t *timer_id
+#endif
+  
+  putenv("LC_ALL=C\0");
+  putenv("LANG=C\0");
+
+  //  mtrace();
+  atexit(ags_test_signal_cleanup);
+
+  result = getrlimit(RLIMIT_STACK, &rl);
+
+  /* set stack size 64M */
+  if(result == 0){
+    if(rl.rlim_cur < kStackSize){
+      rl.rlim_cur = kStackSize;
+      result = setrlimit(RLIMIT_STACK, &rl);
+
+      if(result != 0){
+	//TODO:JK
+      }
+    }
+  }
+
+  param.sched_priority = GSEQUENCER_RT_PRIORITY;
+      
+  if(sched_setscheduler(0, SCHED_FIFO, &param) == -1) {
+    perror("sched_setscheduler failed\0");
+  }
+
+  /* Ignore interactive and job-control signals.  */
+  signal(SIGINT, SIG_IGN);
+  signal(SIGQUIT, SIG_IGN);
+  signal(SIGTSTP, SIG_IGN);
+  signal(SIGTTIN, SIG_IGN);
+  signal(SIGTTOU, SIG_IGN);
+  signal(SIGCHLD, SIG_IGN);
+  signal(AGS_THREAD_RESUME_SIG, SIG_IGN);
+  signal(AGS_THREAD_SUSPEND_SIG, SIG_IGN);
+
+  ags_test_sigact.sa_handler = ags_test_signal_handler;
+  sigemptyset(&ags_test_sigact.sa_mask);
+  ags_test_sigact.sa_flags = 0;
+  sigaction(SIGINT, &ags_test_sigact, (struct sigaction *) NULL);
+  sigaction(SA_RESTART, &ags_test_sigact, (struct sigaction *) NULL);
+
+  XInitThreads();
+      
+  /* parse rc file */
+  rc_filename = g_strdup_printf("%s/%s\0",
+				SRCDIR,
+				"gsequencer.share/styles/ags.rc\0");
+  
+  gtk_rc_parse(rc_filename);
+  g_free(rc_filename);
+  
+  /**/
+  LIBXML_TEST_VERSION;
+
+  //ao_initialize();
+
+  //  g_thread_init(NULL);
+  gtk_init(&argc, &argv);
+
+  g_object_set(gtk_settings_get_default(),
+	       "gtk-theme-name\0", "Raleigh\0",
+	       NULL);
+  g_signal_handlers_block_matched(gtk_settings_get_default(),
+				  G_SIGNAL_MATCH_DETAIL,
+				  g_signal_lookup("set-property\0",
+						  GTK_TYPE_SETTINGS),
+				  g_quark_from_string("gtk-theme-name\0"),
+				  NULL,
+				  NULL,
+				  NULL);
+  
+  ipatch_init();
+  //  g_log_set_fatal_mask("GLib-GObject\0", // "Gtk\0" G_LOG_DOMAIN, // 
+		       //		       G_LOG_LEVEL_CRITICAL); // G_LOG_LEVEL_WARNING
+
+  /* animate */
+  animation_thread = (pthread_t *) malloc(sizeof(pthread_t));
+  g_atomic_int_set(&(ags_show_start_animation),
+		   TRUE);
+  
+  ags_test_start_animation(animation_thread);
+  
+  /* initialize the CUnit test registry */
+  if(CUE_SUCCESS != CU_initialize_registry()){
+    return CU_get_error();
+  }
+
+  /* add a suite to the registry */
+  pSuite = CU_add_suite("AgsFuncitonalEditorWorkflowTest\0", ags_functional_editor_workflow_test_init_suite, ags_functional_editor_workflow_test_clean_suite);
+  
+  if(pSuite == NULL){
+    CU_cleanup_registry();
+    
+    return CU_get_error();
+  }
+
+  gtk_init(NULL,
+	   NULL);
+  //  g_log_set_fatal_mask(G_LOG_DOMAIN, // , // "Gtk\0" G_LOG_DOMAIN,"GLib-GObject\0",
+  //		       G_LOG_LEVEL_CRITICAL);
+
+  /* add the tests to the suite */
+  if((CU_add_test(pSuite, "functional test of GSequencer editor workflow AgsDrum\0", ags_functional_editor_workflow_test_drum) == NULL) ||
+     (CU_add_test(pSuite, "functional test of GSequencer editor workflow AgsMatrix\0", ags_functional_editor_workflow_test_matrix) == NULL) ||
+     (CU_add_test(pSuite, "functional test of GSequencer editor workflow AgsFFPlayer\0", ags_functional_editor_workflow_test_ffplayer) == NULL) ||
+     (CU_add_test(pSuite, "functional test of GSequencer editor workflow edit all\0", ags_functional_editor_workflow_test_edit_all) == NULL) ||
+     (CU_add_test(pSuite, "functional test of GSequencer editor workflow fill all\0", ags_functional_editor_workflow_test_fill_all) == NULL)){
+    CU_cleanup_registry();
+      
+    return CU_get_error();
+  }
+  
+  /* Run all tests using the CUnit Basic interface */
+  CU_basic_set_mode(CU_BRM_VERBOSE);
+  CU_basic_run_tests();
+  
+  CU_cleanup_registry();
+  
+  return(CU_get_error());
+}
diff --git a/ags/test/X/ags_functional_line_member_add_and_destroy_test.c b/ags/test/X/ags_functional_line_member_add_and_destroy_test.c
new file mode 100644
index 0000000..75d335e
--- /dev/null
+++ b/ags/test/X/ags_functional_line_member_add_and_destroy_test.c
@@ -0,0 +1,1475 @@
+/* GSequencer - Advanced GTK Sequencer
+ * Copyright (C) 2005-2017 Joël Krähemann
+ *
+ * This file is part of GSequencer.
+ *
+ * GSequencer is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GSequencer is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GSequencer.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <CUnit/CUnit.h>
+#include <CUnit/Basic.h>
+
+#include <ags/libags.h>
+#include <ags/libags-audio.h>
+
+#include <ags/gsequencer_main.h>
+
+#include <ags/test/X/libgsequencer.h>
+
+#include "gsequencer_setup_util.h"
+#include "ags_functional_test_util.h"
+
+int ags_functional_line_member_add_and_destroy_test_init_suite();
+int ags_functional_line_member_add_and_destroy_test_clean_suite();
+
+void ags_functional_line_member_add_and_destroy_test_panel();
+void ags_functional_line_member_add_and_destroy_test_mixer();
+void ags_functional_line_member_add_and_destroy_test_drum();
+void ags_functional_line_member_add_and_destroy_test_matrix();
+void ags_functional_line_member_add_and_destroy_test_synth();
+void ags_functional_line_member_add_and_destroy_test_ffplayer();
+
+#define AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT "/usr/lib/ladspa/cmt.so\0"
+#define AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT_DELAY "Echo Delay Line (Maximum Delay 1s)\0"
+#define AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT_FREEVERB "Freeverb (Version 3)\0"
+
+#define AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LV2_SWH "/usr/lib/lv2/gverb-swh.lv2/plugin-linux.so\0"
+#define AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LV2_SWH_GVERB "GVerb\0"
+
+#define AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_CONFIG "[generic]\n" \
+  "autosave-thread=false\n"			       \
+  "simple-file=true\n"				       \
+  "disable-feature=experimental\n"		       \
+  "segmentation=4/4\n"				       \
+  "\n"						       \
+  "[thread]\n"					       \
+  "model=super-threaded\n"			       \
+  "super-threaded-scope=channel\n"		       \
+  "lock-global=ags-thread\n"			       \
+  "lock-parent=ags-recycling-thread\n"		       \
+  "\n"						       \
+  "[soundcard-0]\n"				       \
+  "backend=alsa\n"                                     \
+  "device=hw:0,0\n"                                    \
+  "samplerate=44100\n"				       \
+  "buffer-size=1024\n"				       \
+  "pcm-channels=2\n"				       \
+  "dsp-channels=2\n"				       \
+  "format=16\n"					       \
+  "\n"						       \
+  "[recall]\n"					       \
+  "auto-sense=true\n"				       \
+  "\n"
+
+extern AgsApplicationContext *ags_application_context;
+
+extern struct sigaction ags_test_sigact;
+
+extern volatile gboolean ags_show_start_animation;
+
+AgsGuiThread *gui_thread;
+AgsTaskThread *task_thread;
+
+/* The suite initialization function.
+ * Opens the temporary file used by the tests.
+ * Returns zero on success, non-zero otherwise.
+ */
+int
+ags_functional_line_member_add_and_destroy_test_init_suite()
+{
+  AgsConfig *config;
+
+  config = ags_config_get_instance();
+  ags_config_load_from_data(config,
+			    AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_CONFIG,
+			    strlen(AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_CONFIG));
+
+  ags_functional_test_util_setup_and_launch();
+
+  /* get gui thread */
+  gui_thread = ags_thread_find_type(ags_application_context->main_loop,
+				    AGS_TYPE_GUI_THREAD);
+
+  /* get task thread */
+  task_thread = ags_thread_find_type(ags_application_context->main_loop,
+				     AGS_TYPE_TASK_THREAD);
+
+  return(0);
+}
+
+/* The suite cleanup function.
+ * Closes the temporary file used by the tests.
+ * Returns zero on success, non-zero otherwise.
+ */
+int
+ags_functional_line_member_add_and_destroy_test_clean_suite()
+{  
+  ags_thread_stop(gui_thread);  
+
+  return(0);
+}
+
+void
+ags_functional_line_member_add_and_destroy_test_panel()
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsMachine *machine;
+  AgsMachineEditor *machine_editor;
+  AgsLineEditor *line_editor;
+  AgsPluginBrowser *plugin_browser;
+
+  GList *list_start, *list;
+  
+  guint nth_machine;
+  guint nth_pad, nth_audio_channel;
+  gboolean success;
+
+  xorg_application_context = ags_application_context;
+  
+  /* add panel */
+  success = ags_functional_test_util_add_machine(NULL,
+						 "Panel");
+
+  CU_ASSERT(success == TRUE);
+
+  ags_functional_test_util_idle();
+
+  /* get machine */
+  gdk_threads_enter();
+
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+
+  if(list != NULL &&
+     AGS_IS_PANEL(list->data)){
+    machine = list->data;
+  }else{
+    machine = NULL;
+  }
+  
+  CU_ASSERT(machine != NULL);
+  
+  /*
+   *  add line member to input
+   */
+
+  nth_machine = 0;
+
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_machine,
+								  AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB);
+
+  /* add ladspa effect */
+  nth_pad = 0;
+  nth_audio_channel = 0;
+  
+  success = ags_functional_test_util_machine_properties_effect_add(nth_machine,
+								   nth_pad, nth_audio_channel);
+
+  CU_ASSERT(success == TRUE);
+
+  /* ladspa */
+  success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine,
+									   nth_pad, nth_audio_channel,
+									   "LADSPA\0");
+
+  CU_ASSERT(success == TRUE);
+
+  /* cmt and delay */  
+  success = ags_functional_test_util_machine_properties_ladspa_filename(nth_machine,
+									nth_pad, nth_audio_channel,
+									AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_ladspa_effect(nth_machine,
+								      nth_pad, nth_audio_channel,
+								      AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT_DELAY);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  line_editor = ags_functional_test_util_get_line_editor(machine_editor,
+							 nth_pad, nth_audio_channel,
+							 FALSE);
+
+  plugin_browser = line_editor->member_editor->plugin_browser;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(plugin_browser);
+  
+  CU_ASSERT(success == TRUE);
+
+  /* add ladspa effect */
+  nth_pad = 0;
+  nth_audio_channel = 0;
+  
+  success = ags_functional_test_util_machine_properties_effect_add(nth_machine,
+								   nth_pad, nth_audio_channel);
+
+  CU_ASSERT(success == TRUE);
+
+  /* ladspa */
+  success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine,
+									   nth_pad, nth_audio_channel,
+									   "LADSPA\0");
+
+  CU_ASSERT(success == TRUE);
+
+  /* cmt and freeverb */  
+  success = ags_functional_test_util_machine_properties_ladspa_filename(nth_machine,
+									nth_pad, nth_audio_channel,
+									AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_ladspa_effect(nth_machine,
+								      nth_pad, nth_audio_channel,
+								      AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT_FREEVERB);
+
+  CU_ASSERT(success == TRUE);
+  
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = AGS_MACHINE(machine)->properties;
+
+  line_editor = ags_functional_test_util_get_line_editor(machine_editor,
+							 nth_pad, nth_audio_channel,
+							 FALSE);
+
+  plugin_browser = line_editor->member_editor->plugin_browser;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(plugin_browser);
+  
+  CU_ASSERT(success == TRUE);
+
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(machine_editor);
+  
+  CU_ASSERT(success == TRUE);
+  
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_machine,
+								  AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB);
+
+  /* add lv2 effect */
+  nth_pad = 0;
+  nth_audio_channel = 0;
+  
+  success = ags_functional_test_util_machine_properties_effect_add(nth_machine,
+								   nth_pad, nth_audio_channel);
+
+  CU_ASSERT(success == TRUE);
+
+  /* lv2 */
+  success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine,
+									   nth_pad, nth_audio_channel,
+									   "Lv2\0");
+
+  CU_ASSERT(success == TRUE);
+
+  /* lv2 and gverb */  
+  success = ags_functional_test_util_machine_properties_lv2_filename(nth_machine,
+								     nth_pad, nth_audio_channel,
+								     AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LV2_SWH);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_lv2_effect(nth_machine,
+								   nth_pad, nth_audio_channel,
+								   AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LV2_SWH_GVERB);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  line_editor = ags_functional_test_util_get_line_editor(machine_editor,
+							 nth_pad, nth_audio_channel,
+							 FALSE);
+
+  plugin_browser = line_editor->member_editor->plugin_browser;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(plugin_browser);
+  
+  CU_ASSERT(success == TRUE);
+
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(machine_editor);
+  
+  CU_ASSERT(success == TRUE);
+
+  /*
+   * destroy effects
+   */  
+  nth_machine = 0;
+
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_machine,
+								  AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB);
+
+  /* remove effect */
+  nth_pad = 0;
+  nth_audio_channel = 0;
+  
+  success = ags_functional_test_util_machine_properties_effect_remove(nth_machine,
+								      nth_pad, nth_audio_channel,
+								      2);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_effect_remove(nth_machine,
+								      nth_pad, nth_audio_channel,
+								      0);
+
+  CU_ASSERT(success == TRUE);
+  
+  success = ags_functional_test_util_machine_properties_effect_remove(nth_machine,
+								      nth_pad, nth_audio_channel,
+								      0);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(machine_editor);
+  
+  CU_ASSERT(success == TRUE);
+
+  /* destroy panel */
+  success = ags_functional_test_util_machine_destroy(nth_machine);
+  
+  CU_ASSERT(success == TRUE);
+}
+
+void
+ags_functional_line_member_add_and_destroy_test_mixer()
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsMachine *machine;
+  AgsMachineEditor *machine_editor;
+  AgsLineEditor *line_editor;
+  AgsPluginBrowser *plugin_browser;
+  
+  GList *list_start, *list;
+
+  guint nth_machine;
+  guint nth_pad, nth_audio_channel;
+  gboolean success;
+
+  xorg_application_context = ags_application_context;
+  
+  /* add mixer */
+  success = ags_functional_test_util_add_machine(NULL,
+						 "Mixer");
+
+  CU_ASSERT(success == TRUE);
+
+  ags_functional_test_util_idle();
+
+  /* get machine */
+  gdk_threads_enter();
+
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+
+  if(list != NULL &&
+     AGS_IS_MIXER(list->data)){
+    machine = list->data;
+  }else{
+    machine = NULL;
+  }
+  
+  CU_ASSERT(machine != NULL);
+  
+  /*
+   *  add line member to input
+   */
+
+  nth_machine = 0;
+
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_machine,
+								  AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB);
+
+  /* add ladspa effect */
+  nth_pad = 0;
+  nth_audio_channel = 0;
+  
+  success = ags_functional_test_util_machine_properties_effect_add(nth_machine,
+								   nth_pad, nth_audio_channel);
+
+  CU_ASSERT(success == TRUE);
+
+  /* ladspa */
+  success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine,
+									   nth_pad, nth_audio_channel,
+									   "LADSPA\0");
+
+  CU_ASSERT(success == TRUE);
+
+  /* cmt and delay */  
+  success = ags_functional_test_util_machine_properties_ladspa_filename(nth_machine,
+									nth_pad, nth_audio_channel,
+									AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_ladspa_effect(nth_machine,
+								      nth_pad, nth_audio_channel,
+								      AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT_DELAY);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  line_editor = ags_functional_test_util_get_line_editor(machine_editor,
+							 nth_pad, nth_audio_channel,
+							 FALSE);
+
+  plugin_browser = line_editor->member_editor->plugin_browser;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(plugin_browser);
+  
+  CU_ASSERT(success == TRUE);
+
+  /* add ladspa effect */
+  nth_pad = 0;
+  nth_audio_channel = 0;
+  
+  success = ags_functional_test_util_machine_properties_effect_add(nth_machine,
+								   nth_pad, nth_audio_channel);
+
+  CU_ASSERT(success == TRUE);
+
+  /* ladspa */
+  success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine,
+									   nth_pad, nth_audio_channel,
+									   "LADSPA\0");
+
+  CU_ASSERT(success == TRUE);
+
+  /* cmt and freeverb */  
+  success = ags_functional_test_util_machine_properties_ladspa_filename(nth_machine,
+									nth_pad, nth_audio_channel,
+									AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_ladspa_effect(nth_machine,
+								      nth_pad, nth_audio_channel,
+								      AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT_FREEVERB);
+
+  CU_ASSERT(success == TRUE);
+  
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = AGS_MACHINE(machine)->properties;
+
+  line_editor = ags_functional_test_util_get_line_editor(machine_editor,
+							 nth_pad, nth_audio_channel,
+							 FALSE);
+
+  plugin_browser = line_editor->member_editor->plugin_browser;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(plugin_browser);
+  
+  CU_ASSERT(success == TRUE);
+
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(machine_editor);
+  
+  CU_ASSERT(success == TRUE);
+  
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_machine,
+								  AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB);
+
+  /* add lv2 effect */
+  nth_pad = 0;
+  nth_audio_channel = 0;
+  
+  success = ags_functional_test_util_machine_properties_effect_add(nth_machine,
+								   nth_pad, nth_audio_channel);
+
+  CU_ASSERT(success == TRUE);
+
+  /* lv2 */
+  success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine,
+									   nth_pad, nth_audio_channel,
+									   "Lv2\0");
+
+  CU_ASSERT(success == TRUE);
+
+  /* lv2 and gverb */  
+  success = ags_functional_test_util_machine_properties_lv2_filename(nth_machine,
+								     nth_pad, nth_audio_channel,
+								     AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LV2_SWH);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_lv2_effect(nth_machine,
+								   nth_pad, nth_audio_channel,
+								   AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LV2_SWH_GVERB);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  line_editor = ags_functional_test_util_get_line_editor(machine_editor,
+							 nth_pad, nth_audio_channel,
+							 FALSE);
+
+  plugin_browser = line_editor->member_editor->plugin_browser;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(plugin_browser);
+  
+  CU_ASSERT(success == TRUE);
+
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(machine_editor);
+  
+  CU_ASSERT(success == TRUE);
+
+  /*
+   * destroy effects
+   */  
+  nth_machine = 0;
+
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_machine,
+								  AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB);
+
+  /* remove effect */
+  nth_pad = 0;
+  nth_audio_channel = 0;
+  
+  success = ags_functional_test_util_machine_properties_effect_remove(nth_machine,
+								      nth_pad, nth_audio_channel,
+								      2);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_effect_remove(nth_machine,
+								      nth_pad, nth_audio_channel,
+								      0);
+
+  CU_ASSERT(success == TRUE);
+  
+  success = ags_functional_test_util_machine_properties_effect_remove(nth_machine,
+								      nth_pad, nth_audio_channel,
+								      0);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(machine_editor);
+  
+  CU_ASSERT(success == TRUE);
+  
+  /* destroy mixer */
+  success = ags_functional_test_util_machine_destroy(nth_machine);
+  
+  CU_ASSERT(success == TRUE);
+}
+
+void
+ags_functional_line_member_add_and_destroy_test_drum()
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsMachine *machine;
+  AgsMachineEditor *machine_editor;
+  AgsLineEditor *line_editor;
+  AgsPluginBrowser *plugin_browser;
+  
+  GList *list_start, *list;
+
+  guint nth_machine;
+  guint nth_pad, nth_audio_channel;
+  gboolean success;
+
+  xorg_application_context = ags_application_context;
+  
+  /* add drum */
+  success = ags_functional_test_util_add_machine(NULL,
+						 "Drum");
+
+  CU_ASSERT(success == TRUE);
+
+  ags_functional_test_util_idle();
+
+  /* get machine */
+  gdk_threads_enter();
+
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+
+  if(list != NULL &&
+     AGS_IS_DRUM(list->data)){
+    machine = list->data;
+  }else{
+    machine = NULL;
+  }
+  
+  CU_ASSERT(machine != NULL);
+
+  /*
+   *  add line member to input
+   */
+
+  nth_machine = 0;
+
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_machine,
+								  AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB);
+
+  /* add ladspa effect */
+  nth_pad = 0;
+  nth_audio_channel = 0;
+  
+  success = ags_functional_test_util_machine_properties_effect_add(nth_machine,
+								   nth_pad, nth_audio_channel);
+
+  CU_ASSERT(success == TRUE);
+
+  /* ladspa */
+  success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine,
+									   nth_pad, nth_audio_channel,
+									   "LADSPA\0");
+
+  CU_ASSERT(success == TRUE);
+
+  /* cmt and delay */  
+  success = ags_functional_test_util_machine_properties_ladspa_filename(nth_machine,
+									nth_pad, nth_audio_channel,
+									AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_ladspa_effect(nth_machine,
+								      nth_pad, nth_audio_channel,
+								      AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT_DELAY);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  line_editor = ags_functional_test_util_get_line_editor(machine_editor,
+							 nth_pad, nth_audio_channel,
+							 FALSE);
+
+  plugin_browser = line_editor->member_editor->plugin_browser;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(plugin_browser);
+  
+  CU_ASSERT(success == TRUE);
+
+  /* add ladspa effect */
+  nth_pad = 0;
+  nth_audio_channel = 0;
+  
+  success = ags_functional_test_util_machine_properties_effect_add(nth_machine,
+								   nth_pad, nth_audio_channel);
+
+  CU_ASSERT(success == TRUE);
+
+  /* ladspa */
+  success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine,
+									   nth_pad, nth_audio_channel,
+									   "LADSPA\0");
+
+  CU_ASSERT(success == TRUE);
+
+  /* cmt and freeverb */  
+  success = ags_functional_test_util_machine_properties_ladspa_filename(nth_machine,
+									nth_pad, nth_audio_channel,
+									AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_ladspa_effect(nth_machine,
+								      nth_pad, nth_audio_channel,
+								      AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT_FREEVERB);
+
+  CU_ASSERT(success == TRUE);
+  
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = AGS_MACHINE(machine)->properties;
+
+  line_editor = ags_functional_test_util_get_line_editor(machine_editor,
+							 nth_pad, nth_audio_channel,
+							 FALSE);
+
+  plugin_browser = line_editor->member_editor->plugin_browser;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(plugin_browser);
+  
+  CU_ASSERT(success == TRUE);
+
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(machine_editor);
+  
+  CU_ASSERT(success == TRUE);
+  
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_machine,
+								  AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB);
+
+  /* add lv2 effect */
+  nth_pad = 0;
+  nth_audio_channel = 0;
+  
+  success = ags_functional_test_util_machine_properties_effect_add(nth_machine,
+								   nth_pad, nth_audio_channel);
+
+  CU_ASSERT(success == TRUE);
+
+  /* lv2 */
+  success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine,
+									   nth_pad, nth_audio_channel,
+									   "Lv2\0");
+
+  CU_ASSERT(success == TRUE);
+
+  /* lv2 and gverb */  
+  success = ags_functional_test_util_machine_properties_lv2_filename(nth_machine,
+								     nth_pad, nth_audio_channel,
+								     AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LV2_SWH);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_lv2_effect(nth_machine,
+								   nth_pad, nth_audio_channel,
+								   AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LV2_SWH_GVERB);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  line_editor = ags_functional_test_util_get_line_editor(machine_editor,
+							 nth_pad, nth_audio_channel,
+							 FALSE);
+
+  plugin_browser = line_editor->member_editor->plugin_browser;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(plugin_browser);
+  
+  CU_ASSERT(success == TRUE);
+
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(machine_editor);
+  
+  CU_ASSERT(success == TRUE);
+
+  /*
+   * destroy effects
+   */  
+  nth_machine = 0;
+
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_machine,
+								  AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB);
+
+  /* remove effect */
+  nth_pad = 0;
+  nth_audio_channel = 0;
+  
+  success = ags_functional_test_util_machine_properties_effect_remove(nth_machine,
+								      nth_pad, nth_audio_channel,
+								      2);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_effect_remove(nth_machine,
+								      nth_pad, nth_audio_channel,
+								      0);
+
+  CU_ASSERT(success == TRUE);
+  
+  success = ags_functional_test_util_machine_properties_effect_remove(nth_machine,
+								      nth_pad, nth_audio_channel,
+								      0);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(machine_editor);
+  
+  CU_ASSERT(success == TRUE);
+  
+  /* destroy drum */
+  success = ags_functional_test_util_machine_destroy(nth_machine);
+  
+  CU_ASSERT(success == TRUE);
+}
+
+void
+ags_functional_line_member_add_and_destroy_test_matrix()
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsMachine *machine;
+
+  GList *list_start, *list;
+
+  guint nth_machine;
+  gboolean success;
+
+  xorg_application_context = ags_application_context;
+  
+  /* add matrix */
+  success = ags_functional_test_util_add_machine(NULL,
+						 "Matrix");
+
+  CU_ASSERT(success == TRUE);
+
+  ags_functional_test_util_idle();
+
+  /* get machine */
+  gdk_threads_enter();
+
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+
+  if(list != NULL &&
+     AGS_IS_MATRIX(list->data)){
+    machine = list->data;
+  }else{
+    machine = NULL;
+  }
+  
+  CU_ASSERT(machine != NULL);
+
+  //TODO:JK: 
+  nth_machine = 0;
+  
+  /* destroy matrix */
+  success = ags_functional_test_util_machine_destroy(nth_machine);
+  
+  CU_ASSERT(success == TRUE);
+}
+
+void
+ags_functional_line_member_add_and_destroy_test_synth()
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsMachine *machine;
+  
+  GList *list_start, *list;
+
+  guint nth_machine;
+  gboolean success;
+
+  xorg_application_context = ags_application_context;
+  
+  /* add synth */
+  success = ags_functional_test_util_add_machine(NULL,
+						 "Synth");
+
+  CU_ASSERT(success == TRUE);
+
+  ags_functional_test_util_idle();
+
+  /* get machine */
+  gdk_threads_enter();
+
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+
+  if(list != NULL &&
+     AGS_IS_SYNTH(list->data)){
+    machine = list->data;
+  }else{
+    machine = NULL;
+  }
+  
+  CU_ASSERT(machine != NULL);
+
+  //TODO:JK: 
+  nth_machine = 0;
+  
+  /* destroy synth */
+  success = ags_functional_test_util_machine_destroy(nth_machine);
+  
+  CU_ASSERT(success == TRUE);
+}
+
+void
+ags_functional_line_member_add_and_destroy_test_ffplayer()
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsMachine *machine;
+  AgsMachineEditor *machine_editor;
+  AgsLineEditor *line_editor;
+  AgsPluginBrowser *plugin_browser;
+  
+  GList *list_start, *list;
+
+  guint nth_machine;
+  guint nth_pad, nth_audio_channel;
+  gboolean success;
+
+  xorg_application_context = ags_application_context;
+  
+  /* add fplayer */
+  success = ags_functional_test_util_add_machine(NULL,
+						 "FPlayer");
+
+  CU_ASSERT(success == TRUE);
+
+  ags_functional_test_util_idle();
+
+  /* get machine */
+  gdk_threads_enter();
+
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+
+  if(list != NULL &&
+     AGS_IS_FFPLAYER(list->data)){
+    machine = list->data;
+  }else{
+    machine = NULL;
+  }
+  
+  CU_ASSERT(machine != NULL);
+
+  /*
+   *  add line member to input
+   */
+
+  nth_machine = 0;
+
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_machine,
+								  AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB);
+
+  /* add ladspa effect */
+  nth_pad = 0;
+  nth_audio_channel = 0;
+  
+  success = ags_functional_test_util_machine_properties_effect_add(nth_machine,
+								   nth_pad, nth_audio_channel);
+
+  CU_ASSERT(success == TRUE);
+
+  /* ladspa */
+  success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine,
+									   nth_pad, nth_audio_channel,
+									   "LADSPA\0");
+
+  CU_ASSERT(success == TRUE);
+
+  /* cmt and delay */  
+  success = ags_functional_test_util_machine_properties_ladspa_filename(nth_machine,
+									nth_pad, nth_audio_channel,
+									AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_ladspa_effect(nth_machine,
+								      nth_pad, nth_audio_channel,
+								      AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT_DELAY);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  line_editor = ags_functional_test_util_get_line_editor(machine_editor,
+							 nth_pad, nth_audio_channel,
+							 FALSE);
+
+  plugin_browser = line_editor->member_editor->plugin_browser;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(plugin_browser);
+  
+  CU_ASSERT(success == TRUE);
+
+  /* add ladspa effect */
+  nth_pad = 0;
+  nth_audio_channel = 0;
+  
+  success = ags_functional_test_util_machine_properties_effect_add(nth_machine,
+								   nth_pad, nth_audio_channel);
+
+  CU_ASSERT(success == TRUE);
+
+  /* ladspa */
+  success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine,
+									   nth_pad, nth_audio_channel,
+									   "LADSPA\0");
+
+  CU_ASSERT(success == TRUE);
+
+  /* cmt and freeverb */  
+  success = ags_functional_test_util_machine_properties_ladspa_filename(nth_machine,
+									nth_pad, nth_audio_channel,
+									AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_ladspa_effect(nth_machine,
+								      nth_pad, nth_audio_channel,
+								      AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LADSPA_CMT_FREEVERB);
+
+  CU_ASSERT(success == TRUE);
+  
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = AGS_MACHINE(machine)->properties;
+
+  line_editor = ags_functional_test_util_get_line_editor(machine_editor,
+							 nth_pad, nth_audio_channel,
+							 FALSE);
+
+  plugin_browser = line_editor->member_editor->plugin_browser;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(plugin_browser);
+  
+  CU_ASSERT(success == TRUE);
+
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(machine_editor);
+  
+  CU_ASSERT(success == TRUE);
+  
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_machine,
+								  AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB);
+
+  /* add lv2 effect */
+  nth_pad = 0;
+  nth_audio_channel = 0;
+  
+  success = ags_functional_test_util_machine_properties_effect_add(nth_machine,
+								   nth_pad, nth_audio_channel);
+
+  CU_ASSERT(success == TRUE);
+
+  /* lv2 */
+  success = ags_functional_test_util_machine_properties_effect_plugin_type(nth_machine,
+									   nth_pad, nth_audio_channel,
+									   "Lv2\0");
+
+  CU_ASSERT(success == TRUE);
+
+  /* lv2 and gverb */  
+  success = ags_functional_test_util_machine_properties_lv2_filename(nth_machine,
+								     nth_pad, nth_audio_channel,
+								     AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LV2_SWH);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_lv2_effect(nth_machine,
+								   nth_pad, nth_audio_channel,
+								   AGS_FUNCTIONAL_LINE_MEMBER_ADD_AND_DESTROY_TEST_LV2_SWH_GVERB);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  line_editor = ags_functional_test_util_get_line_editor(machine_editor,
+							 nth_pad, nth_audio_channel,
+							 FALSE);
+
+  plugin_browser = line_editor->member_editor->plugin_browser;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(plugin_browser);
+  
+  CU_ASSERT(success == TRUE);
+
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(machine_editor);
+  
+  CU_ASSERT(success == TRUE);
+
+  /*
+   * destroy effects
+   */  
+  nth_machine = 0;
+
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_machine,
+								  AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB);
+
+  /* remove effect */
+  nth_pad = 0;
+  nth_audio_channel = 0;
+  
+  success = ags_functional_test_util_machine_properties_effect_remove(nth_machine,
+								      nth_pad, nth_audio_channel,
+								      2);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_effect_remove(nth_machine,
+								      nth_pad, nth_audio_channel,
+								      0);
+
+  CU_ASSERT(success == TRUE);
+  
+  success = ags_functional_test_util_machine_properties_effect_remove(nth_machine,
+								      nth_pad, nth_audio_channel,
+								      0);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response OK */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(machine_editor);
+  
+  CU_ASSERT(success == TRUE);
+  
+  /* destroy fplayer */
+  success = ags_functional_test_util_machine_destroy(nth_machine);
+  
+  CU_ASSERT(success == TRUE);
+}
+
+int
+main(int argc, char **argv)
+{
+  CU_pSuite pSuite = NULL;
+
+  AgsConfig *config;
+
+  pthread_t *animation_thread;
+
+  struct sched_param param;
+  struct rlimit rl;
+  struct sigaction sa;
+
+  gchar *rc_filename;
+  
+  int result;
+
+  const rlim_t kStackSize = 64L * 1024L * 1024L;   // min stack size = 64 Mb
+
+#ifdef AGS_USE_TIMER
+  timer_t *timer_id
+#endif
+  
+  putenv("LC_ALL=C\0");
+  putenv("LANG=C\0");
+
+  //  mtrace();
+  atexit(ags_test_signal_cleanup);
+
+  result = getrlimit(RLIMIT_STACK, &rl);
+
+  /* set stack size 64M */
+  if(result == 0){
+    if(rl.rlim_cur < kStackSize){
+      rl.rlim_cur = kStackSize;
+      result = setrlimit(RLIMIT_STACK, &rl);
+
+      if(result != 0){
+	//TODO:JK
+      }
+    }
+  }
+
+  param.sched_priority = GSEQUENCER_RT_PRIORITY;
+      
+  if(sched_setscheduler(0, SCHED_FIFO, &param) == -1) {
+    perror("sched_setscheduler failed\0");
+  }
+
+  /* Ignore interactive and job-control signals.  */
+  signal(SIGINT, SIG_IGN);
+  signal(SIGQUIT, SIG_IGN);
+  signal(SIGTSTP, SIG_IGN);
+  signal(SIGTTIN, SIG_IGN);
+  signal(SIGTTOU, SIG_IGN);
+  signal(SIGCHLD, SIG_IGN);
+  signal(AGS_THREAD_RESUME_SIG, SIG_IGN);
+  signal(AGS_THREAD_SUSPEND_SIG, SIG_IGN);
+
+  ags_test_sigact.sa_handler = ags_test_signal_handler;
+  sigemptyset(&ags_test_sigact.sa_mask);
+  ags_test_sigact.sa_flags = 0;
+  sigaction(SIGINT, &ags_test_sigact, (struct sigaction *) NULL);
+  sigaction(SA_RESTART, &ags_test_sigact, (struct sigaction *) NULL);
+
+  XInitThreads();
+      
+  /* parse rc file */
+  rc_filename = g_strdup_printf("%s/%s\0",
+				SRCDIR,
+				"gsequencer.share/styles/ags.rc\0");
+  
+  gtk_rc_parse(rc_filename);
+  g_free(rc_filename);
+  
+  /**/
+  LIBXML_TEST_VERSION;
+
+  //ao_initialize();
+
+  //  g_thread_init(NULL);
+  gtk_init(&argc, &argv);
+
+  g_object_set(gtk_settings_get_default(),
+	       "gtk-theme-name\0", "Raleigh\0",
+	       NULL);
+  g_signal_handlers_block_matched(gtk_settings_get_default(),
+				  G_SIGNAL_MATCH_DETAIL,
+				  g_signal_lookup("set-property\0",
+						  GTK_TYPE_SETTINGS),
+				  g_quark_from_string("gtk-theme-name\0"),
+				  NULL,
+				  NULL,
+				  NULL);
+  
+  ipatch_init();
+  //  g_log_set_fatal_mask("GLib-GObject\0", // "Gtk\0" G_LOG_DOMAIN, // 
+		       //		       G_LOG_LEVEL_CRITICAL); // G_LOG_LEVEL_WARNING
+
+  /* animate */
+  animation_thread = (pthread_t *) malloc(sizeof(pthread_t));
+  g_atomic_int_set(&(ags_show_start_animation),
+		   TRUE);
+  
+  ags_test_start_animation(animation_thread);
+  
+  /* initialize the CUnit test registry */
+  if(CUE_SUCCESS != CU_initialize_registry()){
+    return CU_get_error();
+  }
+
+  /* add a suite to the registry */
+  pSuite = CU_add_suite("AgsFuncitonalLineMemberAddAndDestroyTest\0", ags_functional_line_member_add_and_destroy_test_init_suite, ags_functional_line_member_add_and_destroy_test_clean_suite);
+  
+  if(pSuite == NULL){
+    CU_cleanup_registry();
+    
+    return CU_get_error();
+  }
+
+  gtk_init(NULL,
+	   NULL);
+  //  g_log_set_fatal_mask(G_LOG_DOMAIN, // , // "Gtk\0" G_LOG_DOMAIN,"GLib-GObject\0",
+  //		       G_LOG_LEVEL_CRITICAL);
+
+  /* add the tests to the suite */
+  if((CU_add_test(pSuite, "functional test of GSequencer line member add and destroy AgsPanel\0", ags_functional_line_member_add_and_destroy_test_panel) == NULL) ||
+     (CU_add_test(pSuite, "functional test of GSequencer line member add and destroy AgsMixer\0", ags_functional_line_member_add_and_destroy_test_mixer) == NULL) ||
+     (CU_add_test(pSuite, "functional test of GSequencer line member add and destroy AgsDrum\0", ags_functional_line_member_add_and_destroy_test_drum) == NULL) ||
+     (CU_add_test(pSuite, "functional test of GSequencer line member add and destroy AgsMatrix\0", ags_functional_line_member_add_and_destroy_test_matrix) == NULL) ||
+     (CU_add_test(pSuite, "functional test of GSequencer line member add and destroy AgsSynth\0", ags_functional_line_member_add_and_destroy_test_synth) == NULL) ||
+     (CU_add_test(pSuite, "functional test of GSequencer line member add and destroy AgsFFPlayer\0", ags_functional_line_member_add_and_destroy_test_ffplayer) == NULL)){
+    CU_cleanup_registry();
+      
+    return CU_get_error();
+  }
+  
+  /* Run all tests using the CUnit Basic interface */
+  CU_basic_set_mode(CU_BRM_VERBOSE);
+  CU_basic_run_tests();
+  
+  CU_cleanup_registry();
+  
+  return(CU_get_error());
+}
+
diff --git a/ags/test/X/ags_functional_machine_link_test.c b/ags/test/X/ags_functional_machine_link_test.c
new file mode 100644
index 0000000..d996a36
--- /dev/null
+++ b/ags/test/X/ags_functional_machine_link_test.c
@@ -0,0 +1,1601 @@
+/* GSequencer - Advanced GTK Sequencer
+ * Copyright (C) 2005-2017 Joël Krähemann
+ *
+ * This file is part of GSequencer.
+ *
+ * GSequencer is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * GSequencer is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GSequencer.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include <CUnit/CUnit.h>
+#include <CUnit/Basic.h>
+
+#include <ags/libags.h>
+#include <ags/libags-audio.h>
+
+#include <ags/gsequencer_main.h>
+
+#include <ags/test/X/libgsequencer.h>
+
+#include "gsequencer_setup_util.h"
+#include "ags_functional_test_util.h"
+
+int ags_functional_machine_link_test_init_suite();
+int ags_functional_machine_link_test_clean_suite();
+
+void ags_functional_machine_link_test_master_mixer();
+void ags_functional_machine_link_test_slave_mixer();
+void ags_functional_machine_link_test_drum();
+void ags_functional_machine_link_test_matrix();
+void ags_functional_machine_link_test_synth();
+void ags_functional_machine_link_test_ffplayer_0();
+void ags_functional_machine_link_test_ffplayer_1();
+
+void ags_functional_machine_link_test_relink_all();
+void ags_functional_machine_link_test_reset_link_all();
+
+void ags_functional_machine_link_test_destroy_all();
+
+#define AGS_FUNCTIONAL_MACHINE_LINK_TEST_MASTER_MIXER_INPUT_PADS (1)
+
+#define AGS_FUNCTIONAL_MACHINE_LINK_TEST_MATRIX_OUTPUT_PADS (2)
+
+#define AGS_FUNCTIONAL_MACHINE_LINK_TEST_CONFIG "[generic]\n"	\
+  "autosave-thread=false\n"					\
+  "simple-file=true\n"						\
+  "disable-feature=experimental\n"				\
+  "segmentation=4/4\n"						\
+  "\n"								\
+  "[thread]\n"							\
+  "model=super-threaded\n"					\
+  "super-threaded-scope=channel\n"				\
+  "lock-global=ags-thread\n"					\
+  "lock-parent=ags-recycling-thread\n"				\
+  "\n"								\
+  "[soundcard-0]\n"						\
+  "backend=alsa\n"						\
+  "device=hw:0,0\n"						\
+  "samplerate=44100\n"						\
+  "buffer-size=1024\n"						\
+  "pcm-channels=2\n"						\
+  "dsp-channels=2\n"						\
+  "format=16\n"							\
+  "\n"								\
+  "[recall]\n"							\
+  "auto-sense=true\n"						\
+  "\n"
+
+extern AgsApplicationContext *ags_application_context;
+
+extern struct sigaction ags_test_sigact;
+
+extern volatile gboolean ags_show_start_animation;
+
+AgsXorgApplicationContext *xorg_application_context;
+
+AgsGuiThread *gui_thread;
+AgsTaskThread *task_thread;
+
+AgsMachine *panel;
+AgsMachine *master_mixer;
+AgsMachine *slave_mixer;
+AgsMachine *drum;
+AgsMachine *matrix;
+AgsMachine *synth;
+AgsMachine *ffplayer_0;
+AgsMachine *ffplayer_1;
+
+/* The suite initialization function.
+ * Opens the temporary file used by the tests.
+ * Returns zero on success, non-zero otherwise.
+ */
+int
+ags_functional_machine_link_test_init_suite()
+{
+  AgsConfig *config;
+
+  GList *list_start, *list;
+
+  guint nth_machine;
+
+  config = ags_config_get_instance();
+  ags_config_load_from_data(config,
+			    AGS_FUNCTIONAL_MACHINE_LINK_TEST_CONFIG,
+			    strlen(AGS_FUNCTIONAL_MACHINE_LINK_TEST_CONFIG));
+
+  ags_functional_test_util_setup_and_launch();
+
+  /* get gui thread */
+  gui_thread = ags_thread_find_type(ags_application_context->main_loop,
+				    AGS_TYPE_GUI_THREAD);
+
+  /* add panel */
+  ags_functional_test_util_add_machine(NULL,
+				       "Panel");
+
+  /*  */
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  /* retrieve panel */
+  nth_machine = 0;
+
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+
+  if(list != NULL &&
+     AGS_IS_PANEL(list->data)){
+    panel = list->data;
+  }else{
+    panel = NULL;
+  }
+  
+  ags_functional_test_util_machine_hide(nth_machine);
+
+  return(0);
+}
+
+/* The suite cleanup function.
+ * Closes the temporary file used by the tests.
+ * Returns zero on success, non-zero otherwise.
+ */
+int
+ags_functional_machine_link_test_clean_suite()
+{  
+  ags_thread_stop(gui_thread);  
+
+  return(0);
+}
+
+void
+ags_functional_machine_link_test_master_mixer()
+{
+  GtkDialog *properties;
+  
+  GList *list_start, *list;
+  
+  gchar *link_name;
+  
+  guint resize_tab;
+  guint output_tab;
+  guint nth_machine;
+  gboolean success;
+
+  /* add mixer */
+  success = ags_functional_test_util_add_machine(NULL,
+						 "Mixer");
+
+  CU_ASSERT(success == TRUE);
+
+  /*  */
+  gdk_threads_enter();
+  
+  /* retrieve master mixer */
+  nth_machine = 1;
+
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+
+  if(list != NULL &&
+     AGS_IS_MIXER(list->data)){
+    master_mixer = list->data;
+  }else{
+    master_mixer = NULL;
+  }
+  
+  CU_ASSERT(master_mixer != NULL);
+
+  /*
+   * resize input pads
+   */
+  
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click tab */
+  resize_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_RESIZE_TAB;
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_machine,
+								  resize_tab);
+
+  CU_ASSERT(success == TRUE);
+  
+  /* click enable */
+  success = ags_functional_test_util_machine_properties_click_enable(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* resize input */
+  success = ags_functional_test_util_machine_properties_resize_inputs(nth_machine,
+								      AGS_FUNCTIONAL_MACHINE_LINK_TEST_MASTER_MIXER_INPUT_PADS);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response ok */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  properties = AGS_MACHINE(master_mixer)->properties;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(properties);
+
+  CU_ASSERT(success == TRUE);
+
+  /*
+   * link panel with master mixer
+   */
+
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click tab */
+  output_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_OUTPUT_TAB;
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_machine,
+								  output_tab);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click enable */
+  success = ags_functional_test_util_machine_properties_click_enable(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* set link */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  link_name = g_strdup_printf("%s: %s\0",
+			      G_OBJECT_TYPE_NAME(panel),
+			      AGS_MACHINE(panel)->name);
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_machine,
+								 0, 0,
+								 link_name, 0);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_machine,
+								 0, 1,
+								 link_name, 1);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response ok */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  properties = AGS_MACHINE(master_mixer)->properties;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(properties);
+
+  CU_ASSERT(success == TRUE);
+
+  /* hide */
+  success = ags_functional_test_util_machine_hide(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+}
+
+void
+ags_functional_machine_link_test_slave_mixer()
+{
+  GtkDialog *properties;
+  
+  GList *list_start, *list;
+  
+  gchar *link_name;
+  
+  guint resize_tab;
+  guint output_tab;
+  guint nth_machine;
+  gboolean success;
+
+  /* add mixer */
+  success = ags_functional_test_util_add_machine(NULL,
+						 "Mixer");
+
+  CU_ASSERT(success == TRUE);
+
+  /*  */
+  gdk_threads_enter();
+  
+  /* retrieve master mixer */
+  nth_machine = 2;
+
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+
+  if(list != NULL &&
+     AGS_IS_MIXER(list->data)){
+    slave_mixer = list->data;
+  }else{
+    slave_mixer = NULL;
+  }
+  
+  CU_ASSERT(slave_mixer != NULL);
+
+  /*
+   * link master mixer with slave mixer
+   */
+
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click tab */
+  output_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_OUTPUT_TAB;
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_machine,
+								  output_tab);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click enable */
+  success = ags_functional_test_util_machine_properties_click_enable(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* set link */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  link_name = g_strdup_printf("%s: %s\0",
+			      G_OBJECT_TYPE_NAME(master_mixer),
+			      AGS_MACHINE(master_mixer)->name);
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_machine,
+								 0, 0,
+								 link_name, 0);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_machine,
+								 0, 1,
+								 link_name, 1);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response ok */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  properties = AGS_MACHINE(slave_mixer)->properties;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(properties);
+
+  CU_ASSERT(success == TRUE);
+
+  /* hide */
+  success = ags_functional_test_util_machine_hide(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+}
+
+void
+ags_functional_machine_link_test_drum()
+{
+  GtkDialog *properties;
+  
+  GList *list_start, *list;
+  
+  gchar *link_name;
+  
+  guint resize_tab;
+  guint input_tab;
+  guint nth_parent_machine;
+  guint nth_machine;
+  gboolean success;
+
+  /* add drum */
+  success = ags_functional_test_util_add_machine(NULL,
+						 "Drum");
+
+  CU_ASSERT(success == TRUE);
+
+  /*  */
+  gdk_threads_enter();
+  
+  /* retrieve drum */
+  nth_parent_machine = 2;
+  nth_machine = 3;
+
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+
+  if(list != NULL &&
+     AGS_IS_DRUM(list->data)){
+    drum = list->data;
+  }else{
+    drum = NULL;
+  }
+  
+  CU_ASSERT(drum != NULL);
+
+  /*
+   * link slave mixer with drum
+   */
+
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click tab */
+  input_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB;
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine,
+								  input_tab);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click enable */
+  success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* set link */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  link_name = g_strdup_printf("%s: %s\0",
+			      G_OBJECT_TYPE_NAME(drum),
+			      AGS_MACHINE(drum)->name);
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine,
+								 0, 0,
+								 link_name, 0);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine,
+								 0, 1,
+								 link_name, 1);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response ok */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  properties = AGS_MACHINE(slave_mixer)->properties;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(properties);
+
+  CU_ASSERT(success == TRUE);
+
+  /* hide */
+  success = ags_functional_test_util_machine_hide(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+}
+
+void
+ags_functional_machine_link_test_matrix()
+{
+  GtkDialog *properties;
+  
+  GList *list_start, *list;
+  
+  gchar *link_name;
+  
+  guint resize_tab;
+  guint input_tab;
+  guint nth_parent_machine;
+  guint nth_machine;
+  gboolean success;
+
+  /* add matrix */
+  success = ags_functional_test_util_add_machine(NULL,
+						 "Matrix");
+
+  CU_ASSERT(success == TRUE);
+
+  /*  */
+  gdk_threads_enter();
+  
+  /* retrieve matrix */
+  nth_parent_machine = 2;
+  nth_machine = 4;
+
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+
+  if(list != NULL &&
+     AGS_IS_MATRIX(list->data)){
+    matrix = list->data;
+  }else{
+    matrix = NULL;
+  }
+  
+  CU_ASSERT(matrix != NULL);
+
+  /*
+   * resize output pads
+   */
+  
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click tab */
+  resize_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_RESIZE_TAB;
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_machine,
+								  resize_tab);
+
+  CU_ASSERT(success == TRUE);
+  
+  /* click enable */
+  success = ags_functional_test_util_machine_properties_click_enable(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* resize output */
+  success = ags_functional_test_util_machine_properties_resize_outputs(nth_machine,
+								       AGS_FUNCTIONAL_MACHINE_LINK_TEST_MATRIX_OUTPUT_PADS);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response ok */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  properties = AGS_MACHINE(matrix)->properties;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(properties);
+
+  CU_ASSERT(success == TRUE);
+  
+  /*
+   * link slave mixer with matrix
+   */
+
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click tab */
+  input_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB;
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine,
+								  input_tab);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click enable */
+  success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* set link */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  link_name = g_strdup_printf("%s: %s\0",
+			      G_OBJECT_TYPE_NAME(matrix),
+			      AGS_MACHINE(matrix)->name);
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine,
+								 1, 0,
+								 link_name, 0);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine,
+								 1, 1,
+								 link_name, 1);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response ok */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  properties = AGS_MACHINE(slave_mixer)->properties;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(properties);
+
+  CU_ASSERT(success == TRUE);
+
+  /* hide */
+  success = ags_functional_test_util_machine_hide(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+}
+
+void
+ags_functional_machine_link_test_synth()
+{
+  GtkDialog *properties;
+  
+  GList *list_start, *list;
+  
+  gchar *link_name;
+
+  guint input_line_count;
+  guint input_link_tab;
+  guint nth_parent_machine;
+  guint nth_machine;
+  gboolean success;
+
+  /* add synth */
+  success = ags_functional_test_util_add_machine(NULL,
+						 "Synth");
+
+  CU_ASSERT(success == TRUE);
+
+  /*  */
+  gdk_threads_enter();
+  
+  /* retrieve synth */
+  nth_parent_machine = 4;
+  nth_machine = 5;
+
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+
+  if(list != NULL &&
+     AGS_IS_SYNTH(list->data)){
+    synth = list->data;
+  }else{
+    synth = NULL;
+  }
+  
+  CU_ASSERT(synth != NULL);
+
+  /*
+   * link matrix with synth
+   */
+
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click tab */
+  input_link_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_INPUT_TAB;
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine,
+								  input_link_tab);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click enable */
+  success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* set link */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  link_name = g_strdup_printf("%s: %s\0",
+			      G_OBJECT_TYPE_NAME(synth),
+			      AGS_MACHINE(synth)->name);
+
+  input_line_count = matrix->audio->input_lines;  
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_machine_properties_bulk_add(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_bulk_link(nth_parent_machine,
+								  0,
+								  link_name);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_bulk_count(nth_parent_machine,
+								   0,
+								   input_line_count);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response ok */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  properties = AGS_MACHINE(matrix)->properties;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(properties);
+
+  CU_ASSERT(success == TRUE);
+
+  /* hide */
+  success = ags_functional_test_util_machine_hide(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+}
+
+void
+ags_functional_machine_link_test_ffplayer_0()
+{
+  GtkDialog *properties;
+  
+  GList *list_start, *list;
+  
+  gchar *link_name;
+  
+  guint resize_tab;
+  guint input_tab;
+  guint nth_parent_machine;
+  guint nth_machine;
+  gboolean success;
+
+  /* add ffplayer #0 */
+  success = ags_functional_test_util_add_machine(NULL,
+						 "FPlayer");
+
+  CU_ASSERT(success == TRUE);
+
+  /*  */
+  gdk_threads_enter();
+  
+  /* retrieve ffplayer #0 */
+  nth_parent_machine = 2;
+  nth_machine = 6;
+
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+
+  if(list != NULL &&
+     AGS_IS_FFPLAYER(list->data)){
+    ffplayer_0 = list->data;
+  }else{
+    ffplayer_0 = NULL;
+  }
+  
+  CU_ASSERT(ffplayer_0 != NULL);
+
+  /*
+   * link slave mixer with ffplayer #0
+   */
+
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click tab */
+  input_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB;
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine,
+								  input_tab);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click enable */
+  success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* set link */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  link_name = g_strdup_printf("%s: %s\0",
+			      G_OBJECT_TYPE_NAME(ffplayer_0),
+			      AGS_MACHINE(ffplayer_0)->name);
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine,
+								 2, 0,
+								 link_name, 0);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine,
+								 2, 1,
+								 link_name, 1);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response ok */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  properties = AGS_MACHINE(slave_mixer)->properties;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(properties);
+
+  CU_ASSERT(success == TRUE);
+
+  /* hide */
+  success = ags_functional_test_util_machine_hide(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+}
+
+void
+ags_functional_machine_link_test_ffplayer_1()
+{
+  GtkDialog *properties;
+  
+  GList *list_start, *list;
+  
+  gchar *link_name;
+  
+  guint resize_tab;
+  guint input_tab;
+  guint nth_parent_machine;
+  guint nth_machine;
+  gboolean success;
+
+  /* add ffplayer #1 */
+  success = ags_functional_test_util_add_machine(NULL,
+						 "FPlayer");
+
+  CU_ASSERT(success == TRUE);
+
+  /*  */
+  gdk_threads_enter();
+  
+  /* retrieve ffplayer #1 */
+  nth_parent_machine = 2;
+  nth_machine = 7;
+
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+
+  if(list != NULL &&
+     AGS_IS_FFPLAYER(list->data)){
+    ffplayer_1 = list->data;
+  }else{
+    ffplayer_1 = NULL;
+  }
+  
+  CU_ASSERT(ffplayer_1 != NULL);
+
+  /*
+   * link slave mixer with ffplayer #1
+   */
+
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click tab */
+  input_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB;
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine,
+								  input_tab);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click enable */
+  success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* set link */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  link_name = g_strdup_printf("%s: %s\0",
+			      G_OBJECT_TYPE_NAME(ffplayer_1),
+			      AGS_MACHINE(ffplayer_1)->name);
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine,
+								 3, 0,
+								 link_name, 0);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine,
+								 3, 1,
+								 link_name, 1);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response ok */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  properties = AGS_MACHINE(slave_mixer)->properties;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(properties);
+
+  CU_ASSERT(success == TRUE);
+
+  /* hide */
+  success = ags_functional_test_util_machine_hide(nth_machine);
+
+  CU_ASSERT(success == TRUE);
+}
+
+void
+ags_functional_machine_link_test_relink_all()
+{
+  GtkDialog *properties;
+  
+  GList *list_start, *list;
+  
+  gchar *link_name;
+  
+  guint resize_tab;
+  guint input_tab;
+  guint nth_parent_machine;
+  guint nth_machine;
+  gboolean success;  
+
+  /*
+   * relink slave mixer with ffplayer #0
+   */
+
+  /*  */
+  nth_parent_machine = 2;
+  nth_machine = 6;
+
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click tab */
+  input_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB;
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine,
+								  input_tab);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click enable */
+  success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* set link */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  link_name = g_strdup_printf("%s: %s\0",
+			      G_OBJECT_TYPE_NAME(ffplayer_0),
+			      AGS_MACHINE(ffplayer_0)->name);
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine,
+								 7, 0,
+								 link_name, 0);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine,
+								 7, 1,
+								 link_name, 1);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response ok */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  properties = AGS_MACHINE(slave_mixer)->properties;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(properties);
+
+  CU_ASSERT(success == TRUE);
+
+  /*
+   * relink slave mixer with drum
+   */
+
+  /*  */
+  nth_parent_machine = 2;
+  nth_machine = 3;
+
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click tab */
+  input_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB;
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine,
+								  input_tab);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click enable */
+  success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* set link */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  link_name = g_strdup_printf("%s: %s\0",
+			      G_OBJECT_TYPE_NAME(drum),
+			      AGS_MACHINE(drum)->name);
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine,
+								 6, 0,
+								 link_name, 0);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine,
+								 6, 1,
+								 link_name, 1);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response ok */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  properties = AGS_MACHINE(slave_mixer)->properties;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(properties);
+
+  CU_ASSERT(success == TRUE);
+
+  /*
+   * relink slave mixer with matrix
+   */
+  
+  /*  */
+  nth_parent_machine = 2;
+  nth_machine = 4;
+
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click tab */
+  input_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB;
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine,
+								  input_tab);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click enable */
+  success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* set link */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  link_name = g_strdup_printf("%s: %s\0",
+			      G_OBJECT_TYPE_NAME(matrix),
+			      AGS_MACHINE(matrix)->name);
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine,
+								 0, 0,
+								 link_name, 0);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine,
+								 0, 1,
+								 link_name, 1);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response ok */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  properties = AGS_MACHINE(slave_mixer)->properties;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(properties);
+
+  CU_ASSERT(success == TRUE);
+}
+
+void
+ags_functional_machine_link_test_reset_link_all()
+{
+  GtkDialog *properties;
+  
+  GList *list_start, *list;
+  
+  gchar *link_name;
+  
+  guint resize_tab;
+  guint input_tab;
+  guint nth_parent_machine;
+  guint nth_machine;
+  gboolean success;  
+
+  /*
+   * reset link slave mixer with ffplayer #0
+   */
+
+  /*  */
+  nth_parent_machine = 2;
+  nth_machine = 6;
+
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click tab */
+  input_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB;
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine,
+								  input_tab);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click enable */
+  success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* set link */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  link_name = g_strdup_printf("%s: %s\0",
+			      G_OBJECT_TYPE_NAME(ffplayer_0),
+			      AGS_MACHINE(ffplayer_0)->name);
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine,
+								 0, 0,
+								 link_name, 0);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine,
+								 0, 1,
+								 link_name, 1);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response ok */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  properties = AGS_MACHINE(slave_mixer)->properties;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(properties);
+
+  CU_ASSERT(success == TRUE);
+
+  /*
+   * reset link slave mixer with drum
+   */
+
+  /*  */
+  nth_parent_machine = 2;
+  nth_machine = 3;
+
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click tab */
+  input_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB;
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine,
+								  input_tab);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click enable */
+  success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* set link */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  link_name = g_strdup_printf("%s: %s\0",
+			      G_OBJECT_TYPE_NAME(drum),
+			      AGS_MACHINE(drum)->name);
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine,
+								 1, 0,
+								 link_name, 0);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine,
+								 1, 1,
+								 link_name, 1);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response ok */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  properties = AGS_MACHINE(slave_mixer)->properties;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(properties);
+
+  CU_ASSERT(success == TRUE);
+
+  /*
+   * reset link slave mixer with matrix
+   */
+  
+  /*  */
+  nth_parent_machine = 2;
+  nth_machine = 4;
+
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click tab */
+  input_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB;
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine,
+								  input_tab);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click enable */
+  success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* set link */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  link_name = g_strdup_printf("%s: %s\0",
+			      G_OBJECT_TYPE_NAME(matrix),
+			      AGS_MACHINE(matrix)->name);
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine,
+								 1, 0,
+								 link_name, 0);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine,
+								 1, 1,
+								 link_name, 1);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response ok */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  properties = AGS_MACHINE(slave_mixer)->properties;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(properties);
+
+  CU_ASSERT(success == TRUE);
+
+  /*
+   * reset link slave mixer with drum
+   */
+
+  /*  */
+  nth_parent_machine = 2;
+  nth_machine = 3;
+
+  /* open properties */
+  success = ags_functional_test_util_machine_properties_open(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click tab */
+  input_tab = AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB;
+  
+  success = ags_functional_test_util_machine_properties_click_tab(nth_parent_machine,
+								  input_tab);
+
+  CU_ASSERT(success == TRUE);
+
+  /* click enable */
+  success = ags_functional_test_util_machine_properties_click_enable(nth_parent_machine);
+
+  CU_ASSERT(success == TRUE);
+
+  /* set link */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  link_name = g_strdup_printf("%s: %s\0",
+			      G_OBJECT_TYPE_NAME(drum),
+			      AGS_MACHINE(drum)->name);
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine,
+								 2, 0,
+								 link_name, 0);
+
+  CU_ASSERT(success == TRUE);
+
+  success = ags_functional_test_util_machine_properties_link_set(nth_parent_machine,
+								 2, 1,
+								 link_name, 1);
+
+  CU_ASSERT(success == TRUE);
+
+  /* response ok */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  properties = AGS_MACHINE(slave_mixer)->properties;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_dialog_ok(properties);
+
+  CU_ASSERT(success == TRUE);
+}
+
+void
+ags_functional_machine_link_test_destroy_all()
+{
+  gboolean success;
+
+  /* destroy master mixer */
+  success = ags_functional_test_util_machine_destroy(1);
+
+  CU_ASSERT(success == TRUE);
+
+  /* destroy master panel */
+  success = ags_functional_test_util_machine_destroy(0);
+
+  CU_ASSERT(success == TRUE);
+
+  /* destroy matrix */
+  success = ags_functional_test_util_machine_destroy(2);
+
+  CU_ASSERT(success == TRUE);
+
+  /* destroy drum */
+  success = ags_functional_test_util_machine_destroy(1);
+
+  CU_ASSERT(success == TRUE);
+
+  /* destroy slave mixer */
+  success = ags_functional_test_util_machine_destroy(0);
+
+  CU_ASSERT(success == TRUE);
+
+  /* destroy synth */
+  success = ags_functional_test_util_machine_destroy(0);
+
+  CU_ASSERT(success == TRUE);
+
+  /* destroy ffplayer #0 */
+  success = ags_functional_test_util_machine_destroy(0);
+
+  CU_ASSERT(success == TRUE);
+
+  /* destroy ffplayer #1 */
+  success = ags_functional_test_util_machine_destroy(0);
+
+  CU_ASSERT(success == TRUE);
+}
+
+int
+main(int argc, char **argv)
+{
+  CU_pSuite pSuite = NULL;
+
+  AgsConfig *config;
+
+  pthread_t *animation_thread;
+
+  struct sched_param param;
+  struct rlimit rl;
+  struct sigaction sa;
+
+  gchar *rc_filename;
+  
+  int result;
+
+  const rlim_t kStackSize = 64L * 1024L * 1024L;   // min stack size = 64 Mb
+
+#ifdef AGS_USE_TIMER
+  timer_t *timer_id
+#endif
+  
+    putenv("LC_ALL=C\0");
+  putenv("LANG=C\0");
+
+  //  mtrace();
+  atexit(ags_test_signal_cleanup);
+
+  result = getrlimit(RLIMIT_STACK, &rl);
+
+  /* set stack size 64M */
+  if(result == 0){
+    if(rl.rlim_cur < kStackSize){
+      rl.rlim_cur = kStackSize;
+      result = setrlimit(RLIMIT_STACK, &rl);
+
+      if(result != 0){
+	//TODO:JK
+      }
+    }
+  }
+
+  param.sched_priority = GSEQUENCER_RT_PRIORITY;
+      
+  if(sched_setscheduler(0, SCHED_FIFO, &param) == -1) {
+    perror("sched_setscheduler failed\0");
+  }
+
+  /* Ignore interactive and job-control signals.  */
+  signal(SIGINT, SIG_IGN);
+  signal(SIGQUIT, SIG_IGN);
+  signal(SIGTSTP, SIG_IGN);
+  signal(SIGTTIN, SIG_IGN);
+  signal(SIGTTOU, SIG_IGN);
+  signal(SIGCHLD, SIG_IGN);
+  signal(AGS_THREAD_RESUME_SIG, SIG_IGN);
+  signal(AGS_THREAD_SUSPEND_SIG, SIG_IGN);
+
+  ags_test_sigact.sa_handler = ags_test_signal_handler;
+  sigemptyset(&ags_test_sigact.sa_mask);
+  ags_test_sigact.sa_flags = 0;
+  sigaction(SIGINT, &ags_test_sigact, (struct sigaction *) NULL);
+  sigaction(SA_RESTART, &ags_test_sigact, (struct sigaction *) NULL);
+
+  XInitThreads();
+      
+  /* parse rc file */
+  rc_filename = g_strdup_printf("%s/%s\0",
+				SRCDIR,
+				"gsequencer.share/styles/ags.rc\0");
+  
+  gtk_rc_parse(rc_filename);
+  g_free(rc_filename);
+  
+  /**/
+  LIBXML_TEST_VERSION;
+
+  //ao_initialize();
+
+  gdk_threads_enter();
+  //  g_thread_init(NULL);
+  gtk_init(&argc, &argv);
+
+  g_object_set(gtk_settings_get_default(),
+	       "gtk-theme-name\0", "Raleigh\0",
+	       NULL);
+  g_signal_handlers_block_matched(gtk_settings_get_default(),
+				  G_SIGNAL_MATCH_DETAIL,
+				  g_signal_lookup("set-property\0",
+						  GTK_TYPE_SETTINGS),
+				  g_quark_from_string("gtk-theme-name\0"),
+				  NULL,
+				  NULL,
+				  NULL);
+  
+  ipatch_init();
+  //  g_log_set_fatal_mask("GLib-GObject\0", // "Gtk\0" G_LOG_DOMAIN, // 
+  //		       G_LOG_LEVEL_CRITICAL); // G_LOG_LEVEL_WARNING
+
+  /* animate */
+  animation_thread = (pthread_t *) malloc(sizeof(pthread_t));
+  g_atomic_int_set(&(ags_show_start_animation),
+		   TRUE);
+  
+  ags_test_start_animation(animation_thread);
+  
+  /* initialize the CUnit test registry */
+  if(CUE_SUCCESS != CU_initialize_registry()){
+    return CU_get_error();
+  }
+
+  /* add a suite to the registry */
+  pSuite = CU_add_suite("AgsFuncitonalMachineLinkTest\0", ags_functional_machine_link_test_init_suite, ags_functional_machine_link_test_clean_suite);
+  
+  if(pSuite == NULL){
+    CU_cleanup_registry();
+    
+    return CU_get_error();
+  }
+
+  gtk_init(NULL,
+	   NULL);
+  //  g_log_set_fatal_mask(G_LOG_DOMAIN, // , // "Gtk\0" G_LOG_DOMAIN,"GLib-GObject\0",
+  //		       G_LOG_LEVEL_CRITICAL);
+
+  /* add the tests to the suite */
+  if((CU_add_test(pSuite, "functional test of GSequencer machine link master mixer\0", ags_functional_machine_link_test_master_mixer) == NULL) ||
+     (CU_add_test(pSuite, "functional test of GSequencer machine link slave mixer\0", ags_functional_machine_link_test_slave_mixer) == NULL) ||
+     (CU_add_test(pSuite, "functional test of GSequencer machine link drum\0", ags_functional_machine_link_test_drum) == NULL) ||
+     (CU_add_test(pSuite, "functional test of GSequencer machine link matrix\0", ags_functional_machine_link_test_matrix) == NULL) ||
+     (CU_add_test(pSuite, "functional test of GSequencer machine link synth\0", ags_functional_machine_link_test_synth) == NULL) ||
+     (CU_add_test(pSuite, "functional test of GSequencer machine link fplayer #0\0", ags_functional_machine_link_test_ffplayer_0) == NULL) ||
+     (CU_add_test(pSuite, "functional test of GSequencer machine link fplayer #1\0", ags_functional_machine_link_test_ffplayer_1) == NULL) ||
+     (CU_add_test(pSuite, "functional test of GSequencer machine relink all\0", ags_functional_machine_link_test_relink_all) == NULL) ||
+     (CU_add_test(pSuite, "functional test of GSequencer machine reset link all\0", ags_functional_machine_link_test_reset_link_all) == NULL) ||
+    (CU_add_test(pSuite, "functional test of GSequencer machine link destroy all\0", ags_functional_machine_link_test_destroy_all) == NULL)){
+    CU_cleanup_registry();
+      
+    return CU_get_error();
+  }
+  
+  /* Run all tests using the CUnit Basic interface */
+  CU_basic_set_mode(CU_BRM_VERBOSE);
+  CU_basic_run_tests();
+  
+  CU_cleanup_registry();
+  
+  return(CU_get_error());
+}
diff --git a/ags/test/X/ags_functional_note_edit_test.c b/ags/test/X/ags_functional_note_edit_test.c
index dca1940..86b513d 100644
--- a/ags/test/X/ags_functional_note_edit_test.c
+++ b/ags/test/X/ags_functional_note_edit_test.c
@@ -113,9 +113,11 @@ ags_functional_note_edit_test_file_setup()
 {
   GtkButton *play_button;
   GtkButton *stop_button;
-  
+
   AgsGuiThread *gui_thread;
   
+  AgsTaskThread *task_thread;
+  
   struct timespec start_time, current_time;
 
   gchar *start_arg[] = {
@@ -126,40 +128,33 @@ ags_functional_note_edit_test_file_setup()
   gboolean expired;
   gboolean success;
   
-  ags_application_context = NULL;
-
-  ags_test_setup(1, start_arg);
-
-  AGS_APPLICATION_CONTEXT_GET_CLASS(ags_application_context)->quit = ags_functional_note_edit_test_quit_stub;
+  ags_functional_test_util_setup_and_launch_filename(AGS_FUNCTIONAL_NOTE_EDIT_TEST_FILE_SETUP_FILENAME);
 
   /* get gui thread */
   gui_thread = ags_thread_find_type(ags_application_context->main_loop,
 				    AGS_TYPE_GUI_THREAD);
 
+  task_thread = ags_thread_find_type(ags_application_context->main_loop,
+				     AGS_TYPE_TASK_THREAD);
+
   /* get buttons */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
   play_button = AGS_XORG_APPLICATION_CONTEXT(ags_application_context)->window->navigation->play;
   stop_button = AGS_XORG_APPLICATION_CONTEXT(ags_application_context)->window->navigation->stop;
 
-  /* launch application */
-  ags_test_launch_filename(AGS_FUNCTIONAL_NOTE_EDIT_TEST_FILE_SETUP_FILENAME,
-			   FALSE);
+  pthread_mutex_unlock(task_thread->launch_mutex);
 
   /* get initial time */
-  clock_gettime(CLOCK_MONOTONIC, &start_time);
   success = TRUE;
-  
-  /* do the work */
-  while(g_atomic_int_get(&(AGS_XORG_APPLICATION_CONTEXT(ags_application_context)->gui_ready)) == 0){
-    usleep(500000);
-  }
-
-  usleep(10000000);
-  
+    
   for(i = 0; success && i < AGS_FUNCTIONAL_NOTE_EDIT_TEST_FILE_SETUP_PLAYBACK_COUNT; i++){
+    clock_gettime(CLOCK_MONOTONIC, &start_time);
+    
     expired = FALSE;
     
     g_message("start playback");
-    gtk_button_clicked(play_button);
+    ags_functional_test_util_button_click(play_button);
 
     while(!expired){  
       /* check expired */
@@ -171,7 +166,7 @@ ags_functional_note_edit_test_file_setup()
     }
 
     g_message("stop playback");
-    gtk_button_clicked(stop_button);
+    ags_functional_test_util_button_click(stop_button);
 
     /* wait some time before next playback */
     usleep(5000000);
@@ -198,11 +193,9 @@ main(int argc, char **argv)
   struct sched_param param;
   struct rlimit rl;
   struct sigaction sa;
-  struct passwd *pw;
 
   gchar *rc_filename;
   
-  uid_t uid;
   int result;
 
   const rlim_t kStackSize = 64L * 1024L * 1024L;   // min stack size = 64 Mb
@@ -255,13 +248,10 @@ main(int argc, char **argv)
 
   XInitThreads();
   
-  uid = getuid();
-  pw = getpwuid(uid);
-    
   /* parse rc file */
-  rc_filename = g_strdup_printf("gsequencer.share/styles/ags.rc\0",
-				pw->pw_dir,
-				AGS_DEFAULT_DIRECTORY);
+  rc_filename = g_strdup_printf("%s/%s",
+				SRCDIR,
+				"gsequencer.share/styles/ags.rc\0");
   
   gtk_rc_parse(rc_filename);
   g_free(rc_filename);
@@ -271,7 +261,6 @@ main(int argc, char **argv)
 
   //ao_initialize();
 
-  gdk_threads_enter();
   //  g_thread_init(NULL);
   gtk_init(&argc, &argv);
 
diff --git a/ags/test/X/ags_functional_test_util.c b/ags/test/X/ags_functional_test_util.c
index 7cdd3e0..3ffc782 100644
--- a/ags/test/X/ags_functional_test_util.c
+++ b/ags/test/X/ags_functional_test_util.c
@@ -34,6 +34,7 @@
 #include <gdk/gdkevents.h>
 
 #define AGS_FUNCTIONAL_TEST_UTIL_REACTION_TIME (4000)
+#define AGS_FUNCTIONAL_TEST_UTIL_REACTION_TIME_LONG (500000)
 
 extern AgsApplicationContext *ags_application_context;
 
@@ -47,6 +48,11 @@ extern AgsLv2uiManager *ags_lv2ui_manager;
 AgsTaskThread *task_thread;
 AgsGuiThread *gui_thread;
 
+struct timespec ags_functional_test_util_default_timeout = {
+  20,
+  0,
+};
+
 void
 ags_functional_test_util_clear_application_context()
 {  
@@ -92,11 +98,166 @@ ags_functional_test_util_setup_and_launch()
 }
 
 void
+ags_functional_test_util_setup_and_launch_filename(gchar *filename)
+{
+  gchar *start_arg[] = {
+    "./gsequencer\0",
+    "--filename\0",
+    filename,
+  };
+
+  gboolean success;
+
+  ags_functional_test_util_clear_application_context();
+  
+  ags_test_setup(3, start_arg);
+
+  /* get gui thread */
+  gui_thread = ags_thread_find_type(ags_application_context->main_loop,
+				    AGS_TYPE_GUI_THREAD);
+
+  task_thread = ags_thread_find_type(ags_application_context->main_loop,
+				     AGS_TYPE_TASK_THREAD);
+
+  /* launch application */
+  ags_test_launch_filename(filename,
+			   FALSE);
+
+  /* do the work */
+  while(g_atomic_int_get(&(AGS_XORG_APPLICATION_CONTEXT(ags_application_context)->gui_ready)) == 0){
+    usleep(500000);
+  }
+
+  usleep(10000000);
+}
+
+void
+ags_functional_test_util_reaction_time()
+{
+  usleep(AGS_FUNCTIONAL_TEST_UTIL_REACTION_TIME);
+}
+
+void
+ags_functional_test_util_reaction_time_long()
+{
+  usleep(AGS_FUNCTIONAL_TEST_UTIL_REACTION_TIME_LONG);
+}
+
+void
 ags_functional_test_util_idle()
 {
   usleep(5000000);
 }
 
+void
+ags_functional_test_util_idle_condition_and_timeout(AgsFunctionalTestUtilIdleCondition idle_condition,
+						    struct timespec *timeout,
+						    gpointer data)
+{
+  struct timespec start_time, current_time;
+
+  clock_gettime(CLOCK_MONOTONIC,
+		&start_time);
+  
+  while(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(idle_condition)(data)){
+    ags_functional_test_util_reaction_time();
+
+    clock_gettime(CLOCK_MONOTONIC,
+		  &current_time);
+
+    if(start_time.tv_sec + timeout->tv_sec < current_time.tv_sec){
+      break;
+    }
+  }
+
+  ags_functional_test_util_reaction_time();
+}
+
+gboolean
+ags_functional_test_util_idle_test_widget_visible(GtkWidget **widget)
+{
+  gboolean do_idle;
+
+  do_idle = TRUE;
+  
+  gdk_threads_enter();
+  
+  if(*widget != NULL &&
+     GTK_IS_WIDGET(*widget) &&
+     GTK_WIDGET_VISIBLE(*widget)){
+    do_idle = FALSE;
+  }
+
+  gdk_threads_leave();
+  
+  return(do_idle);
+}
+
+gboolean
+ags_functional_test_util_idle_test_widget_hidden(GtkWidget **widget)
+{
+  gboolean do_idle;
+
+  do_idle = TRUE;
+  
+  gdk_threads_enter();
+  
+  if(*widget != NULL &&
+     GTK_IS_WIDGET(*widget) &&
+     !GTK_WIDGET_VISIBLE(*widget)){
+    do_idle = FALSE;
+  }
+
+  gdk_threads_leave();
+  
+  return(do_idle);
+}
+
+gboolean
+ags_functional_test_util_idle_test_null(GtkWidget **widget)
+{
+  gboolean do_idle;
+
+  do_idle = TRUE;
+  
+  gdk_threads_enter();
+  
+  if(*widget == NULL){
+    do_idle = FALSE;
+  }
+
+  gdk_threads_leave();
+  
+  return(do_idle);
+}
+
+gboolean
+ags_functional_test_util_idle_test_container_children_count(AgsFunctionalTestUtilContainerTest *container_test)
+{
+  gboolean do_idle;
+
+  do_idle = TRUE;
+  
+  gdk_threads_enter();
+
+  if(*(container_test->container) != NULL &&
+     GTK_IS_CONTAINER(*(container_test->container))){
+    GList *list;
+
+    list = gtk_container_get_children(*(container_test->container));
+    
+    if(g_list_length(list) == container_test->count){
+      do_idle = FALSE;
+    }
+
+    g_list_free(list);
+  }
+
+  gdk_threads_leave();
+  
+  return(do_idle);
+}
+
 GtkMenu*
 ags_functional_test_util_submenu_find(GtkMenu *menu,
 				      gchar *item_label)
@@ -213,7 +374,7 @@ ags_functional_test_util_menu_bar_click(gchar *item_label)
 	pthread_mutex_unlock(task_thread->launch_mutex);
 
 	/*  */
-	usleep(AGS_FUNCTIONAL_TEST_UTIL_REACTION_TIME);
+	ags_functional_test_util_reaction_time();
 
 	gdk_test_simulate_button(window,
 				 x + 5,
@@ -222,7 +383,7 @@ ags_functional_test_util_menu_bar_click(gchar *item_label)
 				 GDK_BUTTON1_MASK,
 				 GDK_BUTTON_PRESS);
 
-	usleep(AGS_FUNCTIONAL_TEST_UTIL_REACTION_TIME);
+	ags_functional_test_util_reaction_time();
 
 	gdk_test_simulate_button(window,
 				 x + 5,
@@ -231,7 +392,7 @@ ags_functional_test_util_menu_bar_click(gchar *item_label)
 				 GDK_BUTTON1_MASK,
 				 GDK_BUTTON_RELEASE);
 
-	usleep(AGS_FUNCTIONAL_TEST_UTIL_REACTION_TIME);
+	ags_functional_test_util_reaction_time();
 
 	/*  */
 	pthread_mutex_lock(task_thread->launch_mutex);
@@ -252,7 +413,7 @@ ags_functional_test_util_menu_bar_click(gchar *item_label)
 
   g_list_free(list_start);
 
-  ags_functional_test_util_idle();
+  ags_functional_test_util_reaction_time_long();
   
   return(success);
 }
@@ -315,7 +476,7 @@ ags_functional_test_util_menu_click(GtkMenu *menu,
 
 	pthread_mutex_unlock(task_thread->launch_mutex);
 
-	usleep(AGS_FUNCTIONAL_TEST_UTIL_REACTION_TIME);
+	ags_functional_test_util_reaction_time();
 	
 	gdk_test_simulate_button(window,
 				 x + 5,
@@ -325,7 +486,7 @@ ags_functional_test_util_menu_click(GtkMenu *menu,
 				 GDK_BUTTON_PRESS);
 
 
-	usleep(AGS_FUNCTIONAL_TEST_UTIL_REACTION_TIME);
+	ags_functional_test_util_reaction_time();
 
 	gdk_test_simulate_button(window,
 				 x + 5,
@@ -334,7 +495,7 @@ ags_functional_test_util_menu_click(GtkMenu *menu,
 				 GDK_BUTTON1_MASK,
 				 GDK_BUTTON_RELEASE);
   	
-	usleep(AGS_FUNCTIONAL_TEST_UTIL_REACTION_TIME);
+	ags_functional_test_util_reaction_time();
 
 	success = TRUE;
 
@@ -355,12 +516,82 @@ ags_functional_test_util_menu_click(GtkMenu *menu,
 
   g_list_free(list_start);
 
-  ags_functional_test_util_idle();
+  ags_functional_test_util_reaction_time_long();
   
   return(success);
 }
 
 gboolean
+ags_functional_test_util_combo_box_click(GtkComboBox *combo_box,
+					 guint nth)
+{
+  GtkWidget *widget;
+
+  GdkWindow *window;
+  
+  gint x, y;
+  gint origin_x, origin_y;	
+  
+  if(combo_box == NULL ||
+     !GTK_IS_COMBO_BOX(combo_box)){
+    return(FALSE);
+  }
+
+  widget = combo_box;
+  
+  /*  */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  window = gtk_widget_get_window(widget);
+
+  x = widget->allocation.x;
+  y = widget->allocation.y;
+
+  gdk_window_get_origin(window, &origin_x, &origin_y);
+
+  gdk_display_warp_pointer(gtk_widget_get_display(widget),
+			   gtk_widget_get_screen(widget),
+			   origin_x + x + 15, origin_y + y + 5);
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  /*
+  ags_functional_test_util_reaction_time();
+	
+  gdk_test_simulate_button(window,
+			   x + 5,
+			   y + 5,
+			   1,
+			   GDK_BUTTON1_MASK,
+			   GDK_BUTTON_PRESS);
+
+
+  ags_functional_test_util_reaction_time();
+
+  gdk_test_simulate_button(window,
+			   x + 5,
+			   y + 5,
+			   1,
+			   GDK_BUTTON1_MASK,
+			   GDK_BUTTON_RELEASE);
+  	
+  ags_functional_test_util_reaction_time();
+  */
+  
+  /*  */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  gtk_combo_box_set_active(combo_box,
+			   nth);
+	
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  ags_functional_test_util_reaction_time_long();
+  
+  return(TRUE);
+}
+
+gboolean
 ags_functional_test_util_button_click(GtkButton *button)
 {
   GtkWidget *widget;
@@ -394,7 +625,7 @@ ags_functional_test_util_button_click(GtkButton *button)
   pthread_mutex_unlock(task_thread->launch_mutex);
 
   /*  */
-  usleep(AGS_FUNCTIONAL_TEST_UTIL_REACTION_TIME);
+  ags_functional_test_util_reaction_time();
 	
   gdk_test_simulate_button(window,
 			   x + 5,
@@ -404,7 +635,7 @@ ags_functional_test_util_button_click(GtkButton *button)
 			   GDK_BUTTON_PRESS);
 
 
-  usleep(AGS_FUNCTIONAL_TEST_UTIL_REACTION_TIME);
+  ags_functional_test_util_reaction_time();
 
   gdk_test_simulate_button(window,
 			   x + 5,
@@ -413,9 +644,9 @@ ags_functional_test_util_button_click(GtkButton *button)
 			   GDK_BUTTON1_MASK,
 			   GDK_BUTTON_RELEASE);
   	
-  usleep(AGS_FUNCTIONAL_TEST_UTIL_REACTION_TIME);
+  ags_functional_test_util_reaction_time();
 
-  ags_functional_test_util_idle();
+  ags_functional_test_util_reaction_time_long();
   
   return(TRUE);
 }
@@ -452,7 +683,7 @@ ags_functional_test_util_menu_tool_button_click(GtkButton *button)
 
   pthread_mutex_unlock(task_thread->launch_mutex);
 
-  usleep(AGS_FUNCTIONAL_TEST_UTIL_REACTION_TIME);
+  ags_functional_test_util_reaction_time();
 	
   gdk_test_simulate_button(window,
 			   x + 5,
@@ -462,7 +693,7 @@ ags_functional_test_util_menu_tool_button_click(GtkButton *button)
 			   GDK_BUTTON_PRESS);
 
 
-  usleep(AGS_FUNCTIONAL_TEST_UTIL_REACTION_TIME);
+  ags_functional_test_util_reaction_time();
 
   gdk_test_simulate_button(window,
 			   x + 5,
@@ -471,7 +702,7 @@ ags_functional_test_util_menu_tool_button_click(GtkButton *button)
 			   GDK_BUTTON1_MASK,
 			   GDK_BUTTON_RELEASE);
   	
-  usleep(AGS_FUNCTIONAL_TEST_UTIL_REACTION_TIME);
+  ags_functional_test_util_reaction_time_long();
 
   /*  */
   pthread_mutex_lock(task_thread->launch_mutex);
@@ -496,7 +727,7 @@ ags_functional_test_util_menu_tool_button_click(GtkButton *button)
   
   pthread_mutex_unlock(task_thread->launch_mutex);
 
-  ags_functional_test_util_idle();
+  ags_functional_test_util_reaction_time_long();
   
   return(TRUE);
 }
@@ -515,7 +746,7 @@ ags_functional_test_util_dialog_apply(GtkDialog *dialog)
 
   pthread_mutex_unlock(task_thread->launch_mutex);
 
-  ags_functional_test_util_idle();
+  ags_functional_test_util_reaction_time_long();
   
   return(TRUE);
 }
@@ -623,7 +854,7 @@ ags_functional_test_util_file_chooser_open_path(GtkFileChooser *file_chooser,
 
   pthread_mutex_unlock(task_thread->launch_mutex);
 
-  ags_functional_test_util_idle();
+  ags_functional_test_util_reaction_time_long();
   
   return(TRUE);
 }
@@ -645,7 +876,7 @@ ags_functional_test_util_file_chooser_select_filename(GtkFileChooser *file_choos
 
   pthread_mutex_unlock(task_thread->launch_mutex);
 
-  ags_functional_test_util_idle();
+  ags_functional_test_util_reaction_time_long();
   
   return(TRUE);
 }
@@ -671,7 +902,7 @@ ags_functional_test_util_file_chooser_select_filenames(GtkFileChooser *file_choo
   
   pthread_mutex_unlock(task_thread->launch_mutex);
 
-  ags_functional_test_util_idle();
+  ags_functional_test_util_reaction_time_long();
   
   return(TRUE); 
 }
@@ -690,12 +921,68 @@ ags_functional_test_util_file_chooser_select_all(GtkFileChooser *file_chooser)
   
   pthread_mutex_unlock(task_thread->launch_mutex);
 
-  ags_functional_test_util_idle();
+  ags_functional_test_util_reaction_time_long();
   
   return(TRUE); 
 }
 
 gboolean
+ags_functional_test_util_file_default_window_resize()
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
+
+  pthread_mutex_lock(task_thread->launch_mutex);
+    
+  xorg_application_context = ags_application_context_get_instance();
+  window = xorg_application_context->window;
+
+  gdk_window_move_resize(gtk_widget_get_window(window),
+			 64, 0,
+			 1920 - 128, 1080 - 64);
+    
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  ags_functional_test_util_reaction_time_long();
+
+  return(TRUE);
+}
+
+gboolean
+ags_functional_test_util_file_default_editor_resize()
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
+  AgsEditor *editor;
+
+  GtkPaned *main_paned;
+  GtkPaned *editor_paned;
+  
+  GdkRectangle allocation;
+  
+  pthread_mutex_lock(task_thread->launch_mutex);
+    
+  xorg_application_context = ags_application_context_get_instance();
+  window = xorg_application_context->window;
+  editor = window->editor;
+
+  main_paned = window->paned;
+  editor_paned = editor->paned;
+
+  gtk_paned_set_position(main_paned,
+			 (1080 - 64) * (2.0 / 3.0));
+
+  gtk_paned_set_position(editor_paned,
+			 (1920 - 128) / 6);
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  ags_functional_test_util_reaction_time_long();
+
+  return(TRUE);
+}
+
+gboolean
 ags_functional_test_util_open()
 {
   AgsXorgApplicationContext *xorg_application_context;
@@ -718,7 +1005,7 @@ ags_functional_test_util_open()
 
   pthread_mutex_unlock(task_thread->launch_mutex);
 
-  ags_functional_test_util_idle();
+  ags_functional_test_util_reaction_time_long();
   
   return(success); 
 }
@@ -746,7 +1033,7 @@ ags_functional_test_util_save()
 
   pthread_mutex_unlock(task_thread->launch_mutex);
 
-  ags_functional_test_util_idle();
+  ags_functional_test_util_reaction_time_long();
   
   return(success); 
 }
@@ -774,7 +1061,7 @@ ags_functional_test_util_save_as()
   
   pthread_mutex_unlock(task_thread->launch_mutex);
   
-  ags_functional_test_util_idle();
+  ags_functional_test_util_reaction_time_long();
   
   return(success); 
 }
@@ -783,7 +1070,8 @@ gboolean
 ags_functional_test_util_export_open()
 {
   AgsXorgApplicationContext *xorg_application_context;
-
+  GtkWidget *export_window;
+  
   GtkMenu *menu;
   
   gboolean success;
@@ -796,13 +1084,18 @@ ags_functional_test_util_export_open()
     
   xorg_application_context = ags_application_context_get_instance();
   menu = xorg_application_context->window->menu_bar->file;
+
+  export_window = xorg_application_context->window->export_window;
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
   
   success = ags_functional_test_util_menu_click(menu,
 						"export\0");
-
-  pthread_mutex_unlock(task_thread->launch_mutex);
   
-  ags_functional_test_util_idle();
+  ags_functional_test_util_reaction_time_long();
+  ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_widget_visible),
+						      &ags_functional_test_util_default_timeout,
+						      &export_window);
   
   return(success); 
 }
@@ -811,21 +1104,23 @@ gboolean
 ags_functional_test_util_export_close()
 {
   AgsXorgApplicationContext *xorg_application_context;
-
-  GtkDialog *dialog;
+  GtkWidget *export_window;
   
   gboolean success;
 
   pthread_mutex_lock(task_thread->launch_mutex);
 
   xorg_application_context = ags_application_context_get_instance();
-  dialog = xorg_application_context->window->export_window;
+  export_window = xorg_application_context->window->export_window;
 
   pthread_mutex_unlock(task_thread->launch_mutex);
 
-  success = ags_functional_test_util_dialog_close(dialog);
+  success = ags_functional_test_util_dialog_close(export_window);
   
-  ags_functional_test_util_idle();
+  ags_functional_test_util_reaction_time_long();
+  ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_widget_hidden),
+						      &ags_functional_test_util_default_timeout,
+						      &export_window);
   
   return(success); 
 }
@@ -837,6 +1132,10 @@ ags_funcitonal_test_util_export_add()
   AgsExportWindow *export_window;
   GtkButton *add_button;
 
+  AgsFunctionalTestUtilContainerTest container_test;
+
+  GList *list_start;
+  
   gboolean success;
   
   pthread_mutex_lock(task_thread->launch_mutex);
@@ -846,9 +1145,20 @@ ags_funcitonal_test_util_export_add()
 
   add_button = export_window->add;
 
+  container_test.container = &(export_window->export_soundcard);
+
+  list_start = gtk_container_get_children(export_window->export_soundcard);
+
+  container_test.count = g_list_length(list_start) + 1;
+  
   pthread_mutex_unlock(task_thread->launch_mutex);
 
+  g_list_free(list_start);
+  
   success = ags_functional_test_util_button_click(add_button);
+  ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_container_children_count),
+						      &ags_functional_test_util_default_timeout,
+						      &container_test);
   
   return(success);
 }
@@ -870,7 +1180,7 @@ ags_funcitonal_test_util_export_tact(gdouble tact)
 
   pthread_mutex_unlock(task_thread->launch_mutex);
 
-  ags_functional_test_util_idle();
+  ags_functional_test_util_reaction_time_long();
   
   return(TRUE);
 }
@@ -882,9 +1192,12 @@ ags_funcitonal_test_util_export_remove(guint nth)
 
   AgsExportWindow *export_window;
 
-  GList *list_start, *list;
   GtkButton *remove_button;
-  
+
+  AgsFunctionalTestUtilContainerTest container_test;
+
+  GList *list_start, *list;
+
   guint i;
   gboolean success;
   
@@ -893,42 +1206,54 @@ ags_funcitonal_test_util_export_remove(guint nth)
   xorg_application_context = ags_application_context_get_instance();
   export_window = xorg_application_context->window->export_window;
 
-  remove_button = NULL;
-  
-  list_start =
-    list = gtk_container_get_children(export_window->export_soundcard);
+  container_test.container = &(export_window->export_soundcard);
+
+  list_start = gtk_container_get_children(export_window->export_soundcard);
 
   success = FALSE;
 
-  for(i = 0; list != NULL; i++){
-    if(i == nth){
-      GtkHBox *hbox;
+  if(list_start != NULL){
+    remove_button = NULL;
+  
+    list = list_start;
+
+    container_test.count = g_list_length(list_start) - 1;
+
+    for(i = 0; list != NULL; i++){
+      if(i == nth){
+	GtkHBox *hbox;
       
-      GList *tmp_start;
+	GList *tmp_start;
       
-      hbox = GTK_HBOX(list->data);
-      tmp_start = gtk_container_get_children(hbox);
+	hbox = GTK_HBOX(list->data);
+	tmp_start = gtk_container_get_children(hbox);
 
-      remove_button = gtk_bin_get_child(tmp_start->next->data);
-      g_list_free(tmp_start);
+	remove_button = gtk_bin_get_child(tmp_start->next->data);
+	g_list_free(tmp_start);
 
-      success = TRUE;
+	success = TRUE;
       
-      break;
+	break;
+      }
+
+      list = list->next;
     }
 
-    list = list->next;
-  }
-
-  g_list_free(list_start);
+    g_list_free(list_start);
   
-  pthread_mutex_unlock(task_thread->launch_mutex);
+    pthread_mutex_unlock(task_thread->launch_mutex);
 
-  if(!success){
-    return(FALSE);
-  }
+    g_list_free(list);
   
-  success = ags_functional_test_util_button_click(remove_button);
+    if(!success){
+      return(FALSE);
+    }
+    
+    success = ags_functional_test_util_button_click(remove_button);
+    ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_container_children_count),
+							&ags_functional_test_util_default_timeout,
+							&container_test);
+  }  
   
   return(success);
 }
@@ -1005,7 +1330,7 @@ ags_funcitonal_test_util_export_set_backend(guint nth,
   
   pthread_mutex_unlock(task_thread->launch_mutex);
 
-  ags_functional_test_util_idle();
+  ags_functional_test_util_reaction_time_long();
   
   return(success);
 }
@@ -1082,7 +1407,7 @@ ags_funcitonal_test_util_export_set_device(guint nth,
 
   pthread_mutex_unlock(task_thread->launch_mutex);
   
-  ags_functional_test_util_idle();
+  ags_functional_test_util_reaction_time_long();
   
   return(success);
 }
@@ -1137,7 +1462,7 @@ ags_funcitonal_test_util_export_set_filename(guint nth,
 
   pthread_mutex_unlock(task_thread->launch_mutex);
   
-  ags_functional_test_util_idle();
+  ags_functional_test_util_reaction_time_long();
   
   return(success);
 }
@@ -1173,10 +1498,15 @@ ags_functional_test_util_add_machine(gchar *submenu,
 				     gchar *machine_name)
 {
   AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
   AgsMenuBar *menu_bar;
   
   GtkMenu *add_menu;
 
+  GList *list_start;
+  
+  AgsFunctionalTestUtilContainerTest container_test;
+
   gboolean success;
   
   if(machine_name == NULL){
@@ -1190,10 +1520,17 @@ ags_functional_test_util_add_machine(gchar *submenu,
   gdk_threads_enter();
   
   xorg_application_context = ags_application_context_get_instance();
-  menu_bar = xorg_application_context->window->menu_bar;
+
+  window = xorg_application_context->window;
+  menu_bar = window->menu_bar;
+
+  container_test.container = &(window->machines);
+  list_start = gtk_container_get_children(window->machines);
 
   gdk_threads_leave();
 
+  container_test.count = g_list_length(list_start) + 1;
+  
   success = FALSE;
   
   success = ags_functional_test_util_menu_click(menu_bar->edit,
@@ -1219,8 +1556,13 @@ ags_functional_test_util_add_machine(gchar *submenu,
 						  machine_name);    
   }
 
-  ags_functional_test_util_idle();
-  
+  if(success){
+    ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_container_children_count),
+							&ags_functional_test_util_default_timeout,
+							&container_test);
+    ags_functional_test_util_reaction_time_long();
+  }
+
   return(success);
 }
 
@@ -1341,334 +1683,2748 @@ ags_functional_test_util_navigation_exclude_sequencers()
 gboolean
 ags_functional_test_util_toolbar_cursor_click()
 {
-  //TODO:JK: 
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
+  AgsEditor *editor;
+  AgsToolbar *toolbar;
+  
+  GtkButton *position;
+
+  gboolean success;
+  
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  window = xorg_application_context->window;
+  editor = window->editor;
+  toolbar = editor->toolbar;
+
+  position = toolbar->position;
+  
+  gdk_threads_leave();
+
+  success = ags_functional_test_util_button_click(position);
+
+  return(success);
 }
 
 gboolean
 ags_functional_test_util_toolbar_edit_click()
 {
-  //TODO:JK: 
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
+  AgsEditor *editor;
+  AgsToolbar *toolbar;
+  
+  GtkButton *edit;
+
+  gboolean success;
+  
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  window = xorg_application_context->window;
+  editor = window->editor;
+  toolbar = editor->toolbar;
+
+  edit = toolbar->edit;
+  
+  gdk_threads_leave();
+
+  success = ags_functional_test_util_button_click(edit);
+
+  return(success);
 }
 
 gboolean
 ags_functional_test_util_toolbar_delete_click()
 {
-  //TODO:JK: 
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
+  AgsEditor *editor;
+  AgsToolbar *toolbar;
+  
+  GtkButton *clear;
+
+  gboolean success;
+  
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  window = xorg_application_context->window;
+  editor = window->editor;
+  toolbar = editor->toolbar;
+
+  clear = toolbar->clear;
+  
+  gdk_threads_leave();
+
+  success = ags_functional_test_util_button_click(clear);
+
+  return(success);
 }
 
 gboolean
 ags_functional_test_util_toolbar_select_click()
 {
-  //TODO:JK: 
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
+  AgsEditor *editor;
+  AgsToolbar *toolbar;
+  
+  GtkButton *select;
+
+  gboolean success;
+  
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  window = xorg_application_context->window;
+  editor = window->editor;
+  toolbar = editor->toolbar;
+
+  select = toolbar->select;
+  
+  gdk_threads_leave();
+
+  success = ags_functional_test_util_button_click(select);
+
+  return(success);
 }
 
 gboolean
 ags_functional_test_util_toolbar_invert_click()
 {
-  //TODO:JK: 
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
+  AgsEditor *editor;
+  AgsToolbar *toolbar;
+  
+  GtkButton *invert;
+
+  gboolean success;
+  
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  window = xorg_application_context->window;
+  editor = window->editor;
+  toolbar = editor->toolbar;
+
+  invert = toolbar->invert;
+  
+  gdk_threads_leave();
+
+  success = ags_functional_test_util_button_click(invert);
+
+  return(success);
 }
 
 gboolean
 ags_functional_test_util_toolbar_paste_click()
 {
-  //TODO:JK: 
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
+  AgsEditor *editor;
+  AgsToolbar *toolbar;
+  
+  GtkButton *paste;
+
+  gboolean success;
+  
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  window = xorg_application_context->window;
+  editor = window->editor;
+  toolbar = editor->toolbar;
+
+  paste = toolbar->paste;
+  
+  gdk_threads_leave();
+
+  success = ags_functional_test_util_button_click(paste);
+
+  return(success);
 }
 
 gboolean
 ags_functional_test_util_toolbar_copy_click()
 {
-  //TODO:JK: 
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
+  AgsEditor *editor;
+  AgsToolbar *toolbar;
+  
+  GtkButton *copy;
+
+  gboolean success;
+  
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  window = xorg_application_context->window;
+  editor = window->editor;
+  toolbar = editor->toolbar;
+
+  copy = toolbar->copy;
+  
+  gdk_threads_leave();
+
+  success = ags_functional_test_util_button_click(copy);
+
+  return(success);
 }
 
 gboolean
 ags_functional_test_util_toolbar_cut_click()
 {
-  //TODO:JK: 
-}
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
+  AgsEditor *editor;
+  AgsToolbar *toolbar;
+  
+  GtkButton *cut;
 
-gboolean
-ags_functional_test_util_toolbar_zoom(guint nth_zoom)
-{
-  //TODO:JK: 
-}
+  gboolean success;
+  
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
 
-gboolean
-ags_functional_test_util_machine_selector_select(guint nth_machine)
-{
-  //TODO:JK: 
-}
+  window = xorg_application_context->window;
+  editor = window->editor;
+  toolbar = editor->toolbar;
 
-gboolean
-ags_functional_test_util_machine_selection_select(guint nth_machine)
-{
-  //TODO:JK: 
-}
+  cut = toolbar->cut;
+  
+  gdk_threads_leave();
 
-gboolean
-ags_functional_test_util_machine_selection_remove_index()
-{
-  //TODO:JK: 
-}
+  success = ags_functional_test_util_button_click(cut);
 
-gboolean
-ags_functional_test_util_machine_selection_add_index()
-{
-  //TODO:JK: 
+  return(success);
 }
 
 gboolean
-ags_functional_test_util_machine_selection_link_index()
+ags_functional_test_util_toolbar_zoom(guint nth_zoom)
 {
-  //TODO:JK: 
-}
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
+  AgsEditor *editor;
+  AgsToolbar *toolbar;
+  
+  GtkComboBox *zoom;
 
-gboolean
-ags_functional_test_util_machine_selection_reverse_mapping()
-{
-  //TODO:JK: 
-}
+  gboolean success;
+  
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
 
-gboolean
-ags_functional_test_util_machine_selection_shift_piano(guint nth_shift)
-{
-  //TODO:JK: 
-}
+  window = xorg_application_context->window;
+  editor = window->editor;
+  toolbar = editor->toolbar;
 
-gboolean
-ags_functional_test_util_pattern_edit_delete_point(guint nth_index,
-						   guint x,
-						   guint y)
-{
-  //TODO:JK: 
-}
+  zoom = toolbar->zoom;
+  
+  gdk_threads_leave();
 
-gboolean
-ags_functional_test_util_pattern_edit_add_point(guint nth_index,
-						guint x,
-						guint y)
-{
-  //TODO:JK: 
-}
+  success = ags_functional_test_util_combo_box_click(zoom,
+						     nth_zoom);
 
-gboolean
-ags_functional_test_util_pattern_edit_select_region(guint nth_index,
-						    guint x0, guint x1,
-						    guint y0, guint y1)
-{
-  //TODO:JK: 
+  return(success);
 }
 
 gboolean
-ags_functional_test_util_note_edit_delete_point(guint nth_index,
-						guint x,
-						guint y)
+ags_functional_test_util_machine_selector_select(guint nth_index)
 {
-  //TODO:JK: 
-}
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
+  AgsEditor *editor;
+  AgsMachineSelector *machine_selector;
+  AgsMachineRadioButton *machine_radio_button;
+  
+  GList *list_start, *list;
+  
+  gboolean success;
 
-gboolean
-ags_functional_test_util_note_edit_add_point(guint nth_index,
-					     guint x0, guint x1,
-					     guint y)
-{
-  //TODO:JK: 
-}
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
 
-gboolean
-ags_functional_test_util_note_edit_select_region(guint nth_index,
-						 guint x0, guint x1,
-						 guint y0, guint y1)
-{
-  //TODO:JK: 
-}
+  window = xorg_application_context->window;
+  editor = window->editor;
+  machine_selector = editor->machine_selector;
+  
+  list_start = gtk_container_get_children(machine_selector);
 
-gboolean
-ags_functional_test_util_automation_toolbar_cursor_click()
-{
-  //TODO:JK: 
-}
+  gdk_threads_leave();
 
-gboolean
-ags_functional_test_util_automation_toolbar_edit_click()
-{
-  //TODO:JK: 
-}
+  list = g_list_nth(list_start,
+		    nth_index + 1);
+  
+  if(list == NULL){
+    return(FALSE);
+  }
 
-gboolean
-ags_functional_test_util_automation_toolbar_delete_click()
-{
-  //TODO:JK: 
+  machine_radio_button = list->data;
+  g_list_free(list_start);
+  
+  success = ags_functional_test_util_button_click(machine_radio_button);
+
+  ags_functional_test_util_reaction_time_long();  
+
+  return(success);
 }
 
 gboolean
-ags_functional_test_util_automation_toolbar_select_click()
+ags_functional_test_util_machine_selection_select(gchar *machine)
 {
-  //TODO:JK: 
-}
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
+  AgsEditor *editor;
+  AgsMachineSelector *machine_selector;
+  AgsMachineSelection *machine_selection;
 
-gboolean
-ags_functional_test_util_automation_toolbar_paste_click()
-{
-  //TODO:JK: 
-}
+  GtkRadioButton *radio_button;
+  
+  GList *list_start, *list;
+  
+  gboolean success;
+  
+  if(machine == NULL){
+    return(FALSE);
+  }
 
-gboolean
-ags_functional_test_util_automation_toolbar_copy_click()
-{
-  //TODO:JK: 
-}
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
 
-gboolean
-ags_functional_test_util_automation_toolbar_cut_click()
-{
-  //TODO:JK: 
-}
+  window = xorg_application_context->window;
+  editor = window->editor;
+  machine_selector = editor->machine_selector;
+  machine_selection = machine_selector->machine_selection;
 
-gboolean
-ags_functional_test_util_automation_toolbar_zoom(guint nth_zoom)
-{
-  //TODO:JK: 
-}
+  list = 
+    list_start = gtk_container_get_children(GTK_DIALOG(machine_selection)->vbox);
 
-gboolean
-ags_functional_test_util_automation_edit_audio_click()
-{
-  //TODO:JK: 
-}
+  success = FALSE;
 
-gboolean
-ags_functional_test_util_automation_edit_output_click()
-{
-  //TODO:JK: 
-}
+  while(list != NULL){
+    if(GTK_IS_RADIO_BUTTON(list->data)){
+      gchar *str;
 
-gboolean
-ags_functional_test_util_automation_edit_input_click()
-{
-  //TODO:JK: 
-}
+      str = gtk_button_get_label(GTK_BUTTON(list->data));
+    
+      if(!g_ascii_strcasecmp(machine,
+			     str)){
+	radio_button = list->data;
+	
+	success = TRUE;
 
-gboolean
-ags_functional_test_util_automation_edit_delete_point(guint nth_index,
-						      guint x,
-						      guint y)
-{
-  //TODO:JK: 
+	break;
+      }
+    }
+    
+    list = list->next;
+  }
+  
+  gdk_threads_leave();
+
+  g_list_free(list_start);
+
+  if(!success){
+    return(FALSE);
+  }
+  
+  success = ags_functional_test_util_button_click(radio_button);
+
+  ags_functional_test_util_reaction_time_long();  
+
+  return(success);
 }
 
 gboolean
-ags_functional_test_util_automation_edit_add_point(guint nth_index,
-						   guint x,
-						   guint y)
+ags_functional_test_util_machine_selection_remove_index()
 {
-  //TODO:JK: 
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
+  AgsEditor *editor;
+  AgsMachineSelector *machine_selector;
+  
+  GtkButton *menu_tool_button;
+  GtkMenu *popup;
+  
+  gboolean success;
+  
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  window = xorg_application_context->window;
+  editor = window->editor;
+  machine_selector = editor->machine_selector;
+  
+  menu_tool_button = machine_selector->menu_button;
+  popup = machine_selector->popup;
+  
+  gdk_threads_leave();
+
+  success = ags_functional_test_util_menu_tool_button_click(menu_tool_button);
+
+  if(!success){
+    return(FALSE);
+  }
+  
+  ags_functional_test_util_reaction_time_long();
+  
+  success = ags_functional_test_util_menu_click(popup,
+						"remove index\0");
+  
+  ags_functional_test_util_reaction_time_long();
+
+  return(success);
 }
 
 gboolean
-ags_functional_test_util_automation_edit_select_region(guint nth_index,
-						       guint x0, guint x1,
-						       guint y0, guint y1)
+ags_functional_test_util_machine_selection_add_index()
 {
-  //TODO:JK: 
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
+  AgsEditor *editor;
+  AgsMachineSelector *machine_selector;
+  
+  GtkButton *menu_tool_button;
+  GtkMenu *popup;
+  
+  gboolean success;
+  
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  window = xorg_application_context->window;
+  editor = window->editor;
+  machine_selector = editor->machine_selector;
+  
+  menu_tool_button = machine_selector->menu_button;
+  popup = machine_selector->popup;
+  
+  gdk_threads_leave();
+
+  success = ags_functional_test_util_menu_tool_button_click(menu_tool_button);
+
+  if(!success){
+    return(FALSE);
+  }
+  
+  ags_functional_test_util_reaction_time_long();
+  
+  success = ags_functional_test_util_menu_click(popup,
+						"add index\0");
+  
+  ags_functional_test_util_reaction_time_long();
+
+  return(success);
 }
 
 gboolean
-ags_functional_test_util_machine_move_up(guint nth_machine)
+ags_functional_test_util_machine_selection_link_index()
 {
-  //TODO:JK: 
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
+  AgsEditor *editor;
+  AgsMachineSelector *machine_selector;
+  
+  GtkButton *menu_tool_button;
+  GtkMenu *popup;
+  
+  gboolean success;
+  
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  window = xorg_application_context->window;
+  editor = window->editor;
+  machine_selector = editor->machine_selector;
+  
+  menu_tool_button = machine_selector->menu_button;
+  popup = machine_selector->popup;
+  
+  gdk_threads_leave();
+
+  success = ags_functional_test_util_menu_tool_button_click(menu_tool_button);
+
+  if(!success){
+    return(FALSE);
+  }
+  
+  ags_functional_test_util_reaction_time_long();
+  
+  success = ags_functional_test_util_menu_click(popup,
+						"link index\0");
+  
+  ags_functional_test_util_reaction_time_long();
+
+  return(success);
 }
 
 gboolean
-ags_functional_test_util_machine_move_down(guint nth_machine)
+ags_functional_test_util_machine_selection_reverse_mapping()
 {
-  //TODO:JK: 
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
+  AgsEditor *editor;
+  AgsMachineSelector *machine_selector;
+  
+  GtkButton *menu_tool_button;
+  GtkMenu *popup;
+  
+  gboolean success;
+
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  window = xorg_application_context->window;
+  editor = window->editor;
+  machine_selector = editor->machine_selector;
+  
+  menu_tool_button = machine_selector->menu_button;
+  popup = machine_selector->popup;
+  
+  gdk_threads_leave();
+
+  success = ags_functional_test_util_menu_tool_button_click(menu_tool_button);
+
+  if(!success){
+    return(FALSE);
+  }
+  
+  ags_functional_test_util_reaction_time_long();
+  
+  success = ags_functional_test_util_menu_click(popup,
+						"reverse mapping\0");
+  
+  ags_functional_test_util_reaction_time_long();
+
+  return(success);
 }
 
 gboolean
-ags_functional_test_util_machine_hide(guint nth_machine)
+ags_functional_test_util_machine_selection_shift_piano(guint nth_shift)
 {
   //TODO:JK: 
 }
 
 gboolean
-ags_functional_test_util_machine_show(guint nth_machine)
+ags_functional_test_util_pattern_edit_delete_point(guint x,
+						   guint y)
 {
   //TODO:JK: 
 }
 
 gboolean
-ags_functional_test_util_machine_destroy(guint nth_machine)
+ags_functional_test_util_pattern_edit_add_point(guint x,
+						guint y)
 {
   AgsXorgApplicationContext *xorg_application_context;
-  AgsMachine *machine;
-
-  GList *list_start, *list;
+  AgsEditor *editor;
+  AgsToolbar *toolbar;
+  AgsNoteEdit *pattern_edit;
   
+  GtkWidget *widget;
+  GtkScrollbar *hscrollbar;
+  GtkScrollbar *vscrollbar;
+  GtkAdjustment *adjustment;
+  
+  GdkDisplay *display;
+  GdkScreen *screen;
+  GdkWindow *window;
+
+  gdouble zoom;
+  guint history;
+  guint height;
+  guint origin_x, origin_y;
+  guint widget_x, widget_y;
   gboolean success;
 
   gdk_threads_enter();
   
   xorg_application_context = ags_application_context_get_instance();
 
-  /* retrieve machine */
-  list_start = gtk_container_get_children(xorg_application_context->window->machines);
-  list = g_list_nth(list_start,
-		    nth_machine);
+  editor = xorg_application_context->window->editor;  
+  toolbar = editor->toolbar;
 
+  if(editor->current_edit_widget == NULL ||
+     !AGS_PATTERN_EDIT(editor->current_edit_widget)){
+    gdk_threads_leave();
+
+    return(FALSE);
+  }
+  
+  pattern_edit = editor->current_edit_widget;
+  widget = pattern_edit->drawing_area;
+  
+  display = gtk_widget_get_display(widget);
+  screen = gtk_widget_get_screen(widget);
+  
+  history = gtk_combo_box_get_active(GTK_COMBO_BOX(toolbar->zoom));
+  zoom = exp2((double) history - 2.0);
+  
   gdk_threads_leave();
+
+  /*  */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  hscrollbar = pattern_edit->hscrollbar;
+  vscrollbar = pattern_edit->vscrollbar;
   
-  if(list != NULL &&
-     AGS_IS_MACHINE(list->data)){
-    machine = list->data;
+  window = gtk_widget_get_window(widget);
+
+  widget_x = widget->allocation.x;
+  widget_y = widget->allocation.y;
+
+  height = widget->allocation.height;
+  
+  gdk_window_get_origin(window, &origin_x, &origin_y);
+
+  /* make visible */
+  adjustment = GTK_RANGE(hscrollbar)->adjustment;
+  
+  if((x * 64 / zoom) * (adjustment->upper / (AGS_PATTERN_EDIT_MAX_CONTROLS * 16 * 64 * zoom)) > ((adjustment->value / adjustment->upper) * (AGS_PATTERN_EDIT_MAX_CONTROLS * 16 * 64 * zoom)) + ((4.0 * adjustment->page_increment / adjustment->upper) * (AGS_PATTERN_EDIT_MAX_CONTROLS * 16 * 64 * zoom))){
+    gtk_adjustment_set_value(adjustment,
+			     (x * 64 / zoom) * (adjustment->upper / (AGS_PATTERN_EDIT_MAX_CONTROLS * 16 * 64 * zoom)));
+
+    ags_functional_test_util_reaction_time_long();
+  }else if((x * 64 / zoom) * (adjustment->upper / (AGS_PATTERN_EDIT_MAX_CONTROLS * 16 * 64 * zoom)) < ((adjustment->value / adjustment->upper) * (AGS_PATTERN_EDIT_MAX_CONTROLS * 16 * 64 * zoom))){
+    gtk_adjustment_set_value(adjustment,
+			     (x * 64 / zoom) * (adjustment->upper / (AGS_PATTERN_EDIT_MAX_CONTROLS * 16 * 64 * zoom)));
+
+    ags_functional_test_util_reaction_time_long();
+  }
+
+  x = (x * 64 / zoom) - (((adjustment->value / adjustment->upper) * (AGS_PATTERN_EDIT_MAX_CONTROLS * 16 * 64 * zoom)));
+
+  if(height < pattern_edit->map_height){
+    adjustment = GTK_RANGE(vscrollbar)->adjustment;
+  
+    if((y * 14) > (adjustment->value / adjustment->upper) * (pattern_edit->map_height) + (8 * 14)){
+      gtk_adjustment_set_value(adjustment,
+			       (y * 14) * (adjustment->upper / pattern_edit->map_height));
+
+      ags_functional_test_util_reaction_time_long();
+    }else if((y * 14) < (adjustment->value / adjustment->upper) * (pattern_edit->map_height)){
+      gtk_adjustment_set_value(adjustment,
+			       (y * 14) * (adjustment->upper / pattern_edit->map_height));
+
+      ags_functional_test_util_reaction_time_long();
+    }
+
+    y = (y * 14) - ((adjustment->value / adjustment->upper) * (pattern_edit->map_height));
   }else{
-    return(FALSE);
+    y = y * 14;
   }
   
-  g_list_free(list_start);
+  pthread_mutex_unlock(task_thread->launch_mutex);
 
-  /* activate destroy */
-  success = ags_functional_test_util_menu_tool_button_click(machine->menu_tool_button);
+  /*  */
+  gdk_display_warp_pointer(display,
+			   screen,
+			   origin_x + x + 8, origin_y + y + 7);
 
-  success = ags_functional_test_util_menu_click(machine->popup,
-						"destroy\0");
+  ags_functional_test_util_reaction_time();
 
-  return(success);
+  gdk_test_simulate_button(window,
+			   x + 8,
+			   y + 7,
+			   1,
+			   GDK_BUTTON1_MASK,
+			   GDK_BUTTON_PRESS);
+
+  ags_functional_test_util_reaction_time();
+
+  gdk_test_simulate_button(window,
+			   x + 8,
+			   y + 7,
+			   1,
+			   GDK_BUTTON1_MASK,
+			   GDK_BUTTON_RELEASE);
+  
+  ags_functional_test_util_reaction_time_long();
+  
+  return(TRUE);
 }
 
 gboolean
-ags_functional_test_util_machine_rename_open(guint nth_machine)
+ags_functional_test_util_pattern_edit_select_region(guint x0, guint x1,
+						    guint y0, guint y1)
 {
   //TODO:JK: 
 }
 
 gboolean
-ags_functional_test_util_machine_rename_close(guint nth_machine)
+ags_functional_test_util_note_edit_delete_point(guint x,
+						guint y)
 {
   //TODO:JK: 
 }
 
 gboolean
-ags_functional_test_util_machine_rename_set_name(guint nth_machine,
-						 gchar *name)
+ags_functional_test_util_note_edit_add_point(guint x0, guint x1,
+					     guint y)
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsEditor *editor;
+  AgsToolbar *toolbar;
+  AgsNoteEdit *note_edit;
+  
+  GtkWidget *widget;
+  GtkScrollbar *hscrollbar;
+  GtkScrollbar *vscrollbar;
+  GtkAdjustment *adjustment;
+  
+  GdkDisplay *display;
+  GdkScreen *screen;
+  GdkWindow *window;
+
+  gdouble zoom;
+  guint history;
+  guint height;
+  guint origin_x, origin_y;
+  guint widget_x, widget_y;
+  gboolean success;
+
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  editor = xorg_application_context->window->editor;  
+  toolbar = editor->toolbar;
+
+  if(editor->current_edit_widget == NULL ||
+     !AGS_NOTE_EDIT(editor->current_edit_widget)){
+    gdk_threads_leave();
+
+    return(FALSE);
+  }
+  
+  note_edit = editor->current_edit_widget;
+  widget = note_edit->drawing_area;
+  
+  display = gtk_widget_get_display(widget);
+  screen = gtk_widget_get_screen(widget);
+  
+  history = gtk_combo_box_get_active(GTK_COMBO_BOX(toolbar->zoom));
+  zoom = exp2((double) history - 2.0);
+  
+  gdk_threads_leave();
+
+  /*  */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  hscrollbar = note_edit->hscrollbar;
+  vscrollbar = note_edit->vscrollbar;
+  
+  window = gtk_widget_get_window(widget);
+
+  widget_x = widget->allocation.x;
+  widget_y = widget->allocation.y;
+
+  height = widget->allocation.height;
+  
+  gdk_window_get_origin(window, &origin_x, &origin_y);
+
+  /* make visible */
+  adjustment = GTK_RANGE(hscrollbar)->adjustment;
+  
+  if((x0 * 64 / zoom) * (adjustment->upper / (AGS_NOTE_EDIT_MAX_CONTROLS * 16 * 64 * zoom)) > ((adjustment->value / adjustment->upper) * (AGS_NOTE_EDIT_MAX_CONTROLS * 16 * 64 * zoom)) + ((4.0 * adjustment->page_increment / adjustment->upper) * (AGS_NOTE_EDIT_MAX_CONTROLS * 16 * 64 * zoom))){
+    gtk_adjustment_set_value(adjustment,
+			     (x0 * 64 / zoom) * (adjustment->upper / (AGS_NOTE_EDIT_MAX_CONTROLS * 16 * 64 * zoom)));
+
+    ags_functional_test_util_reaction_time_long();
+  }else if((x0 * 64 / zoom) * (adjustment->upper / (AGS_NOTE_EDIT_MAX_CONTROLS * 16 * 64 * zoom)) < ((adjustment->value / adjustment->upper) * (AGS_NOTE_EDIT_MAX_CONTROLS * 16 * 64 * zoom))){
+    gtk_adjustment_set_value(adjustment,
+			     (x0 * 64 / zoom) * (adjustment->upper / (AGS_NOTE_EDIT_MAX_CONTROLS * 16 * 64 * zoom)));
+
+    ags_functional_test_util_reaction_time_long();
+  }
+
+  x0 = (x0 * 64 / zoom) - (((adjustment->value / adjustment->upper) * (AGS_NOTE_EDIT_MAX_CONTROLS * 16 * 64 * zoom)));
+  x1 = (x1 * 64 / zoom) - (((adjustment->value / adjustment->upper) * (AGS_NOTE_EDIT_MAX_CONTROLS * 16 * 64 * zoom)));
+
+  if(height < note_edit->map_height){
+    adjustment = GTK_RANGE(vscrollbar)->adjustment;
+  
+    if((y * 14) > (adjustment->value / adjustment->upper) * (note_edit->map_height) + (8 * 14)){
+      gtk_adjustment_set_value(adjustment,
+			       (y * 14) * (adjustment->upper / note_edit->map_height));
+
+      ags_functional_test_util_reaction_time_long();
+    }else if((y * 14) < (adjustment->value / adjustment->upper) * (note_edit->map_height)){
+      gtk_adjustment_set_value(adjustment,
+			       (y * 14) * (adjustment->upper / note_edit->map_height));
+
+      ags_functional_test_util_reaction_time_long();
+    }
+
+    y = (y * 14) - ((adjustment->value / adjustment->upper) * (note_edit->map_height));
+  }else{
+    y = y * 14;
+  }
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  /*  */
+  gdk_display_warp_pointer(display,
+			   screen,
+			   origin_x + x0 + 8, origin_y + y + 7);
+
+  ags_functional_test_util_reaction_time();
+
+  gdk_test_simulate_button(window,
+			   x0 + 8,
+			   y + 7,
+			   1,
+			   GDK_BUTTON1_MASK,
+			   GDK_BUTTON_PRESS);
+
+  ags_functional_test_util_reaction_time();
+
+  gdk_display_warp_pointer(display,
+			   screen,
+			   origin_x + x1 + 8, origin_y + y + 7);
+
+  ags_functional_test_util_reaction_time();
+
+  gdk_test_simulate_button(window,
+			   x1 + 8,
+			   y + 7,
+			   1,
+			   GDK_BUTTON1_MASK,
+			   GDK_BUTTON_RELEASE);
+  
+  ags_functional_test_util_reaction_time_long();
+  
+  return(TRUE);
+}
+
+gboolean
+ags_functional_test_util_note_edit_select_region(guint x0, guint x1,
+						 guint y0, guint y1)
+{
+  //TODO:JK: 
+}
+
+gboolean
+ags_functional_test_util_automation_toolbar_cursor_click()
+{
+  //TODO:JK: 
+}
+
+gboolean
+ags_functional_test_util_automation_toolbar_edit_click()
+{
+  //TODO:JK: 
+}
+
+gboolean
+ags_functional_test_util_automation_toolbar_delete_click()
+{
+  //TODO:JK: 
+}
+
+gboolean
+ags_functional_test_util_automation_toolbar_select_click()
+{
+  //TODO:JK: 
+}
+
+gboolean
+ags_functional_test_util_automation_toolbar_paste_click()
+{
+  //TODO:JK: 
+}
+
+gboolean
+ags_functional_test_util_automation_toolbar_copy_click()
+{
+  //TODO:JK: 
+}
+
+gboolean
+ags_functional_test_util_automation_toolbar_cut_click()
+{
+  //TODO:JK: 
+}
+
+gboolean
+ags_functional_test_util_automation_toolbar_zoom(guint nth_zoom)
+{
+  //TODO:JK: 
+}
+
+gboolean
+ags_functional_test_util_automation_edit_audio_click()
+{
+  //TODO:JK: 
+}
+
+gboolean
+ags_functional_test_util_automation_edit_output_click()
+{
+  //TODO:JK: 
+}
+
+gboolean
+ags_functional_test_util_automation_edit_input_click()
+{
+  //TODO:JK: 
+}
+
+gboolean
+ags_functional_test_util_automation_edit_delete_point(guint nth_index,
+						      guint x,
+						      guint y)
+{
+  //TODO:JK: 
+}
+
+gboolean
+ags_functional_test_util_automation_edit_add_point(guint nth_index,
+						   guint x,
+						   guint y)
+{
+  //TODO:JK: 
+}
+
+gboolean
+ags_functional_test_util_automation_edit_select_region(guint nth_index,
+						       guint x0, guint x1,
+						       guint y0, guint y1)
+{
+  //TODO:JK: 
+}
+
+gboolean
+ags_functional_test_util_machine_move_up(guint nth_machine)
+{
+  //TODO:JK: 
+}
+
+gboolean
+ags_functional_test_util_machine_move_down(guint nth_machine)
+{
+  //TODO:JK: 
+}
+
+gboolean
+ags_functional_test_util_machine_hide(guint nth_machine)
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsMachine *machine;
+
+  GtkMenu *popup;
+  
+  GList *list_start, *list;
+  
+  gboolean success;
+
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  /* retrieve machine */
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+  
+  if(list != NULL &&
+     AGS_IS_MACHINE(list->data)){
+    machine = list->data;
+  }else{
+    return(FALSE);
+  }
+  
+  g_list_free(list_start);
+  
+  gdk_threads_enter();
+
+  popup = machine->popup;
+  
+  gdk_threads_leave();
+
+  /* activate hide */
+  success = ags_functional_test_util_menu_tool_button_click(machine->menu_tool_button);
+
+  if(!success){
+    return(FALSE);
+  }
+  
+  ags_functional_test_util_reaction_time_long();
+  
+  success = ags_functional_test_util_menu_click(popup,
+						"hide\0");
+  ags_functional_test_util_reaction_time_long();
+
+  return(success);
+}
+
+gboolean
+ags_functional_test_util_machine_show(guint nth_machine)
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsMachine *machine;
+
+  GtkMenu *popup;
+
+  GList *list_start, *list;
+  
+  gboolean success;
+
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  /* retrieve machine */
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+  
+  if(list != NULL &&
+     AGS_IS_MACHINE(list->data)){
+    machine = list->data;
+  }else{
+    return(FALSE);
+  }
+  
+  g_list_free(list_start);
+
+  gdk_threads_enter();
+
+  popup = machine->popup;
+  
+  gdk_threads_leave();
+
+  /* activate show */
+  success = ags_functional_test_util_menu_tool_button_click(machine->menu_tool_button);
+  ags_functional_test_util_reaction_time_long();
+
+  success = ags_functional_test_util_menu_click(popup,
+						"show\0");
+  ags_functional_test_util_reaction_time_long();
+
+  return(success);
+}
+
+gboolean
+ags_functional_test_util_machine_destroy(guint nth_machine)
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
+  AgsMachine *machine;
+
+  GtkMenu *popup;
+
+  GList *list_start, *list;
+
+  AgsFunctionalTestUtilContainerTest container_test;
+  
+  gboolean success;
+
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  window = xorg_application_context->window;
+  
+  /* retrieve machine */
+  container_test.container = &(window->machines);
+
+  list_start = gtk_container_get_children(window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+  
+  if(list != NULL &&
+     AGS_IS_MACHINE(list->data)){
+    machine = list->data;
+  }else{
+    return(FALSE);
+  }
+  
+  container_test.count = g_list_length(list_start) - 1;
+
+  g_list_free(list_start);
+
+  gdk_threads_enter();
+
+  popup = machine->popup;
+  
+  gdk_threads_leave();
+  
+  /* activate destroy */
+  success = ags_functional_test_util_menu_tool_button_click(machine->menu_tool_button);
+
+  success = ags_functional_test_util_menu_click(popup,
+						"destroy\0");
+
+  ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_container_children_count),
+						      &ags_functional_test_util_default_timeout,
+						      &container_test);
+
+  return(success);
+}
+
+gboolean
+ags_functional_test_util_machine_rename_open(guint nth_machine)
+{
+  //TODO:JK: 
+}
+
+gboolean
+ags_functional_test_util_machine_rename_close(guint nth_machine)
+{
+  //TODO:JK: 
+}
+
+gboolean
+ags_functional_test_util_machine_rename_set_name(guint nth_machine,
+						 gchar *name)
+{
+  //TODO:JK: 
+}
+
+GtkWidget*
+ags_functional_test_util_get_line_editor(GtkWidget *machine_editor,
+					 guint nth_pad, guint nth_audio_channel,
+					 gboolean is_output)
+{
+  AgsListingEditor *listing_editor;
+  AgsPadEditor *pad_editor;
+  AgsLineEditor *line_editor;  
+  
+  GList *list_start, *list;
+
+  if(machine_editor == NULL){
+    return(NULL);
+  }
+  
+  gdk_threads_enter();
+
+  if(is_output){
+    listing_editor = AGS_LISTING_EDITOR(AGS_MACHINE_EDITOR(machine_editor)->output_editor);
+  }else{
+    listing_editor = AGS_LISTING_EDITOR(AGS_MACHINE_EDITOR(machine_editor)->input_editor);
+  }
+
+  list_start = gtk_container_get_children(listing_editor->child);
+  list = g_list_nth(list_start,
+		    nth_pad);
+
+  if(list != NULL &&
+     AGS_IS_PAD_EDITOR(list->data)){
+    pad_editor = list->data;
+
+    g_list_free(list_start);
+  }else{
+    g_list_free(list_start);
+
+    return(NULL);
+  }
+  
+  /* line editor */
+  list_start = gtk_container_get_children(pad_editor->line_editor);
+  list = g_list_nth(list_start,
+		    nth_audio_channel);
+
+  if(list != NULL &&
+     AGS_IS_LINE_EDITOR(list->data)){
+    line_editor = list->data;
+
+    g_list_free(list_start);
+  }else{
+    g_list_free(list_start);
+
+    return(NULL);
+  }
+  
+  gdk_threads_leave();
+
+  return(line_editor);
+}
+
+gboolean
+ags_functional_test_util_machine_properties_open(guint nth_machine)
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsWindow *window;
+  AgsMachine *machine;
+  GtkWidget **properties;
+  GtkMenuToolButton *menu_tool_button;
+  
+  GList *list_start, *list;
+  
+  gboolean success;
+
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  window = xorg_application_context->window;
+  
+  /* retrieve machine */
+  list_start = gtk_container_get_children(window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+  
+  if(list != NULL &&
+     AGS_IS_MACHINE(list->data)){
+    machine = list->data;
+  }else{
+    return(FALSE);
+  }
+  
+  g_list_free(list_start);
+
+  /* activate destroy */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  properties = &(machine->properties);
+
+  menu_tool_button = machine->menu_tool_button;
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+  
+  success = ags_functional_test_util_menu_tool_button_click(menu_tool_button);
+
+  success = ags_functional_test_util_menu_click(machine->popup,
+						"properties\0");
+
+  ags_functional_test_util_reaction_time_long();
+  ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_widget_visible),
+						      &ags_functional_test_util_default_timeout,
+						      properties);
+
+  return(success);
+}
+
+gboolean
+ags_functional_test_util_machine_properties_click_tab(guint nth_machine,
+						      guint nth_tab)
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsMachine *machine;
+  AgsMachineEditor *machine_editor;
+  
+  GList *list_start, *list;
+  
+  gboolean success;
+
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  /* retrieve machine */
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+  
+  if(list != NULL &&
+     AGS_IS_MACHINE(list->data)){
+    machine = list->data;
+  }else{
+    return(FALSE);
+  }
+
+  g_list_free(list_start);
+
+  /* click tab */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  gtk_notebook_set_current_page(machine_editor->notebook,
+				nth_tab);
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  ags_functional_test_util_reaction_time_long();
+
+  return(TRUE);
+}
+
+gboolean
+ags_functional_test_util_machine_properties_click_enable(guint nth_machine)
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsMachine *machine;
+  AgsMachineEditor *machine_editor;
+  GtkButton *enable_button;
+  
+  GList *list_start, *list;
+
+  guint nth_tab;
+  gboolean success;
+
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  /* retrieve machine */
+  enable_button = NULL;
+  
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+  
+  if(list != NULL &&
+     AGS_IS_MACHINE(list->data)){
+    machine = list->data;
+  }else{
+    return(FALSE);
+  }
+
+  g_list_free(list_start);
+
+  /* click tab */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  nth_tab = gtk_notebook_get_current_page(machine_editor->notebook);
+
+  switch(nth_tab){
+  case 0:
+    {
+      enable_button = AGS_PROPERTY_EDITOR(machine_editor->output_editor)->enabled;
+    }
+    break;
+  case 1:
+    {
+      enable_button = AGS_PROPERTY_EDITOR(machine_editor->input_editor)->enabled;
+    }
+    break;
+  case 2:
+    {
+      enable_button = AGS_PROPERTY_EDITOR(machine_editor->output_link_editor)->enabled;
+    }
+    break;
+  case 3:
+    {
+      enable_button = AGS_PROPERTY_EDITOR(machine_editor->input_link_editor)->enabled;
+    }
+    break;
+  case 4:
+    {
+      enable_button = AGS_PROPERTY_EDITOR(machine_editor->resize_editor)->enabled;
+    }
+    break;
+  }
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_button_click(enable_button);
+
+  ags_functional_test_util_reaction_time_long();
+
+  return(success);
+}
+
+gboolean
+ags_functional_test_util_machine_properties_link_set(guint nth_machine,
+						     guint pad, guint audio_channel,
+						     gchar *link_name, guint link_nth_line)
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsMachine *machine;
+  AgsMachineEditor *machine_editor;
+  AgsListingEditor *listing_editor;
+  AgsPadEditor *pad_editor;
+  AgsLineEditor *line_editor;
+  AgsLinkEditor *link_editor;
+  
+  GtkTreeModel *model;
+  
+  GtkTreeIter iter;
+  GList *list_start, *list;
+
+  gchar *value;
+
+  guint nth_tab;
+  gboolean success;
+  
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  /* retrieve machine */  
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+  
+  if(list != NULL &&
+     AGS_IS_MACHINE(list->data)){
+    machine = list->data;
+  }else{
+    return(FALSE);
+  }
+
+  g_list_free(list_start);
+
+  /* set link */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  nth_tab = gtk_notebook_get_current_page(machine_editor->notebook);
+
+  switch(nth_tab){
+  case 0:
+    {
+      listing_editor = AGS_LISTING_EDITOR(machine_editor->output_editor);
+    }
+    break;
+  case 1:
+    {
+      listing_editor = AGS_LISTING_EDITOR(machine_editor->input_editor);
+    }
+    break;
+  default:
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  list_start = gtk_container_get_children(listing_editor->child);
+  list = g_list_nth(list_start,
+		    pad);
+
+  if(list != NULL &&
+     AGS_IS_PAD_EDITOR(list->data)){
+    pad_editor = list->data;
+
+    g_list_free(list_start);
+  }else{
+    g_list_free(list_start);
+
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  /* expander */
+  gtk_expander_set_expanded(pad_editor->line_editor_expander,
+			    TRUE);
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  ags_functional_test_util_reaction_time_long();
+  
+  /* line editor */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  list_start = gtk_container_get_children(pad_editor->line_editor);
+  list = g_list_nth(list_start,
+		    audio_channel);
+
+  if(list != NULL &&
+     AGS_IS_LINE_EDITOR(list->data)){
+    line_editor = list->data;
+
+    g_list_free(list_start);
+  }else{
+    g_list_free(list_start);
+
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  /* link editor */
+  link_editor = line_editor->link_editor;
+
+  /* set link */
+  model = gtk_combo_box_get_model(GTK_COMBO_BOX(link_editor->combo));
+  success = FALSE;
+
+  if(gtk_tree_model_get_iter_first(model, &iter)){
+    do{
+      gtk_tree_model_get(model, &iter,
+			 0, &value,
+			 -1);
+      
+      if(!g_strcmp0(link_name,
+		    value)){
+	gtk_combo_box_set_active_iter((GtkComboBox *) link_editor->combo,
+				      &iter);
+	success = TRUE;
+	
+	break;
+      }
+    }while(gtk_tree_model_iter_next(model,
+				    &iter));
+  }      
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  ags_functional_test_util_reaction_time_long();
+  
+  if(!success){
+    return(FALSE);
+  }
+  
+  /* set link line */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  success = TRUE;
+  gtk_spin_button_set_value(link_editor->spin_button,
+			    link_nth_line);
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  ags_functional_test_util_reaction_time_long();
+ 
+  return(success);
+}
+
+gboolean
+ags_functional_test_util_machine_properties_link_open(guint nth_machine,
+						      guint pad, guint audio_channel)
+{
+  //TODO:JK: 
+}
+
+gboolean
+ags_functional_test_util_machine_properties_effect_add(guint nth_machine,
+						       guint pad, guint audio_channel)
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsMachine *machine;
+  AgsMachineEditor *machine_editor;
+  AgsListingEditor *listing_editor;
+  AgsPadEditor *pad_editor;
+  AgsLineEditor *line_editor;
+  AgsLineMemberEditor *member_editor;
+  GtkDialog **effect_dialog;
+  GtkButton *add_button;
+  
+  GtkTreeModel *model;
+  
+  GtkTreeIter iter;
+  GList *list_start, *list;
+
+  gchar *value;
+
+  guint nth_tab;
+  gboolean success;
+  
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  /* retrieve machine */  
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+  
+  if(list != NULL &&
+     AGS_IS_MACHINE(list->data)){
+    machine = list->data;
+  }else{
+    return(FALSE);
+  }
+
+  g_list_free(list_start);
+
+  /* get tab */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  nth_tab = gtk_notebook_get_current_page(machine_editor->notebook);
+
+  switch(nth_tab){
+  case 0:
+    {
+      listing_editor = AGS_LISTING_EDITOR(machine_editor->output_editor);
+    }
+    break;
+  case 1:
+    {
+      listing_editor = AGS_LISTING_EDITOR(machine_editor->input_editor);
+    }
+    break;
+  default:
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  list_start = gtk_container_get_children(listing_editor->child);
+  list = g_list_nth(list_start,
+		    pad);
+
+  if(list != NULL &&
+     AGS_IS_PAD_EDITOR(list->data)){
+    pad_editor = list->data;
+
+    g_list_free(list_start);
+  }else{
+    g_list_free(list_start);
+
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  /* expander */
+  gtk_expander_set_expanded(pad_editor->line_editor_expander,
+			    TRUE);
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  ags_functional_test_util_reaction_time_long();
+  
+  /* line editor */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  list_start = gtk_container_get_children(pad_editor->line_editor);
+  list = g_list_nth(list_start,
+		    audio_channel);
+
+  if(list != NULL &&
+     AGS_IS_LINE_EDITOR(list->data)){
+    line_editor = list->data;
+
+    g_list_free(list_start);
+  }else{
+    g_list_free(list_start);
+
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  /* line member editor */
+  member_editor = line_editor->member_editor;
+  
+  /* effect dialog and add button */
+  effect_dialog = &(member_editor->plugin_browser);
+  add_button = member_editor->add;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  success = ags_functional_test_util_button_click(add_button);
+  
+  ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_widget_visible),
+						      &ags_functional_test_util_default_timeout,
+						      effect_dialog);
+  
+  ags_functional_test_util_reaction_time_long();
+ 
+  return(success);
+}
+
+gboolean
+ags_functional_test_util_machine_properties_effect_remove(guint nth_machine,
+							  guint pad, guint audio_channel,
+							  guint nth_effect)
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsMachine *machine;
+  AgsMachineEditor *machine_editor;
+  AgsListingEditor *listing_editor;
+  AgsPadEditor *pad_editor;
+  AgsLineEditor *line_editor;
+  AgsLineMemberEditor *member_editor;
+  GtkDialog **effect_dialog;
+  GtkButton *check_button;
+  GtkButton *remove_button;
+  
+  GtkTreeModel *model;
+
+  AgsFunctionalTestUtilContainerTest container_test;
+  
+  GtkTreeIter iter;
+  GList *list_start, *list;
+
+  gchar *value;
+
+  guint nth_tab;
+  gboolean success;
+  
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  /* retrieve machine */  
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+  
+  if(list != NULL &&
+     AGS_IS_MACHINE(list->data)){
+    machine = list->data;
+  }else{
+    return(FALSE);
+  }
+
+  g_list_free(list_start);
+
+  /* get tab */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  nth_tab = gtk_notebook_get_current_page(machine_editor->notebook);
+
+  switch(nth_tab){
+  case 0:
+    {
+      listing_editor = AGS_LISTING_EDITOR(machine_editor->output_editor);
+    }
+    break;
+  case 1:
+    {
+      listing_editor = AGS_LISTING_EDITOR(machine_editor->input_editor);
+    }
+    break;
+  default:
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  list_start = gtk_container_get_children(listing_editor->child);
+  list = g_list_nth(list_start,
+		    pad);
+
+  if(list != NULL &&
+     AGS_IS_PAD_EDITOR(list->data)){
+    pad_editor = list->data;
+
+    g_list_free(list_start);
+  }else{
+    g_list_free(list_start);
+
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  /* expander */
+  gtk_expander_set_expanded(pad_editor->line_editor_expander,
+			    TRUE);
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  ags_functional_test_util_reaction_time_long();
+  
+  /* line editor */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  list_start = gtk_container_get_children(pad_editor->line_editor);
+  list = g_list_nth(list_start,
+		    audio_channel);
+
+  if(list != NULL &&
+     AGS_IS_LINE_EDITOR(list->data)){
+    line_editor = list->data;
+
+    g_list_free(list_start);
+  }else{
+    g_list_free(list_start);
+
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  /* line member editor */
+  member_editor = line_editor->member_editor;
+  
+  /* effect dialog and remove button */
+  effect_dialog = &(member_editor->plugin_browser);
+  remove_button = member_editor->remove;
+
+  /* check button */
+  container_test.container = &(member_editor->line_member);
+  
+  check_button = NULL;
+
+  list_start = gtk_container_get_children(member_editor->line_member);
+
+  container_test.count = g_list_length(list_start) - 1;
+
+  list = g_list_nth(list_start,
+		    nth_effect);
+
+  if(list != NULL){
+    GtkHBox *hbox;
+
+    hbox = list->data;
+    list_start = gtk_container_get_children(hbox);
+    
+    check_button = list_start->data;
+
+    g_list_free(list_start);
+  }
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  /* click check button */
+  success = ags_functional_test_util_button_click(check_button);
+
+  /* click remove */
+  if(success){
+    ags_functional_test_util_reaction_time_long();
+  
+    success = ags_functional_test_util_button_click(remove_button);
+  
+    ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_container_children_count),
+							&ags_functional_test_util_default_timeout,
+							&container_test);
+  
+    ags_functional_test_util_reaction_time_long();
+  }
+  
+  return(success);
+}
+
+gboolean
+ags_functional_test_util_machine_properties_effect_plugin_type(guint nth_machine,
+							       guint pad, guint audio_channel,
+							       gchar *plugin_type)
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsMachine *machine;
+  AgsMachineEditor *machine_editor;
+  AgsListingEditor *listing_editor;
+  AgsPadEditor *pad_editor;
+  AgsLineEditor *line_editor;
+  AgsLineMemberEditor *member_editor;
+  AgsPluginBrowser *plugin_browser;
+  
+  GtkTreeModel *model;
+  
+  GtkTreeIter iter;
+  GList *list_start, *list;
+
+  gchar *value;
+
+  guint nth_tab;
+  gboolean success;
+  
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  /* retrieve machine */  
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+  
+  if(list != NULL &&
+     AGS_IS_MACHINE(list->data)){
+    machine = list->data;
+  }else{
+    return(FALSE);
+  }
+
+  g_list_free(list_start);
+
+  /* get tab */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  nth_tab = gtk_notebook_get_current_page(machine_editor->notebook);
+
+  switch(nth_tab){
+  case 0:
+    {
+      listing_editor = AGS_LISTING_EDITOR(machine_editor->output_editor);
+    }
+    break;
+  case 1:
+    {
+      listing_editor = AGS_LISTING_EDITOR(machine_editor->input_editor);
+    }
+    break;
+  default:
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  /* pad editor */
+  list_start = gtk_container_get_children(listing_editor->child);
+  list = g_list_nth(list_start,
+		    pad);
+
+  if(list != NULL &&
+     AGS_IS_PAD_EDITOR(list->data)){
+    pad_editor = list->data;
+
+    g_list_free(list_start);
+  }else{
+    g_list_free(list_start);
+
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+    
+  /* line editor */
+  list_start = gtk_container_get_children(pad_editor->line_editor);
+  list = g_list_nth(list_start,
+		    audio_channel);
+
+  if(list != NULL &&
+     AGS_IS_LINE_EDITOR(list->data)){
+    line_editor = list->data;
+
+    g_list_free(list_start);
+  }else{
+    g_list_free(list_start);
+
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  /* line member editor */
+  member_editor = line_editor->member_editor;
+  plugin_browser = member_editor->plugin_browser;
+  
+  /* set plugin type */
+  model = gtk_combo_box_get_model(GTK_COMBO_BOX(plugin_browser->plugin_type));
+  success = FALSE;
+
+  if(gtk_tree_model_get_iter_first(model, &iter)){
+    do{
+      gtk_tree_model_get(model, &iter,
+			 0, &value,
+			 -1);
+      
+      if(!g_strcmp0(plugin_type,
+		    value)){
+	gtk_combo_box_set_active_iter((GtkComboBox *) plugin_browser->plugin_type,
+				      &iter);
+	success = TRUE;
+	
+	break;
+      }
+    }while(gtk_tree_model_iter_next(model,
+				    &iter));
+  }      
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  ags_functional_test_util_reaction_time_long();
+ 
+  return(success);
+}
+
+gboolean
+ags_functional_test_util_machine_properties_ladspa_filename(guint nth_machine,
+							    guint pad, guint audio_channel,
+							    gchar *filename)
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsMachine *machine;
+  AgsMachineEditor *machine_editor;
+  AgsListingEditor *listing_editor;
+  AgsPadEditor *pad_editor;
+  AgsLineEditor *line_editor;
+  AgsLineMemberEditor *member_editor;
+  AgsPluginBrowser *plugin_browser;
+  AgsLadspaBrowser *ladspa_browser;
+  
+  GtkTreeModel *model;
+  
+  GtkTreeIter iter;
+  GList *list_start, *list;
+
+  gchar *value;
+
+  guint nth_tab;
+  gboolean success;
+  
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  /* retrieve machine */  
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+  
+  if(list != NULL &&
+     AGS_IS_MACHINE(list->data)){
+    machine = list->data;
+  }else{
+    return(FALSE);
+  }
+
+  g_list_free(list_start);
+
+  /* get tab */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  nth_tab = gtk_notebook_get_current_page(machine_editor->notebook);
+
+  switch(nth_tab){
+  case 0:
+    {
+      listing_editor = AGS_LISTING_EDITOR(machine_editor->output_editor);
+    }
+    break;
+  case 1:
+    {
+      listing_editor = AGS_LISTING_EDITOR(machine_editor->input_editor);
+    }
+    break;
+  default:
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  list_start = gtk_container_get_children(listing_editor->child);
+  list = g_list_nth(list_start,
+		    pad);
+
+  if(list != NULL &&
+     AGS_IS_PAD_EDITOR(list->data)){
+    pad_editor = list->data;
+
+    g_list_free(list_start);
+  }else{
+    g_list_free(list_start);
+
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+  
+  /* line editor */
+  list_start = gtk_container_get_children(pad_editor->line_editor);
+  list = g_list_nth(list_start,
+		    audio_channel);
+
+  if(list != NULL &&
+     AGS_IS_LINE_EDITOR(list->data)){
+    line_editor = list->data;
+
+    g_list_free(list_start);
+  }else{
+    g_list_free(list_start);
+
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  /* line member editor */
+  member_editor = line_editor->member_editor;
+  plugin_browser = member_editor->plugin_browser;
+  ladspa_browser = plugin_browser->ladspa_browser;
+  
+  /* set plugin filename */
+  model = gtk_combo_box_get_model(GTK_COMBO_BOX(ladspa_browser->filename));
+  success = FALSE;
+
+  if(gtk_tree_model_get_iter_first(model, &iter)){
+    do{
+      gtk_tree_model_get(model, &iter,
+			 0, &value,
+			 -1);
+      
+      if(!g_strcmp0(filename,
+		    value)){
+	gtk_combo_box_set_active_iter((GtkComboBox *) ladspa_browser->filename,
+				      &iter);
+	success = TRUE;
+	
+	break;
+      }
+    }while(gtk_tree_model_iter_next(model,
+				    &iter));
+  }      
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  ags_functional_test_util_reaction_time_long();
+ 
+  return(success);
+}
+
+gboolean
+ags_functional_test_util_machine_properties_ladspa_effect(guint nth_machine,
+							  guint pad, guint audio_channel,
+							  gchar *effect)
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsMachine *machine;
+  AgsMachineEditor *machine_editor;
+  AgsListingEditor *listing_editor;
+  AgsPadEditor *pad_editor;
+  AgsLineEditor *line_editor;
+  AgsLineMemberEditor *member_editor;
+  AgsPluginBrowser *plugin_browser;
+  AgsLadspaBrowser *ladspa_browser;
+  
+  GtkTreeModel *model;
+  
+  GtkTreeIter iter;
+  GList *list_start, *list;
+
+  gchar *value;
+
+  guint nth_tab;
+  gboolean success;
+  
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  /* retrieve machine */  
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+  
+  if(list != NULL &&
+     AGS_IS_MACHINE(list->data)){
+    machine = list->data;
+  }else{
+    return(FALSE);
+  }
+
+  g_list_free(list_start);
+
+  /* get tab */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  nth_tab = gtk_notebook_get_current_page(machine_editor->notebook);
+
+  switch(nth_tab){
+  case 0:
+    {
+      listing_editor = AGS_LISTING_EDITOR(machine_editor->output_editor);
+    }
+    break;
+  case 1:
+    {
+      listing_editor = AGS_LISTING_EDITOR(machine_editor->input_editor);
+    }
+    break;
+  default:
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  list_start = gtk_container_get_children(listing_editor->child);
+  list = g_list_nth(list_start,
+		    pad);
+
+  if(list != NULL &&
+     AGS_IS_PAD_EDITOR(list->data)){
+    pad_editor = list->data;
+
+    g_list_free(list_start);
+  }else{
+    g_list_free(list_start);
+
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+  
+  /* line editor */
+  list_start = gtk_container_get_children(pad_editor->line_editor);
+  list = g_list_nth(list_start,
+		    audio_channel);
+
+  if(list != NULL &&
+     AGS_IS_LINE_EDITOR(list->data)){
+    line_editor = list->data;
+
+    g_list_free(list_start);
+  }else{
+    g_list_free(list_start);
+
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  /* line member editor */
+  member_editor = line_editor->member_editor;
+  plugin_browser = member_editor->plugin_browser;
+  ladspa_browser = plugin_browser->ladspa_browser;
+  
+  /* set plugin effect */
+  model = gtk_combo_box_get_model(GTK_COMBO_BOX(ladspa_browser->effect));
+  success = FALSE;
+
+  if(gtk_tree_model_get_iter_first(model, &iter)){
+    do{
+      gtk_tree_model_get(model, &iter,
+			 0, &value,
+			 -1);
+      
+      if(!g_strcmp0(effect,
+		    value)){
+	gtk_combo_box_set_active_iter((GtkComboBox *) ladspa_browser->effect,
+				      &iter);
+	success = TRUE;
+	
+	break;
+      }
+    }while(gtk_tree_model_iter_next(model,
+				    &iter));
+  }      
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  ags_functional_test_util_reaction_time_long();
+ 
+  return(success);
+}
+
+gboolean
+ags_functional_test_util_machine_properties_lv2_filename(guint nth_machine,
+							 guint pad, guint audio_channel,
+							 gchar *filename)
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsMachine *machine;
+  AgsMachineEditor *machine_editor;
+  AgsListingEditor *listing_editor;
+  AgsPadEditor *pad_editor;
+  AgsLineEditor *line_editor;
+  AgsLineMemberEditor *member_editor;
+  AgsPluginBrowser *plugin_browser;
+  AgsLv2Browser *lv2_browser;
+  
+  GtkTreeModel *model;
+  
+  GtkTreeIter iter;
+  GList *list_start, *list;
+
+  gchar *value;
+
+  guint nth_tab;
+  gboolean success;
+  
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  /* retrieve machine */  
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+  
+  if(list != NULL &&
+     AGS_IS_MACHINE(list->data)){
+    machine = list->data;
+  }else{
+    return(FALSE);
+  }
+
+  g_list_free(list_start);
+
+  /* get tab */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  nth_tab = gtk_notebook_get_current_page(machine_editor->notebook);
+
+  switch(nth_tab){
+  case 0:
+    {
+      listing_editor = AGS_LISTING_EDITOR(machine_editor->output_editor);
+    }
+    break;
+  case 1:
+    {
+      listing_editor = AGS_LISTING_EDITOR(machine_editor->input_editor);
+    }
+    break;
+  default:
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  list_start = gtk_container_get_children(listing_editor->child);
+  list = g_list_nth(list_start,
+		    pad);
+
+  if(list != NULL &&
+     AGS_IS_PAD_EDITOR(list->data)){
+    pad_editor = list->data;
+
+    g_list_free(list_start);
+  }else{
+    g_list_free(list_start);
+
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+  
+  /* line editor */
+  list_start = gtk_container_get_children(pad_editor->line_editor);
+  list = g_list_nth(list_start,
+		    audio_channel);
+
+  if(list != NULL &&
+     AGS_IS_LINE_EDITOR(list->data)){
+    line_editor = list->data;
+
+    g_list_free(list_start);
+  }else{
+    g_list_free(list_start);
+
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  /* line member editor */
+  member_editor = line_editor->member_editor;
+  plugin_browser = member_editor->plugin_browser;
+  lv2_browser = plugin_browser->lv2_browser;
+  
+  /* set plugin filename */
+  model = gtk_combo_box_get_model(GTK_COMBO_BOX(lv2_browser->filename));
+  success = FALSE;
+
+  if(gtk_tree_model_get_iter_first(model, &iter)){
+    do{
+      gtk_tree_model_get(model, &iter,
+			 0, &value,
+			 -1);
+      
+      if(!g_strcmp0(filename,
+		    value)){
+	gtk_combo_box_set_active_iter((GtkComboBox *) lv2_browser->filename,
+				      &iter);
+	success = TRUE;
+	
+	break;
+      }
+    }while(gtk_tree_model_iter_next(model,
+				    &iter));
+  }      
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  ags_functional_test_util_reaction_time_long();
+ 
+  return(success);
+}
+
+gboolean
+ags_functional_test_util_machine_properties_lv2_effect(guint nth_machine,
+						       guint pad, guint audio_channel,
+						       gchar *effect)
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsMachine *machine;
+  AgsMachineEditor *machine_editor;
+  AgsListingEditor *listing_editor;
+  AgsPadEditor *pad_editor;
+  AgsLineEditor *line_editor;
+  AgsLineMemberEditor *member_editor;
+  AgsPluginBrowser *plugin_browser;
+  AgsLv2Browser *lv2_browser;
+  
+  GtkTreeModel *model;
+  
+  GtkTreeIter iter;
+  GList *list_start, *list;
+
+  gchar *value;
+
+  guint nth_tab;
+  gboolean success;
+  
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  /* retrieve machine */  
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+  
+  if(list != NULL &&
+     AGS_IS_MACHINE(list->data)){
+    machine = list->data;
+  }else{
+    return(FALSE);
+  }
+
+  g_list_free(list_start);
+
+  /* get tab */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  nth_tab = gtk_notebook_get_current_page(machine_editor->notebook);
+
+  switch(nth_tab){
+  case 0:
+    {
+      listing_editor = AGS_LISTING_EDITOR(machine_editor->output_editor);
+    }
+    break;
+  case 1:
+    {
+      listing_editor = AGS_LISTING_EDITOR(machine_editor->input_editor);
+    }
+    break;
+  default:
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  list_start = gtk_container_get_children(listing_editor->child);
+  list = g_list_nth(list_start,
+		    pad);
+
+  if(list != NULL &&
+     AGS_IS_PAD_EDITOR(list->data)){
+    pad_editor = list->data;
+
+    g_list_free(list_start);
+  }else{
+    g_list_free(list_start);
+
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+  
+  /* line editor */
+  list_start = gtk_container_get_children(pad_editor->line_editor);
+  list = g_list_nth(list_start,
+		    audio_channel);
+
+  if(list != NULL &&
+     AGS_IS_LINE_EDITOR(list->data)){
+    line_editor = list->data;
+
+    g_list_free(list_start);
+  }else{
+    g_list_free(list_start);
+
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  /* line member editor */
+  member_editor = line_editor->member_editor;
+  plugin_browser = member_editor->plugin_browser;
+  lv2_browser = plugin_browser->lv2_browser;
+  
+  /* set plugin effect */
+  model = gtk_combo_box_get_model(GTK_COMBO_BOX(lv2_browser->effect));
+  success = FALSE;
+
+  if(gtk_tree_model_get_iter_first(model, &iter)){
+    do{
+      gtk_tree_model_get(model, &iter,
+			 0, &value,
+			 -1);
+      
+      if(!g_strcmp0(effect,
+		    value)){
+	gtk_combo_box_set_active_iter((GtkComboBox *) lv2_browser->effect,
+				      &iter);
+	success = TRUE;
+	
+	break;
+      }
+    }while(gtk_tree_model_iter_next(model,
+				    &iter));
+  }      
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  ags_functional_test_util_reaction_time_long();
+ 
+  return(success);
+}
+
+gboolean
+ags_functional_test_util_machine_properties_bulk_add(guint nth_machine)
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsMachine *machine;
+  AgsMachineEditor *machine_editor;
+  AgsPropertyCollectionEditor *property_collection_editor;
+  GtkButton *add_collection;
+
+  GList *list_start, *list;
+
+  guint nth_tab;
+  gboolean success;
+  
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  /* retrieve machine */  
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+  
+  if(list != NULL &&
+     AGS_IS_MACHINE(list->data)){
+    machine = list->data;
+  }else{
+    return(FALSE);
+  }
+
+  g_list_free(list_start);
+
+  /* get tab */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  nth_tab = gtk_notebook_get_current_page(machine_editor->notebook);
+
+  switch(nth_tab){
+  case AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_OUTPUT_TAB:
+    {
+      property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(machine_editor->output_link_editor);
+    }
+    break;
+  case AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_INPUT_TAB:
+    {
+      property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(machine_editor->input_link_editor);
+    }
+    break;
+  default:
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  add_collection = property_collection_editor->add_collection;
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  /* add collection */
+  success = ags_functional_test_util_button_click(add_collection);
+
+  ags_functional_test_util_reaction_time_long();
+
+  return(success);
+}
+
+gboolean
+ags_functional_test_util_machine_properties_bulk_remove(guint nth_machine,
+							guint nth_bulk)
 {
   //TODO:JK: 
 }
 
 gboolean
-ags_functional_test_util_machine_properties_open(guint nth_machine)
+ags_functional_test_util_machine_properties_bulk_link(guint nth_machine,
+						      guint nth_bulk,
+						      gchar *link)
+{
+  AgsXorgApplicationContext *xorg_application_context;
+  AgsMachine *machine;
+  AgsMachineEditor *machine_editor;
+  AgsPropertyCollectionEditor *property_collection_editor;
+  AgsLinkCollectionEditor *link_collection_editor;
+
+  GList *list_start, *list;
+
+  GtkTreeModel *model;
+  
+  GtkTreeIter iter;
+
+  gchar *value;
+
+  guint nth_tab;
+  gboolean success;
+  
+  gdk_threads_enter();
+  
+  xorg_application_context = ags_application_context_get_instance();
+
+  /* retrieve machine */  
+  list_start = gtk_container_get_children(xorg_application_context->window->machines);
+  list = g_list_nth(list_start,
+		    nth_machine);
+
+  gdk_threads_leave();
+  
+  if(list != NULL &&
+     AGS_IS_MACHINE(list->data)){
+    machine = list->data;
+  }else{
+    return(FALSE);
+  }
+
+  g_list_free(list_start);
+
+  /* get notebook tab */
+  pthread_mutex_lock(task_thread->launch_mutex);
+
+  machine_editor = machine->properties;
+
+  nth_tab = gtk_notebook_get_current_page(machine_editor->notebook);
+
+  switch(nth_tab){
+  case AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_OUTPUT_TAB:
+    {
+      property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(machine_editor->output_link_editor);
+    }
+    break;
+  case AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_INPUT_TAB:
+    {
+      property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(machine_editor->input_link_editor);
+    }
+    break;
+  default:
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  /* get bulk editor */
+  list_start = gtk_container_get_children(property_collection_editor->child);
+  list = g_list_nth(list_start,
+		    nth_bulk);
+
+  if(list != NULL){
+    GtkTable *table;
+    
+    table = list->data;
+    g_list_free(list_start);
+
+    link_collection_editor = g_object_get_data(table,
+					       "AgsChild\0");
+  }else{
+    g_list_free(list_start);
+
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+  
+  /* set link */
+  model = gtk_combo_box_get_model(GTK_COMBO_BOX(link_collection_editor->link));
+  success = FALSE;
+
+  if(gtk_tree_model_get_iter_first(model, &iter)){
+    do{
+      gtk_tree_model_get(model, &iter,
+			 0, &value,
+			 -1);
+      
+      if(!g_strcmp0(link,
+		    value)){
+	gtk_combo_box_set_active_iter((GtkComboBox *) link_collection_editor->link,
+				      &iter);
+	success = TRUE;
+	
+	break;
+      }
+    }while(gtk_tree_model_iter_next(model,
+				    &iter));
+  }      
+  
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  ags_functional_test_util_reaction_time_long();
+
+  return(success);
+}
+
+gboolean
+ags_functional_test_util_machine_properties_bulk_first_line(guint nth_machine,
+							    guint nth_bulk,
+							    guint first_line)
 {
   AgsXorgApplicationContext *xorg_application_context;
   AgsMachine *machine;
+  AgsMachineEditor *machine_editor;
+  AgsPropertyCollectionEditor *property_collection_editor;
+  AgsLinkCollectionEditor *link_collection_editor;
 
   GList *list_start, *list;
+
+  GtkTreeModel *model;
   
-  gboolean success;
+  GtkTreeIter iter;
+
+  gchar *value;
 
+  guint nth_tab;
+  
   gdk_threads_enter();
   
   xorg_application_context = ags_application_context_get_instance();
 
-  /* retrieve machine */
+  /* retrieve machine */  
   list_start = gtk_container_get_children(xorg_application_context->window->machines);
   list = g_list_nth(list_start,
 		    nth_machine);
@@ -1681,41 +4437,90 @@ ags_functional_test_util_machine_properties_open(guint nth_machine)
   }else{
     return(FALSE);
   }
-  
+
   g_list_free(list_start);
 
-  /* activate destroy */
-  success = ags_functional_test_util_menu_tool_button_click(machine->menu_tool_button);
+  /* get notebook tab */
+  pthread_mutex_lock(task_thread->launch_mutex);
 
-  success = ags_functional_test_util_menu_click(machine->popup,
-						"properties\0");
+  machine_editor = machine->properties;
 
-  return(success);
-}
+  nth_tab = gtk_notebook_get_current_page(machine_editor->notebook);
 
-gboolean
-ags_functional_test_util_machine_properties_close(guint nth_machine)
-{
-  //TODO:JK: 
+  switch(nth_tab){
+  case AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_OUTPUT_TAB:
+    {
+      property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(machine_editor->output_link_editor);
+    }
+    break;
+  case AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_INPUT_TAB:
+    {
+      property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(machine_editor->input_link_editor);
+    }
+    break;
+  default:
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  /* get bulk editor */
+  list_start = gtk_container_get_children(property_collection_editor->child);
+  list = g_list_nth(list_start,
+		    nth_bulk);
+
+  if(list != NULL){
+    GtkTable *table;
+    
+    table = list->data;
+    g_list_free(list_start);
+
+    link_collection_editor = g_object_get_data(table,
+					       "AgsChild\0");
+  }else{
+    g_list_free(list_start);
+
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  gtk_spin_button_set_value(link_collection_editor->first_line,
+			    first_line);
+
+  pthread_mutex_unlock(task_thread->launch_mutex);
+
+  ags_functional_test_util_reaction_time_long();
+
+  return(TRUE);
 }
 
 gboolean
-ags_functional_test_util_machine_properties_click_tab(guint nth_machine,
-						      guint nth_tab)
+ags_functional_test_util_machine_properties_bulk_link_line(guint nth_machine,
+							   guint nth_bulk,
+							   guint first_link_line)
 {
   AgsXorgApplicationContext *xorg_application_context;
   AgsMachine *machine;
   AgsMachineEditor *machine_editor;
-  
+  AgsPropertyCollectionEditor *property_collection_editor;
+  AgsLinkCollectionEditor *link_collection_editor;
+
   GList *list_start, *list;
+
+  GtkTreeModel *model;
   
-  gboolean success;
+  GtkTreeIter iter;
+
+  gchar *value;
 
+  guint nth_tab;
+  
   gdk_threads_enter();
   
   xorg_application_context = ags_application_context_get_instance();
 
-  /* retrieve machine */
+  /* retrieve machine */  
   list_start = gtk_container_get_children(xorg_application_context->window->machines);
   list = g_list_nth(list_start,
 		    nth_machine);
@@ -1731,41 +4536,88 @@ ags_functional_test_util_machine_properties_click_tab(guint nth_machine,
 
   g_list_free(list_start);
 
-  /* click tab */
+  /* get notebook tab */
   pthread_mutex_lock(task_thread->launch_mutex);
 
   machine_editor = machine->properties;
 
-  gtk_notebook_set_current_page(machine_editor->notebook,
-				nth_tab);
+  nth_tab = gtk_notebook_get_current_page(machine_editor->notebook);
+
+  switch(nth_tab){
+  case AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_OUTPUT_TAB:
+    {
+      property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(machine_editor->output_link_editor);
+    }
+    break;
+  case AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_INPUT_TAB:
+    {
+      property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(machine_editor->input_link_editor);
+    }
+    break;
+  default:
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  /* get bulk editor */
+  list_start = gtk_container_get_children(property_collection_editor->child);
+  list = g_list_nth(list_start,
+		    nth_bulk);
+
+  if(list != NULL &&
+     AGS_IS_LINK_COLLECTION_EDITOR(list->data)){
+    GtkTable *table;
+    
+    table = list->data;
+    g_list_free(list_start);
+
+    link_collection_editor = g_object_get_data(table,
+					       "AgsChild\0");
+  }else{
+    g_list_free(list_start);
+
+    pthread_mutex_unlock(task_thread->launch_mutex);
+
+    return(FALSE);
+  }
+
+  gtk_spin_button_set_value(link_collection_editor->first_link,
+			    first_link_line);
 
   pthread_mutex_unlock(task_thread->launch_mutex);
 
-  ags_functional_test_util_idle();
+  ags_functional_test_util_reaction_time_long();
 
   return(TRUE);
 }
 
 gboolean
-ags_functional_test_util_machine_properties_click_enable(guint nth_machine)
+ags_functional_test_util_machine_properties_bulk_count(guint nth_machine,
+						       guint nth_bulk,
+						       guint count)
 {
   AgsXorgApplicationContext *xorg_application_context;
   AgsMachine *machine;
   AgsMachineEditor *machine_editor;
-  GtkButton *enable_button;
-  
+  AgsPropertyCollectionEditor *property_collection_editor;
+  AgsLinkCollectionEditor *link_collection_editor;
+
   GList *list_start, *list;
 
-  guint nth_tab;
-  gboolean success;
+  GtkTreeModel *model;
+  
+  GtkTreeIter iter;
 
+  gchar *value;
+
+  guint nth_tab;
+  
   gdk_threads_enter();
   
   xorg_application_context = ags_application_context_get_instance();
 
-  /* retrieve machine */
-  enable_button = NULL;
-  
+  /* retrieve machine */  
   list_start = gtk_container_get_children(xorg_application_context->window->machines);
   list = g_list_nth(list_start,
 		    nth_machine);
@@ -1781,7 +4633,7 @@ ags_functional_test_util_machine_properties_click_enable(guint nth_machine)
 
   g_list_free(list_start);
 
-  /* click tab */
+  /* get notebook tab */
   pthread_mutex_lock(task_thread->launch_mutex);
 
   machine_editor = machine->properties;
@@ -1789,153 +4641,51 @@ ags_functional_test_util_machine_properties_click_enable(guint nth_machine)
   nth_tab = gtk_notebook_get_current_page(machine_editor->notebook);
 
   switch(nth_tab){
-  case 0:
-    {
-      enable_button = AGS_PROPERTY_EDITOR(machine_editor->output_editor)->enabled;
-    }
-    break;
-  case 1:
+  case AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_OUTPUT_TAB:
     {
-      enable_button = AGS_PROPERTY_EDITOR(machine_editor->input_editor)->enabled;
-    }
-    break;
-  case 2:
-    {
-      enable_button = AGS_PROPERTY_EDITOR(machine_editor->output_link_editor)->enabled;
-    }
-    break;
-  case 3:
-    {
-      enable_button = AGS_PROPERTY_EDITOR(machine_editor->input_link_editor)->enabled;
+      property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(machine_editor->output_link_editor);
     }
     break;
-  case 4:
+  case AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_INPUT_TAB:
     {
-      enable_button = AGS_PROPERTY_EDITOR(machine_editor->resize_editor)->enabled;
+      property_collection_editor = AGS_PROPERTY_COLLECTION_EDITOR(machine_editor->input_link_editor);
     }
     break;
-  }
-  
-  pthread_mutex_unlock(task_thread->launch_mutex);
+  default:
+    pthread_mutex_unlock(task_thread->launch_mutex);
 
-  success = ags_functional_test_util_button_click(enable_button);
-
-  return(success);
-}
-
-gboolean
-ags_functional_test_util_machine_properties_link_set(guint nth_machine,
-						     guint pad, guint audio_channel,
-						     gchar *link_name, guint link_nth_line)
-{
-  //TODO:JK: 
-}
-
-gboolean
-ags_functional_test_util_machine_properties_link_open(guint nth_machine,
-						      guint pad, guint audio_channel)
-{
-  //TODO:JK: 
-}
-
-gboolean
-ags_functional_test_util_machine_properties_effect_add(guint nth_machine,
-						       guint pad, guint audio_channel)
-{
-  //TODO:JK: 
-}
-
-gboolean
-ags_functional_test_util_machine_properties_effect_remove(guint nth_machine,
-							  guint pad, guint audio_channel,
-							  guint nth)
-{
-  //TODO:JK: 
-}
-
-gboolean
-ags_functional_test_util_machine_properties_effect_plugin_type(guint nth_machine,
-							       guint pad, guint audio_channel,
-							       gchar *plugin_type)
-{
-  //TODO:JK: 
-}
-
-gboolean
-ags_functional_test_util_machine_properties_ladspa_filename(guint nth_machine,
-							    guint pad, guint audio_channel,
-							    gchar *filename)
-{
-  //TODO:JK: 
-}
+    return(FALSE);
+  }
 
-gboolean
-ags_functional_test_util_machine_properties_ladspa_effect(guint nth_machine,
-							  guint pad, guint audio_channel,
-							  gchar *effect)
-{
-  //TODO:JK: 
-}
+  /* get bulk editor */
+  list_start = gtk_container_get_children(property_collection_editor->child);
+  list = g_list_nth(list_start,
+		    nth_bulk);
 
-gboolean
-ags_functional_test_util_machine_properties_lv2_filename(guint nth_machine,
-							 guint pad, guint audio_channel,
-							 gchar *filename)
-{
-  //TODO:JK: 
-}
+  if(list != NULL){
+    GtkTable *table;
+    
+    table = list->data;
+    g_list_free(list_start);
 
-gboolean
-ags_functional_test_util_machine_properties_lv2_effect(guint nth_machine,
-						       guint pad, guint audio_channel,
-						       gchar *effect)
-{
-  //TODO:JK: 
-}
+    link_collection_editor = g_object_get_data(table,
+					       "AgsChild\0");
+  }else{
+    g_list_free(list_start);
 
-gboolean
-ags_functional_test_util_machine_properties_bulk_add(guint nth_machine)
-{
-  //TODO:JK: 
-}
+    pthread_mutex_unlock(task_thread->launch_mutex);
 
-gboolean
-ags_functional_test_util_machine_properties_bulk_remove(guint nth_machine,
-							guint nth_bulk)
-{
-  //TODO:JK: 
-}
+    return(FALSE);
+  }
 
-gboolean
-ags_functional_test_util_machine_properties_bulk_link(guint nth_machine,
-						      guint nth_bulk,
-						      gchar *link)
-{
-  //TODO:JK: 
-}
+  gtk_spin_button_set_value(link_collection_editor->count,
+			    count);
 
-gboolean
-ags_functional_test_util_machine_properties_bulk_first_line(guint nth_machine,
-							    guint nth_bulk,
-							    guint first_line)
-{
-  //TODO:JK: 
-}
+  pthread_mutex_unlock(task_thread->launch_mutex);
 
-gboolean
-ags_functional_test_util_machine_properties_bulk_link_line(guint nth_machine,
-							   guint nth_bulk,
-							   guint first_link_line)
-{
-  //TODO:JK: 
-}
+  ags_functional_test_util_reaction_time_long();
 
-gboolean
-ags_functional_test_util_machine_properties_bulk_count(guint nth_machine,
-						       guint nth_bulk,
-						       guint count)
-{
-  //TODO:JK: 
+  return(TRUE);
 }
 
 gboolean
@@ -1977,7 +4727,7 @@ ags_functional_test_util_machine_properties_resize_audio_channels(guint nth_mach
 
   pthread_mutex_unlock(task_thread->launch_mutex);
 
-  ags_functional_test_util_idle();
+  ags_functional_test_util_reaction_time_long();
 
   return(TRUE);
 }
@@ -2021,7 +4771,7 @@ ags_functional_test_util_machine_properties_resize_inputs(guint nth_machine,
 
   pthread_mutex_unlock(task_thread->launch_mutex);
 
-  ags_functional_test_util_idle();
+  ags_functional_test_util_reaction_time_long();
 
   return(TRUE);
 }
@@ -2065,7 +4815,7 @@ ags_functional_test_util_machine_properties_resize_outputs(guint nth_machine,
 
   pthread_mutex_unlock(task_thread->launch_mutex);
 
-  ags_functional_test_util_idle();
+  ags_functional_test_util_reaction_time_long();
 
   return(TRUE);
 }
@@ -2295,7 +5045,8 @@ ags_functional_test_util_drum_open(guint nth_machine)
   AgsXorgApplicationContext *xorg_application_context;
   AgsDrum *drum;
   GtkButton *open_button;
-
+  GtkWidget **open_dialog;
+  
   GList *list_start, *list;
   
   gboolean success;
@@ -2324,11 +5075,16 @@ ags_functional_test_util_drum_open(guint nth_machine)
   pthread_mutex_lock(task_thread->launch_mutex);
   
   open_button = drum->open;
-
+  open_dialog = &(drum->open_dialog);
+  
   pthread_mutex_unlock(task_thread->launch_mutex);
 
   /* click open */
   success = ags_functional_test_util_button_click(open_button);
+
+  ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_widget_visible),
+						      &ags_functional_test_util_default_timeout,
+						      open_dialog);
   
   return(success);
 }
@@ -2507,7 +5263,8 @@ ags_functional_test_util_ffplayer_open(guint nth_machine)
   AgsXorgApplicationContext *xorg_application_context;
   AgsFFPlayer *ffplayer;
   GtkButton *open_button;
-
+  GtkWidget **open_dialog;
+  
   GList *list_start, *list;
   
   gboolean success;
@@ -2536,11 +5293,16 @@ ags_functional_test_util_ffplayer_open(guint nth_machine)
   pthread_mutex_lock(task_thread->launch_mutex);
   
   open_button = ffplayer->open;
+  open_dialog = &(ffplayer->open_dialog);
 
   pthread_mutex_unlock(task_thread->launch_mutex);
 
   /* click open */
   success = ags_functional_test_util_button_click(open_button);
+
+  ags_functional_test_util_idle_condition_and_timeout(AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(ags_functional_test_util_idle_test_widget_visible),
+						      &ags_functional_test_util_default_timeout,
+						      open_dialog);
   
   return(success);
 }
diff --git a/ags/test/X/ags_functional_test_util.h b/ags/test/X/ags_functional_test_util.h
index 2da381b..05b7036 100644
--- a/ags/test/X/ags_functional_test_util.h
+++ b/ags/test/X/ags_functional_test_util.h
@@ -25,8 +25,46 @@
 
 #include <gtk/gtk.h>
 
+#define AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_OUTPUT_TAB (0)
+#define AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_INPUT_TAB (1)
+#define AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_OUTPUT_TAB (2)
+#define AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_BULK_INPUT_TAB (3)
+#define AGS_FUNCTIONAL_TEST_UTIL_MACHINE_PROPERTIES_RESIZE_TAB (4)
+
+#define AGS_FUNCTIONAL_TEST_UTIL_TOOLBAR_ZOOM_4_TO_1 (0)
+#define AGS_FUNCTIONAL_TEST_UTIL_TOOLBAR_ZOOM_2_TO_1 (1)
+#define AGS_FUNCTIONAL_TEST_UTIL_TOOLBAR_ZOOM_1_TO_1 (2)
+#define AGS_FUNCTIONAL_TEST_UTIL_TOOLBAR_ZOOM_1_TO_2 (3)
+#define AGS_FUNCTIONAL_TEST_UTIL_TOOLBAR_ZOOM_1_TO_4 (4)
+#define AGS_FUNCTIONAL_TEST_UTIL_TOOLBAR_ZOOM_1_TO_8 (5)
+#define AGS_FUNCTIONAL_TEST_UTIL_TOOLBAR_ZOOM_1_TO_16 (6)
+
+#define AGS_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(f) ((AgsFunctionalTestUtilIdleCondition)(f))
+
+typedef struct _AgsFunctionalTestUtilContainerTest AgsFunctionalTestUtilContainerTest;
+
+typedef gboolean (*AgsFunctionalTestUtilIdleCondition)(gpointer data);
+
+struct _AgsFunctionalTestUtilContainerTest
+{
+  GtkContainer **container;
+
+  guint count;
+};
+
 void ags_functional_test_util_setup_and_launch();
+void ags_functional_test_util_setup_and_launch_filename(gchar *filename);
+void ags_functional_test_util_reaction_time();
+void ags_functional_test_util_reaction_time_long();
 void ags_functional_test_util_idle();
+void ags_functional_test_util_idle_condition_and_timeout(AgsFunctionalTestUtilIdleCondition idle_condition,
+							 struct timespec *timeout,
+							 gpointer data);
+
+gboolean ags_functional_test_util_idle_test_widget_visible(GtkWidget **widget);
+gboolean ags_functional_test_util_idle_test_widget_hidden(GtkWidget **widget);
+gboolean ags_functional_test_util_idle_test_container_children_count(AgsFunctionalTestUtilContainerTest *container_test);
+gboolean ags_functional_test_util_idle_test_null(GtkWidget **widget);
 
 GtkMenu* ags_functional_test_util_submenu_find(GtkMenu *menu,
 					       gchar *item_label);
@@ -34,6 +72,9 @@ gboolean ags_functional_test_util_menu_bar_click(gchar *item_label);
 gboolean ags_functional_test_util_menu_click(GtkMenu *menu,
 					     gchar *item_label);
 
+gboolean ags_functional_test_util_combo_box_click(GtkComboBox *combo_box,
+						  guint nth);
+
 gboolean ags_functional_test_util_button_click(GtkButton *button);
 
 /* generic dialog */
@@ -52,6 +93,10 @@ gboolean ags_functional_test_util_file_chooser_select_filenames(GtkFileChooser *
 								GSList *filename);
 gboolean ags_functional_test_util_file_chooser_select_all(GtkFileChooser *file_chooser);
 
+/* UI control */
+gboolean ags_functional_test_util_file_default_window_resize();
+gboolean ags_functional_test_util_file_default_editor_resize();
+
 /* file */
 gboolean ags_functional_test_util_open();
 
@@ -127,10 +172,10 @@ gboolean ags_functional_test_util_toolbar_cut_click();
 gboolean ags_functional_test_util_toolbar_zoom(guint nth_zoom);
 
 /* machine selector */
-gboolean ags_functional_test_util_machine_selector_select(guint nth_machine);
+gboolean ags_functional_test_util_machine_selector_select(guint nth_index);
 
 /* machine selection */
-gboolean ags_functional_test_util_machine_selection_select(guint nth_machine);
+gboolean ags_functional_test_util_machine_selection_select(gchar *machine);
 
 gboolean ags_functional_test_util_machine_selection_remove_index();
 gboolean ags_functional_test_util_machine_selection_add_index();
@@ -139,25 +184,19 @@ gboolean ags_functional_test_util_machine_selection_reverse_mapping();
 gboolean ags_functional_test_util_machine_selection_shift_piano(guint nth_shift);
 
 /* pattern edit */
-gboolean ags_functional_test_util_pattern_edit_delete_point(guint nth_index,
-							    guint x,
+gboolean ags_functional_test_util_pattern_edit_delete_point(guint x,
 							    guint y);
-gboolean ags_functional_test_util_pattern_edit_add_point(guint nth_index,
-							 guint x,
+gboolean ags_functional_test_util_pattern_edit_add_point(guint x,
 							 guint y);
-gboolean ags_functional_test_util_pattern_edit_select_region(guint nth_index,
-							     guint x0, guint x1,
+gboolean ags_functional_test_util_pattern_edit_select_region(guint x0, guint x1,
 							     guint y0, guint y1);
 
 /* note edit */
-gboolean ags_functional_test_util_note_edit_delete_point(guint nth_index,
-							 guint x,
+gboolean ags_functional_test_util_note_edit_delete_point(guint x,
 							 guint y);
-gboolean ags_functional_test_util_note_edit_add_point(guint nth_index,
-						      guint x0, guint x1,
+gboolean ags_functional_test_util_note_edit_add_point(guint x0, guint x1,
 						      guint y);
-gboolean ags_functional_test_util_note_edit_select_region(guint nth_index,
-							  guint x0, guint x1,
+gboolean ags_functional_test_util_note_edit_select_region(guint x0, guint x1,
 							  guint y0, guint y1);
 
 /* automation toolbar */
@@ -202,8 +241,11 @@ gboolean ags_functional_test_util_machine_rename_close(guint nth_machine);
 gboolean ags_functional_test_util_machine_rename_set_name(guint nth_machine,
 							  gchar *name);
 
+GtkWidget* ags_functional_test_util_get_line_editor(GtkWidget *machine_editor,
+						    guint nth_pad, guint nth_audio_channel,
+						    gboolean is_output);
+
 gboolean ags_functional_test_util_machine_properties_open(guint nth_machine);
-gboolean ags_functional_test_util_machine_properties_close(guint nth_machine);
 
 gboolean ags_functional_test_util_machine_properties_click_tab(guint nth_machine,
 							       guint nth_tab);
@@ -219,7 +261,7 @@ gboolean ags_functional_test_util_machine_properties_effect_add(guint nth_machin
 								guint pad, guint audio_channel);
 gboolean ags_functional_test_util_machine_properties_effect_remove(guint nth_machine,
 								   guint pad, guint audio_channel,
-								   guint nth);
+								   guint nth_effect);
 
 gboolean ags_functional_test_util_machine_properties_effect_plugin_type(guint nth_machine,
 									guint pad, guint audio_channel,
diff --git a/ags/test/X/gsequencer_setup_util.c b/ags/test/X/gsequencer_setup_util.c
index 683db73..28089d0 100644
--- a/ags/test/X/gsequencer_setup_util.c
+++ b/ags/test/X/gsequencer_setup_util.c
@@ -626,7 +626,7 @@ ags_test_launch_filename(gchar *filename,
       }
     
       pthread_mutex_unlock(audio_loop->start_mutex);
-      
+
       /* start gui thread */
       ags_thread_start(gui_thread);
 
@@ -669,7 +669,7 @@ ags_test_launch_filename(gchar *filename,
       /* now start read task */
       simple_file_read = ags_simple_file_read_new(simple_file);
       ags_task_thread_append_task((AgsTaskThread *) task_thread,
-				  (AgsTask *) simple_file_read);
+				  (AgsTask *) simple_file_read);      
     }else{
       AgsFile *file;
 
@@ -694,8 +694,4 @@ ags_test_launch_filename(gchar *filename,
       ags_file_close(file);
     }
   }
-
-  if(!single_thread){
-    ags_thread_start(gui_thread);    
-  }
 }
diff --git a/ags/util/ags_list_util.c b/ags/util/ags_list_util.c
index 7676364..8adb148 100644
--- a/ags/util/ags_list_util.c
+++ b/ags/util/ags_list_util.c
@@ -28,7 +28,7 @@ ags_list_util_find_type(GList *list,
   }
   
   while(list != NULL){
-    if(g_type_is_a(list->data,
+    if(g_type_is_a(G_OBJECT_TYPE(G_OBJECT(list->data)),
 		   gtype)){
       return(list);
     }
@@ -48,7 +48,7 @@ ags_list_util_copy_and_ref(GList *list)
     list_start = g_list_copy(list);
   
   while(list != NULL){
-    g_object_ref(list->data);
+    g_object_ref(G_OBJECT(list->data));
     
     list = list->next;
   }
diff --git a/ags/widget/ags_expander.c b/ags/widget/ags_expander.c
index 1e61c8b..50c6bab 100644
--- a/ags/widget/ags_expander.c
+++ b/ags/widget/ags_expander.c
@@ -443,8 +443,7 @@ ags_expander_insert_child(AgsExpander *expander,
 		   child->child,
 		   child->x, child->x + child->width,
 		   child->y, child->y + child->height,
-		   0,
-		   0,
+		   GTK_FILL, GTK_FILL,
 		   0, 0);
 
   expander->children = g_list_insert(expander->children,
diff --git a/configure b/configure
index 47196ef..37aeca5 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for gsequencer 0.7.122.16.
+# Generated by GNU Autoconf 2.69 for gsequencer 0.7.122.20.
 #
 # Report bugs to <jkraehemann-guest at users.alioth.debian.org>.
 #
@@ -590,8 +590,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='gsequencer'
 PACKAGE_TARNAME='gsequencer'
-PACKAGE_VERSION='0.7.122.16'
-PACKAGE_STRING='gsequencer 0.7.122.16'
+PACKAGE_VERSION='0.7.122.20'
+PACKAGE_STRING='gsequencer 0.7.122.20'
 PACKAGE_BUGREPORT='jkraehemann-guest at users.alioth.debian.org'
 PACKAGE_URL=''
 
@@ -695,6 +695,8 @@ PKG_CONFIG_PATH
 PKG_CONFIG
 ALLOCA
 XMKMF
+GSEQUENCER_FUNCTIONAL_TEST_LDADD
+LIBGSEQUENCER_TEST_LIBADD
 MIDI2XML_LDFLAGS
 MIDI2XML_CFLAGS
 GSEQUENCER_LDFLAGS
@@ -1436,7 +1438,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures gsequencer 0.7.122.16 to adapt to many kinds of systems.
+\`configure' configures gsequencer 0.7.122.20 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1511,7 +1513,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of gsequencer 0.7.122.16:";;
+     short | recursive ) echo "Configuration of gsequencer 0.7.122.20:";;
    esac
   cat <<\_ACEOF
 
@@ -1698,7 +1700,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-gsequencer configure 0.7.122.16
+gsequencer configure 0.7.122.20
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2175,7 +2177,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by gsequencer $as_me 0.7.122.16, which was
+It was created by gsequencer $as_me 0.7.122.20, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3041,7 +3043,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='gsequencer'
- VERSION='0.7.122.16'
+ VERSION='0.7.122.20'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -12328,6 +12330,11 @@ fi
 
 
 
+
+
+
+
+
 # Checks for libraries.
 # FIXME: Replace `main' with a function in `-lX11':
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lX11" >&5
@@ -15849,7 +15856,7 @@ fi
 
 
 
-ac_config_files="$ac_config_files Makefile docs/reference/libags/Makefile docs/reference/libags-audio/Makefile docs/reference/libags-gui/Makefile docs/reference/libgsequencer/Makefile libags.pc libags_audio.pc libags_gui.pc libgsequencer.pc"
+ac_config_files="$ac_config_files Makefile functional-system-tests.mk docs/reference/libags/Makefile docs/reference/libags-audio/Makefile docs/reference/libags-gui/Makefile docs/reference/libgsequencer/Makefile libags.pc libags_audio.pc libags_gui.pc libgsequencer.pc"
 
 
 cat >confcache <<\_ACEOF
@@ -16406,7 +16413,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by gsequencer $as_me 0.7.122.16, which was
+This file was extended by gsequencer $as_me 0.7.122.20, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -16472,7 +16479,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-gsequencer config.status 0.7.122.16
+gsequencer config.status 0.7.122.20
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -16888,6 +16895,7 @@ do
     "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
     "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
     "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "functional-system-tests.mk") CONFIG_FILES="$CONFIG_FILES functional-system-tests.mk" ;;
     "docs/reference/libags/Makefile") CONFIG_FILES="$CONFIG_FILES docs/reference/libags/Makefile" ;;
     "docs/reference/libags-audio/Makefile") CONFIG_FILES="$CONFIG_FILES docs/reference/libags-audio/Makefile" ;;
     "docs/reference/libags-gui/Makefile") CONFIG_FILES="$CONFIG_FILES docs/reference/libags-gui/Makefile" ;;
diff --git a/configure.ac b/configure.ac
index 762da5c..206048d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -6,7 +6,7 @@
 # Process this file with autoconf to produce a configure script.
 
 AC_PREREQ([2.69])
-AC_INIT([gsequencer],[0.7.122.16],[jkraehemann-guest at users.alioth.debian.org])
+AC_INIT([gsequencer],[0.7.122.20],[jkraehemann-guest at users.alioth.debian.org])
 AM_INIT_AUTOMAKE([subdir-objects])
 AC_CONFIG_SRCDIR([config.h.in])
 AC_CONFIG_HEADERS([ags/config.h])
@@ -41,9 +41,14 @@ AC_ENABLE_SHARED
 
 AC_SUBST([GSEQUENCER_CFLAGS])
 AC_SUBST([GSEQUENCER_LDFLAGS])
+
 AC_SUBST([MIDI2XML_CFLAGS])
 AC_SUBST([MIDI2XML_LDFLAGS])
 
+AC_SUBST([LIBGSEQUENCER_TEST_LIBADD])
+
+AC_SUBST([GSEQUENCER_FUNCTIONAL_TEST_LDADD])
+
 # Checks for libraries.
 # FIXME: Replace `main' with a function in `-lX11':
 AC_CHECK_LIB([X11], [main])
@@ -186,6 +191,7 @@ AM_CONDITIONAL([ENABLE_GTK_DOC], false)
 AM_EXTRA_RECURSIVE_TARGETS([ags-docs])
 AC_CONFIG_FILES([
 Makefile
+functional-system-tests.mk
 docs/reference/libags/Makefile
 docs/reference/libags-audio/Makefile
 docs/reference/libags-gui/Makefile
diff --git a/docs/reference/libags-audio/Makefile.in b/docs/reference/libags-audio/Makefile.in
index 0496291..d65c4b9 100644
--- a/docs/reference/libags-audio/Makefile.in
+++ b/docs/reference/libags-audio/Makefile.in
@@ -376,6 +376,7 @@ GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
 GOBJECT_LIBS = @GOBJECT_LIBS@
 GREP = @GREP@
 GSEQUENCER_CFLAGS = @GSEQUENCER_CFLAGS@
+GSEQUENCER_FUNCTIONAL_TEST_LDADD = @GSEQUENCER_FUNCTIONAL_TEST_LDADD@
 GSEQUENCER_LDFLAGS = @GSEQUENCER_LDFLAGS@
 GTKDOC_CHECK = @GTKDOC_CHECK@
 GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
@@ -397,6 +398,7 @@ LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBASOUND2_CFLAGS = @LIBASOUND2_CFLAGS@
 LIBASOUND2_LIBS = @LIBASOUND2_LIBS@
+LIBGSEQUENCER_TEST_LIBADD = @LIBGSEQUENCER_TEST_LIBADD@
 LIBINSTPATCH_CFLAGS = @LIBINSTPATCH_CFLAGS@
 LIBINSTPATCH_LIBS = @LIBINSTPATCH_LIBS@
 LIBOBJS = @LIBOBJS@
diff --git a/docs/reference/libags-gui/Makefile.in b/docs/reference/libags-gui/Makefile.in
index 444d38c..0ef84cd 100644
--- a/docs/reference/libags-gui/Makefile.in
+++ b/docs/reference/libags-gui/Makefile.in
@@ -376,6 +376,7 @@ GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
 GOBJECT_LIBS = @GOBJECT_LIBS@
 GREP = @GREP@
 GSEQUENCER_CFLAGS = @GSEQUENCER_CFLAGS@
+GSEQUENCER_FUNCTIONAL_TEST_LDADD = @GSEQUENCER_FUNCTIONAL_TEST_LDADD@
 GSEQUENCER_LDFLAGS = @GSEQUENCER_LDFLAGS@
 GTKDOC_CHECK = @GTKDOC_CHECK@
 GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
@@ -397,6 +398,7 @@ LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBASOUND2_CFLAGS = @LIBASOUND2_CFLAGS@
 LIBASOUND2_LIBS = @LIBASOUND2_LIBS@
+LIBGSEQUENCER_TEST_LIBADD = @LIBGSEQUENCER_TEST_LIBADD@
 LIBINSTPATCH_CFLAGS = @LIBINSTPATCH_CFLAGS@
 LIBINSTPATCH_LIBS = @LIBINSTPATCH_LIBS@
 LIBOBJS = @LIBOBJS@
diff --git a/docs/reference/libags/Makefile.in b/docs/reference/libags/Makefile.in
index fd5c5ef..3f4d5f2 100644
--- a/docs/reference/libags/Makefile.in
+++ b/docs/reference/libags/Makefile.in
@@ -376,6 +376,7 @@ GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
 GOBJECT_LIBS = @GOBJECT_LIBS@
 GREP = @GREP@
 GSEQUENCER_CFLAGS = @GSEQUENCER_CFLAGS@
+GSEQUENCER_FUNCTIONAL_TEST_LDADD = @GSEQUENCER_FUNCTIONAL_TEST_LDADD@
 GSEQUENCER_LDFLAGS = @GSEQUENCER_LDFLAGS@
 GTKDOC_CHECK = @GTKDOC_CHECK@
 GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
@@ -397,6 +398,7 @@ LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBASOUND2_CFLAGS = @LIBASOUND2_CFLAGS@
 LIBASOUND2_LIBS = @LIBASOUND2_LIBS@
+LIBGSEQUENCER_TEST_LIBADD = @LIBGSEQUENCER_TEST_LIBADD@
 LIBINSTPATCH_CFLAGS = @LIBINSTPATCH_CFLAGS@
 LIBINSTPATCH_LIBS = @LIBINSTPATCH_LIBS@
 LIBOBJS = @LIBOBJS@
diff --git a/docs/reference/libgsequencer/Makefile.in b/docs/reference/libgsequencer/Makefile.in
index 78bf109..24e7b0c 100644
--- a/docs/reference/libgsequencer/Makefile.in
+++ b/docs/reference/libgsequencer/Makefile.in
@@ -376,6 +376,7 @@ GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
 GOBJECT_LIBS = @GOBJECT_LIBS@
 GREP = @GREP@
 GSEQUENCER_CFLAGS = @GSEQUENCER_CFLAGS@
+GSEQUENCER_FUNCTIONAL_TEST_LDADD = @GSEQUENCER_FUNCTIONAL_TEST_LDADD@
 GSEQUENCER_LDFLAGS = @GSEQUENCER_LDFLAGS@
 GTKDOC_CHECK = @GTKDOC_CHECK@
 GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
@@ -397,6 +398,7 @@ LD = @LD@
 LDFLAGS = @LDFLAGS@
 LIBASOUND2_CFLAGS = @LIBASOUND2_CFLAGS@
 LIBASOUND2_LIBS = @LIBASOUND2_LIBS@
+LIBGSEQUENCER_TEST_LIBADD = @LIBGSEQUENCER_TEST_LIBADD@
 LIBINSTPATCH_CFLAGS = @LIBINSTPATCH_CFLAGS@
 LIBINSTPATCH_LIBS = @LIBINSTPATCH_LIBS@
 LIBOBJS = @LIBOBJS@
diff --git a/functional-system-tests.mk.am b/functional-system-tests.mk.am
new file mode 100644
index 0000000..e1f42f5
--- /dev/null
+++ b/functional-system-tests.mk.am
@@ -0,0 +1,127 @@
+# libadd and ldadd
+libgsequencer_check_system_test_LIBADD = -L$(libdir) -lags -lags_audio -lags_gui -L$(libdir)/gsequencer/ -lgsequencer -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+
+gsequencer_check_system_functional_test_LDADD = -lags -lags_audio -lags_gui -L$(DESTDIR)/$(libdir)/gsequencer/ -lgsequencer libgsequencer_check_system_test.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+
+noinst_LTLIBRARIES = libgsequencer_check_system_test.la
+
+# functional system tests - edit target
+installcheck_programs = \
+	ags_check_system_functional_audio_test \
+	ags_check_system_functional_machine_add_and_destroy_test \
+	ags_check_system_functional_machine_link_test \
+	ags_check_system_functional_line_member_add_and_destroy_test \
+	ags_check_system_functional_editor_workflow_test \
+	ags_check_system_functional_panel_test \
+	ags_check_system_functional_mixer_test \
+	ags_check_system_functional_drum_test \
+	ags_check_system_functional_matrix_test \
+	ags_check_system_functional_synth_test \
+	ags_check_system_functional_ffplayer_test \
+	ags_check_system_functional_note_edit_test
+
+noinst_PROGRAMS = $(installcheck_programs)
+
+# functional test util library
+libgsequencer_check_system_test_la_SOURCES = ags/test/X/gsequencer_setup_util.c ags/test/X/gsequencer_setup_util.h ags/test/X/ags_functional_test_util.c ags/test/X/ags_functional_test_util.h ags/test/X/libgsequencer.h
+libgsequencer_check_system_test_la_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+libgsequencer_check_system_test_la_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+libgsequencer_check_system_test_la_LIBADD = $(libgsequencer_check_system_test_LIBADD)
+
+# functional audio test
+ags_check_system_functional_audio_test_SOURCES = ags/test/audio/ags_functional_audio_test.c
+ags_check_system_functional_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS)
+ags_check_system_functional_audio_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_audio_test_LDADD = $(gsequencer_check_system_functional_test_LDADD)
+
+# functional machine add and destroy test
+ags_check_system_functional_machine_add_and_destroy_test_SOURCES = ags/test/X/ags_functional_machine_add_and_destroy_test.c
+ags_check_system_functional_machine_add_and_destroy_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_check_system_functional_machine_add_and_destroy_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_check_system_functional_machine_add_and_destroy_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_machine_add_and_destroy_test_LDADD = $(gsequencer_check_system_functional_test_LDADD)
+
+# functional machine link test
+ags_check_system_functional_machine_link_test_SOURCES = ags/test/X/ags_check_system_functional_machine_link_test.c
+ags_check_system_functional_machine_link_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_check_system_functional_machine_link_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_check_system_functional_machine_link_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_machine_link_test_LDADD = $(gsequencer_functional_test_LDADD)
+
+# functional line member add and destroy test
+ags_check_system_functional_line_member_add_and_destroy_test_SOURCES = ags/test/X/ags_functional_line_member_add_and_destroy_test.c
+ags_check_system_functional_line_member_add_and_destroy_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_check_system_functional_line_member_add_and_destroy_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_check_system_functional_line_member_add_and_destroy_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_line_member_add_and_destroy_test_LDADD = $(gsequencer_check_system_functional_test_LDADD)
+
+# functional editor workflow test
+ags_check_system_functional_editor_workflow_test_SOURCES = ags/test/X/ags_functional_editor_workflow_test.c
+ags_check_system_functional_editor_workflow_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_check_system_functional_editor_workflow_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_check_system_functional_editor_workflow_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_editor_workflow_test_LDADD = $(gsequencer_check_system_functional_test_LDADD)
+
+# functional panel test
+ags_check_system_functional_panel_test_SOURCES = ags/test/X/machine/ags_functional_panel_test.c
+ags_check_system_functional_panel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_check_system_functional_panel_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_check_system_functional_panel_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_panel_test_LDADD = $(gsequencer_check_system_functional_test_LDADD)
+
+# functional mixer test
+ags_check_system_functional_mixer_test_SOURCES = ags/test/X/machine/ags_functional_mixer_test.c
+ags_check_system_functional_mixer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_check_system_functional_mixer_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_check_system_functional_mixer_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_mixer_test_LDADD = $(gsequencer_check_system_functional_test_LDADD)
+
+# functional drum test
+ags_check_system_functional_drum_test_SOURCES = ags/test/X/machine/ags_functional_drum_test.c
+ags_check_system_functional_drum_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_check_system_functional_drum_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_check_system_functional_drum_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_drum_test_LDADD = $(gsequencer_check_system_functional_test_LDADD)
+
+# functional matrix test
+ags_check_system_functional_matrix_test_SOURCES = ags/test/X/machine/ags_functional_matrix_test.c
+ags_check_system_functional_matrix_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_check_system_functional_matrix_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_check_system_functional_matrix_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_matrix_test_LDADD = $(gsequencer_check_system_functional_test_LDADD)
+
+# functional synth test
+ags_check_system_functional_synth_test_SOURCES = ags/test/X/machine/ags_functional_synth_test.c
+ags_check_system_functional_synth_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_check_system_functional_synth_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_check_system_functional_synth_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_synth_test_LDADD = $(gsequencer_check_system_functional_test_LDADD)
+
+# functional ffplayer test
+ags_check_system_functional_ffplayer_test_SOURCES = ags/test/X/machine/ags_functional_ffplayer_test.c
+ags_check_system_functional_ffplayer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_check_system_functional_ffplayer_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_check_system_functional_ffplayer_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_ffplayer_test_LDADD = $(gsequencer_check_system_functional_test_LDADD)
+
+# functional note edit test
+ags_check_system_functional_note_edit_test_SOURCES = ags/test/X/ags_functional_note_edit_test.c
+ags_check_system_functional_note_edit_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_check_system_functional_note_edit_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_check_system_functional_note_edit_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_note_edit_test_LDADD = $(gsequencer_check_system_functional_test_LDADD)
+
+ags-check-system: $(installcheck_programs)
+	./ags_check_system_functional_audio_test
+	./ags_check_system_functional_machine_add_and_destroy_test
+	./ags_check_system_functional_machine_link_test
+	./ags_check_system_functional_line_member_add_and_destroy_test
+	./ags_check_system_functional_editor_workflow_test
+	./ags_check_system_functional_panel_test
+	./ags_check_system_functional_mixer_test
+	./ags_check_system_functional_drum_test
+	./ags_check_system_functional_matrix_test
+	./ags_check_system_functional_synth_test
+	./ags_check_system_functional_ffplayer_test
+	./ags_check_system_functional_note_edit_test
+
diff --git a/functional-system-tests.mk.in b/functional-system-tests.mk.in
new file mode 100644
index 0000000..7eaeac6
--- /dev/null
+++ b/functional-system-tests.mk.in
@@ -0,0 +1,1480 @@
+# functional-system-tests.mk.in generated by automake 1.15 from functional-system-tests.mk.am.
+# @configure_input@
+
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+noinst_PROGRAMS = $(am__EXEEXT_1)
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/gtk-doc.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/pkg.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/functional-system-tests.mk.am \
+	$(top_srcdir)/configure $(am__configure_deps) \
+	$(am__DIST_COMMON)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/ags/config.h
+CONFIG_CLEAN_FILES = libags.pc libags_audio.pc libags_gui.pc \
+	libgsequencer.pc
+CONFIG_CLEAN_VPATH_FILES =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+libgsequencer_check_system_test_la_DEPENDENCIES =  \
+	$(am__DEPENDENCIES_2)
+am__dirstamp = $(am__leading_dot)dirstamp
+am_libgsequencer_check_system_test_la_OBJECTS = ags/test/X/libgsequencer_check_system_test_la-gsequencer_setup_util.lo \
+	ags/test/X/libgsequencer_check_system_test_la-ags_functional_test_util.lo
+libgsequencer_check_system_test_la_OBJECTS =  \
+	$(am_libgsequencer_check_system_test_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+libgsequencer_check_system_test_la_LINK = $(LIBTOOL) $(AM_V_lt) \
+	--tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+	$(CCLD) $(libgsequencer_check_system_test_la_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+am__EXEEXT_1 = ags_check_system_functional_audio_test$(EXEEXT) \
+	ags_check_system_functional_machine_add_and_destroy_test$(EXEEXT) \
+	ags_check_system_functional_machine_link_test$(EXEEXT) \
+	ags_check_system_functional_line_member_add_and_destroy_test$(EXEEXT) \
+	ags_check_system_functional_editor_workflow_test$(EXEEXT) \
+	ags_check_system_functional_panel_test$(EXEEXT) \
+	ags_check_system_functional_mixer_test$(EXEEXT) \
+	ags_check_system_functional_drum_test$(EXEEXT) \
+	ags_check_system_functional_matrix_test$(EXEEXT) \
+	ags_check_system_functional_synth_test$(EXEEXT) \
+	ags_check_system_functional_ffplayer_test$(EXEEXT) \
+	ags_check_system_functional_note_edit_test$(EXEEXT)
+PROGRAMS = $(noinst_PROGRAMS)
+am_ags_check_system_functional_audio_test_OBJECTS = ags/test/audio/ags_check_system_functional_audio_test-ags_functional_audio_test.$(OBJEXT)
+ags_check_system_functional_audio_test_OBJECTS =  \
+	$(am_ags_check_system_functional_audio_test_OBJECTS)
+am__DEPENDENCIES_3 = libgsequencer_check_system_test.la \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+ags_check_system_functional_audio_test_DEPENDENCIES =  \
+	$(am__DEPENDENCIES_3)
+ags_check_system_functional_audio_test_LINK = $(LIBTOOL) $(AM_V_lt) \
+	--tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+	$(CCLD) $(ags_check_system_functional_audio_test_CFLAGS) \
+	$(CFLAGS) $(ags_check_system_functional_audio_test_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_ags_check_system_functional_drum_test_OBJECTS = ags/test/X/machine/ags_check_system_functional_drum_test-ags_functional_drum_test.$(OBJEXT)
+ags_check_system_functional_drum_test_OBJECTS =  \
+	$(am_ags_check_system_functional_drum_test_OBJECTS)
+ags_check_system_functional_drum_test_DEPENDENCIES =  \
+	$(am__DEPENDENCIES_3)
+ags_check_system_functional_drum_test_LINK = $(LIBTOOL) $(AM_V_lt) \
+	--tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+	$(CCLD) $(ags_check_system_functional_drum_test_CFLAGS) \
+	$(CFLAGS) $(ags_check_system_functional_drum_test_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_ags_check_system_functional_editor_workflow_test_OBJECTS = ags/test/X/ags_check_system_functional_editor_workflow_test-ags_functional_editor_workflow_test.$(OBJEXT)
+ags_check_system_functional_editor_workflow_test_OBJECTS = $(am_ags_check_system_functional_editor_workflow_test_OBJECTS)
+ags_check_system_functional_editor_workflow_test_DEPENDENCIES =  \
+	$(am__DEPENDENCIES_3)
+ags_check_system_functional_editor_workflow_test_LINK = $(LIBTOOL) \
+	$(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) \
+	$(ags_check_system_functional_editor_workflow_test_CFLAGS) \
+	$(CFLAGS) \
+	$(ags_check_system_functional_editor_workflow_test_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_ags_check_system_functional_ffplayer_test_OBJECTS = ags/test/X/machine/ags_check_system_functional_ffplayer_test-ags_functional_ffplayer_test.$(OBJEXT)
+ags_check_system_functional_ffplayer_test_OBJECTS =  \
+	$(am_ags_check_system_functional_ffplayer_test_OBJECTS)
+ags_check_system_functional_ffplayer_test_DEPENDENCIES =  \
+	$(am__DEPENDENCIES_3)
+ags_check_system_functional_ffplayer_test_LINK = $(LIBTOOL) $(AM_V_lt) \
+	--tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+	$(CCLD) $(ags_check_system_functional_ffplayer_test_CFLAGS) \
+	$(CFLAGS) $(ags_check_system_functional_ffplayer_test_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_ags_check_system_functional_line_member_add_and_destroy_test_OBJECTS = ags/test/X/ags_check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.$(OBJEXT)
+ags_check_system_functional_line_member_add_and_destroy_test_OBJECTS = $(am_ags_check_system_functional_line_member_add_and_destroy_test_OBJECTS)
+ags_check_system_functional_line_member_add_and_destroy_test_DEPENDENCIES =  \
+	$(am__DEPENDENCIES_3)
+ags_check_system_functional_line_member_add_and_destroy_test_LINK =  \
+	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(ags_check_system_functional_line_member_add_and_destroy_test_CFLAGS) \
+	$(CFLAGS) \
+	$(ags_check_system_functional_line_member_add_and_destroy_test_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_ags_check_system_functional_machine_add_and_destroy_test_OBJECTS = ags/test/X/ags_check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.$(OBJEXT)
+ags_check_system_functional_machine_add_and_destroy_test_OBJECTS = $(am_ags_check_system_functional_machine_add_and_destroy_test_OBJECTS)
+ags_check_system_functional_machine_add_and_destroy_test_DEPENDENCIES =  \
+	$(am__DEPENDENCIES_3)
+ags_check_system_functional_machine_add_and_destroy_test_LINK =  \
+	$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(ags_check_system_functional_machine_add_and_destroy_test_CFLAGS) \
+	$(CFLAGS) \
+	$(ags_check_system_functional_machine_add_and_destroy_test_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_ags_check_system_functional_machine_link_test_OBJECTS = ags/test/X/ags_check_system_functional_machine_link_test-ags_check_system_functional_machine_link_test.$(OBJEXT)
+ags_check_system_functional_machine_link_test_OBJECTS =  \
+	$(am_ags_check_system_functional_machine_link_test_OBJECTS)
+ags_check_system_functional_machine_link_test_DEPENDENCIES =
+ags_check_system_functional_machine_link_test_LINK = $(LIBTOOL) \
+	$(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) \
+	$(ags_check_system_functional_machine_link_test_CFLAGS) \
+	$(CFLAGS) \
+	$(ags_check_system_functional_machine_link_test_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_ags_check_system_functional_matrix_test_OBJECTS = ags/test/X/machine/ags_check_system_functional_matrix_test-ags_functional_matrix_test.$(OBJEXT)
+ags_check_system_functional_matrix_test_OBJECTS =  \
+	$(am_ags_check_system_functional_matrix_test_OBJECTS)
+ags_check_system_functional_matrix_test_DEPENDENCIES =  \
+	$(am__DEPENDENCIES_3)
+ags_check_system_functional_matrix_test_LINK = $(LIBTOOL) $(AM_V_lt) \
+	--tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+	$(CCLD) $(ags_check_system_functional_matrix_test_CFLAGS) \
+	$(CFLAGS) $(ags_check_system_functional_matrix_test_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_ags_check_system_functional_mixer_test_OBJECTS = ags/test/X/machine/ags_check_system_functional_mixer_test-ags_functional_mixer_test.$(OBJEXT)
+ags_check_system_functional_mixer_test_OBJECTS =  \
+	$(am_ags_check_system_functional_mixer_test_OBJECTS)
+ags_check_system_functional_mixer_test_DEPENDENCIES =  \
+	$(am__DEPENDENCIES_3)
+ags_check_system_functional_mixer_test_LINK = $(LIBTOOL) $(AM_V_lt) \
+	--tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+	$(CCLD) $(ags_check_system_functional_mixer_test_CFLAGS) \
+	$(CFLAGS) $(ags_check_system_functional_mixer_test_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_ags_check_system_functional_note_edit_test_OBJECTS = ags/test/X/ags_check_system_functional_note_edit_test-ags_functional_note_edit_test.$(OBJEXT)
+ags_check_system_functional_note_edit_test_OBJECTS =  \
+	$(am_ags_check_system_functional_note_edit_test_OBJECTS)
+ags_check_system_functional_note_edit_test_DEPENDENCIES =  \
+	$(am__DEPENDENCIES_3)
+ags_check_system_functional_note_edit_test_LINK = $(LIBTOOL) \
+	$(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) \
+	$(ags_check_system_functional_note_edit_test_CFLAGS) $(CFLAGS) \
+	$(ags_check_system_functional_note_edit_test_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_ags_check_system_functional_panel_test_OBJECTS = ags/test/X/machine/ags_check_system_functional_panel_test-ags_functional_panel_test.$(OBJEXT)
+ags_check_system_functional_panel_test_OBJECTS =  \
+	$(am_ags_check_system_functional_panel_test_OBJECTS)
+ags_check_system_functional_panel_test_DEPENDENCIES =  \
+	$(am__DEPENDENCIES_3)
+ags_check_system_functional_panel_test_LINK = $(LIBTOOL) $(AM_V_lt) \
+	--tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+	$(CCLD) $(ags_check_system_functional_panel_test_CFLAGS) \
+	$(CFLAGS) $(ags_check_system_functional_panel_test_LDFLAGS) \
+	$(LDFLAGS) -o $@
+am_ags_check_system_functional_synth_test_OBJECTS = ags/test/X/machine/ags_check_system_functional_synth_test-ags_functional_synth_test.$(OBJEXT)
+ags_check_system_functional_synth_test_OBJECTS =  \
+	$(am_ags_check_system_functional_synth_test_OBJECTS)
+ags_check_system_functional_synth_test_DEPENDENCIES =  \
+	$(am__DEPENDENCIES_3)
+ags_check_system_functional_synth_test_LINK = $(LIBTOOL) $(AM_V_lt) \
+	--tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+	$(CCLD) $(ags_check_system_functional_synth_test_CFLAGS) \
+	$(CFLAGS) $(ags_check_system_functional_synth_test_LDFLAGS) \
+	$(LDFLAGS) -o $@
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/ags
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libgsequencer_check_system_test_la_SOURCES) \
+	$(ags_check_system_functional_audio_test_SOURCES) \
+	$(ags_check_system_functional_drum_test_SOURCES) \
+	$(ags_check_system_functional_editor_workflow_test_SOURCES) \
+	$(ags_check_system_functional_ffplayer_test_SOURCES) \
+	$(ags_check_system_functional_line_member_add_and_destroy_test_SOURCES) \
+	$(ags_check_system_functional_machine_add_and_destroy_test_SOURCES) \
+	$(ags_check_system_functional_machine_link_test_SOURCES) \
+	$(ags_check_system_functional_matrix_test_SOURCES) \
+	$(ags_check_system_functional_mixer_test_SOURCES) \
+	$(ags_check_system_functional_note_edit_test_SOURCES) \
+	$(ags_check_system_functional_panel_test_SOURCES) \
+	$(ags_check_system_functional_synth_test_SOURCES)
+DIST_SOURCES = $(libgsequencer_check_system_test_la_SOURCES) \
+	$(ags_check_system_functional_audio_test_SOURCES) \
+	$(ags_check_system_functional_drum_test_SOURCES) \
+	$(ags_check_system_functional_editor_workflow_test_SOURCES) \
+	$(ags_check_system_functional_ffplayer_test_SOURCES) \
+	$(ags_check_system_functional_line_member_add_and_destroy_test_SOURCES) \
+	$(ags_check_system_functional_machine_add_and_destroy_test_SOURCES) \
+	$(ags_check_system_functional_machine_link_test_SOURCES) \
+	$(ags_check_system_functional_matrix_test_SOURCES) \
+	$(ags_check_system_functional_mixer_test_SOURCES) \
+	$(ags_check_system_functional_note_edit_test_SOURCES) \
+	$(ags_check_system_functional_panel_test_SOURCES) \
+	$(ags_check_system_functional_synth_test_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__extra_recursive_targets = ags-docs-recursive
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+CSCOPE = cscope
+AM_RECURSIVE_TARGETS = cscope
+am__DIST_COMMON = $(srcdir)/functional-system-tests.mk.in \
+	$(srcdir)/libags.pc.in $(srcdir)/libags_audio.pc.in \
+	$(srcdir)/libags_gui.pc.in $(srcdir)/libgsequencer.pc.in \
+	$(top_srcdir)/ags/config.h.in AUTHORS COPYING ChangeLog \
+	INSTALL NEWS README TODO compile config.guess config.rpath \
+	config.sub depcomp install-sh ltmain.sh missing
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  if test -d "$(distdir)"; then \
+    find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+      && rm -rf "$(distdir)" \
+      || { sleep 5 && rm -rf "$(distdir)"; }; \
+  else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
+DIST_ARCHIVES = $(distdir).tar.gz
+GZIP_ENV = --best
+DIST_TARGETS = dist-gzip
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CAIRO_CFLAGS = @CAIRO_CFLAGS@
+CAIRO_LIBS = @CAIRO_LIBS@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@
+FONTCONFIG_LIBS = @FONTCONFIG_LIBS@
+GDKPIXBUF_CFLAGS = @GDKPIXBUF_CFLAGS@
+GDKPIXBUF_LIBS = @GDKPIXBUF_LIBS@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GOBJECT_CFLAGS = @GOBJECT_CFLAGS@
+GOBJECT_LIBS = @GOBJECT_LIBS@
+GREP = @GREP@
+GSEQUENCER_CFLAGS = @GSEQUENCER_CFLAGS@
+GSEQUENCER_FUNCTIONAL_TEST_LDADD = @GSEQUENCER_FUNCTIONAL_TEST_LDADD@
+GSEQUENCER_LDFLAGS = @GSEQUENCER_LDFLAGS@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_CHECK_PATH = @GTKDOC_CHECK_PATH@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+JACK_CFLAGS = @JACK_CFLAGS@
+JACK_LIBS = @JACK_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBASOUND2_CFLAGS = @LIBASOUND2_CFLAGS@
+LIBASOUND2_LIBS = @LIBASOUND2_LIBS@
+LIBGSEQUENCER_TEST_LIBADD = @LIBGSEQUENCER_TEST_LIBADD@
+LIBINSTPATCH_CFLAGS = @LIBINSTPATCH_CFLAGS@
+LIBINSTPATCH_LIBS = @LIBINSTPATCH_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBTOOL_DEPS = @LIBTOOL_DEPS@
+LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
+LIBXML2_LIBS = @LIBXML2_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MIDI2XML_CFLAGS = @MIDI2XML_CFLAGS@
+MIDI2XML_LDFLAGS = @MIDI2XML_LDFLAGS@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
+PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+RANLIB = @RANLIB@
+SAMPLERATE_CFLAGS = @SAMPLERATE_CFLAGS@
+SAMPLERATE_LIBS = @SAMPLERATE_LIBS@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SNDFILE_CFLAGS = @SNDFILE_CFLAGS@
+SNDFILE_LIBS = @SNDFILE_LIBS@
+STRIP = @STRIP@
+UUID_CFLAGS = @UUID_CFLAGS@
+UUID_LIBS = @UUID_LIBS@
+VERSION = @VERSION@
+XMKMF = @XMKMF@
+XMLRPC_SERVER_ABYSS_CFLAGS = @XMLRPC_SERVER_ABYSS_CFLAGS@
+XMLRPC_SERVER_ABYSS_LIBS = @XMLRPC_SERVER_ABYSS_LIBS@
+XMLRPC_SERVER_CFLAGS = @XMLRPC_SERVER_CFLAGS@
+XMLRPC_SERVER_CGI_CFLAGS = @XMLRPC_SERVER_CGI_CFLAGS@
+XMLRPC_SERVER_CGI_LIBS = @XMLRPC_SERVER_CGI_LIBS@
+XMLRPC_SERVER_LIBS = @XMLRPC_SERVER_LIBS@
+XMLRPC_UTIL_CFLAGS = @XMLRPC_UTIL_CFLAGS@
+XMLRPC_UTIL_LIBS = @XMLRPC_UTIL_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+# libadd and ldadd
+libgsequencer_check_system_test_LIBADD = -L$(libdir) -lags -lags_audio -lags_gui -L$(libdir)/gsequencer/ -lgsequencer -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+gsequencer_check_system_functional_test_LDADD = -lags -lags_audio -lags_gui -L$(DESTDIR)/$(libdir)/gsequencer/ -lgsequencer libgsequencer_check_system_test.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+noinst_LTLIBRARIES = libgsequencer_check_system_test.la
+
+# functional system tests - edit target
+installcheck_programs = \
+	ags_check_system_functional_audio_test \
+	ags_check_system_functional_machine_add_and_destroy_test \
+	ags_check_system_functional_machine_link_test \
+	ags_check_system_functional_line_member_add_and_destroy_test \
+	ags_check_system_functional_editor_workflow_test \
+	ags_check_system_functional_panel_test \
+	ags_check_system_functional_mixer_test \
+	ags_check_system_functional_drum_test \
+	ags_check_system_functional_matrix_test \
+	ags_check_system_functional_synth_test \
+	ags_check_system_functional_ffplayer_test \
+	ags_check_system_functional_note_edit_test
+
+
+# functional test util library
+libgsequencer_check_system_test_la_SOURCES = ags/test/X/gsequencer_setup_util.c ags/test/X/gsequencer_setup_util.h ags/test/X/ags_functional_test_util.c ags/test/X/ags_functional_test_util.h ags/test/X/libgsequencer.h
+libgsequencer_check_system_test_la_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+libgsequencer_check_system_test_la_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+libgsequencer_check_system_test_la_LIBADD = $(libgsequencer_check_system_test_LIBADD)
+
+# functional audio test
+ags_check_system_functional_audio_test_SOURCES = ags/test/audio/ags_functional_audio_test.c
+ags_check_system_functional_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS)
+ags_check_system_functional_audio_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_audio_test_LDADD = $(gsequencer_check_system_functional_test_LDADD)
+
+# functional machine add and destroy test
+ags_check_system_functional_machine_add_and_destroy_test_SOURCES = ags/test/X/ags_functional_machine_add_and_destroy_test.c
+ags_check_system_functional_machine_add_and_destroy_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_check_system_functional_machine_add_and_destroy_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_check_system_functional_machine_add_and_destroy_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_machine_add_and_destroy_test_LDADD = $(gsequencer_check_system_functional_test_LDADD)
+
+# functional machine link test
+ags_check_system_functional_machine_link_test_SOURCES = ags/test/X/ags_check_system_functional_machine_link_test.c
+ags_check_system_functional_machine_link_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_check_system_functional_machine_link_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_check_system_functional_machine_link_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_machine_link_test_LDADD = $(gsequencer_functional_test_LDADD)
+
+# functional line member add and destroy test
+ags_check_system_functional_line_member_add_and_destroy_test_SOURCES = ags/test/X/ags_functional_line_member_add_and_destroy_test.c
+ags_check_system_functional_line_member_add_and_destroy_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_check_system_functional_line_member_add_and_destroy_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_check_system_functional_line_member_add_and_destroy_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_line_member_add_and_destroy_test_LDADD = $(gsequencer_check_system_functional_test_LDADD)
+
+# functional editor workflow test
+ags_check_system_functional_editor_workflow_test_SOURCES = ags/test/X/ags_functional_editor_workflow_test.c
+ags_check_system_functional_editor_workflow_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_check_system_functional_editor_workflow_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_check_system_functional_editor_workflow_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_editor_workflow_test_LDADD = $(gsequencer_check_system_functional_test_LDADD)
+
+# functional panel test
+ags_check_system_functional_panel_test_SOURCES = ags/test/X/machine/ags_functional_panel_test.c
+ags_check_system_functional_panel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_check_system_functional_panel_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_check_system_functional_panel_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_panel_test_LDADD = $(gsequencer_check_system_functional_test_LDADD)
+
+# functional mixer test
+ags_check_system_functional_mixer_test_SOURCES = ags/test/X/machine/ags_functional_mixer_test.c
+ags_check_system_functional_mixer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_check_system_functional_mixer_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_check_system_functional_mixer_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_mixer_test_LDADD = $(gsequencer_check_system_functional_test_LDADD)
+
+# functional drum test
+ags_check_system_functional_drum_test_SOURCES = ags/test/X/machine/ags_functional_drum_test.c
+ags_check_system_functional_drum_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_check_system_functional_drum_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_check_system_functional_drum_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_drum_test_LDADD = $(gsequencer_check_system_functional_test_LDADD)
+
+# functional matrix test
+ags_check_system_functional_matrix_test_SOURCES = ags/test/X/machine/ags_functional_matrix_test.c
+ags_check_system_functional_matrix_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_check_system_functional_matrix_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_check_system_functional_matrix_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_matrix_test_LDADD = $(gsequencer_check_system_functional_test_LDADD)
+
+# functional synth test
+ags_check_system_functional_synth_test_SOURCES = ags/test/X/machine/ags_functional_synth_test.c
+ags_check_system_functional_synth_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_check_system_functional_synth_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_check_system_functional_synth_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_synth_test_LDADD = $(gsequencer_check_system_functional_test_LDADD)
+
+# functional ffplayer test
+ags_check_system_functional_ffplayer_test_SOURCES = ags/test/X/machine/ags_functional_ffplayer_test.c
+ags_check_system_functional_ffplayer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_check_system_functional_ffplayer_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_check_system_functional_ffplayer_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_ffplayer_test_LDADD = $(gsequencer_check_system_functional_test_LDADD)
+
+# functional note edit test
+ags_check_system_functional_note_edit_test_SOURCES = ags/test/X/ags_functional_note_edit_test.c
+ags_check_system_functional_note_edit_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_check_system_functional_note_edit_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_check_system_functional_note_edit_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_check_system_functional_note_edit_test_LDADD = $(gsequencer_check_system_functional_test_LDADD)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+am--refresh: functional-system-tests.mk
+	@:
+$(srcdir)/functional-system-tests.mk.in:  $(srcdir)/functional-system-tests.mk.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \
+	      $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu functional-system-tests.mk'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu functional-system-tests.mk
+functional-system-tests.mk: $(srcdir)/functional-system-tests.mk.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    echo ' $(SHELL) ./config.status'; \
+	    $(SHELL) ./config.status;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	$(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	$(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+ags/config.h: ags/stamp-h1
+	@test -f $@ || rm -f ags/stamp-h1
+	@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) ags/stamp-h1
+
+ags/stamp-h1: $(top_srcdir)/ags/config.h.in $(top_builddir)/config.status
+	@rm -f ags/stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status ags/config.h
+$(top_srcdir)/ags/config.h.in:  $(am__configure_deps) 
+	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+	rm -f ags/stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f ags/config.h ags/stamp-h1
+libags.pc: $(top_builddir)/config.status $(srcdir)/libags.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+libags_audio.pc: $(top_builddir)/config.status $(srcdir)/libags_audio.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+libags_gui.pc: $(top_builddir)/config.status $(srcdir)/libags_gui.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+libgsequencer.pc: $(top_builddir)/config.status $(srcdir)/libgsequencer.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+
+clean-noinstLTLIBRARIES:
+	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+	@list='$(noinst_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+ags/test/X/$(am__dirstamp):
+	@$(MKDIR_P) ags/test/X
+	@: > ags/test/X/$(am__dirstamp)
+ags/test/X/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) ags/test/X/$(DEPDIR)
+	@: > ags/test/X/$(DEPDIR)/$(am__dirstamp)
+ags/test/X/libgsequencer_check_system_test_la-gsequencer_setup_util.lo:  \
+	ags/test/X/$(am__dirstamp) \
+	ags/test/X/$(DEPDIR)/$(am__dirstamp)
+ags/test/X/libgsequencer_check_system_test_la-ags_functional_test_util.lo:  \
+	ags/test/X/$(am__dirstamp) \
+	ags/test/X/$(DEPDIR)/$(am__dirstamp)
+
+libgsequencer_check_system_test.la: $(libgsequencer_check_system_test_la_OBJECTS) $(libgsequencer_check_system_test_la_DEPENDENCIES) $(EXTRA_libgsequencer_check_system_test_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(libgsequencer_check_system_test_la_LINK)  $(libgsequencer_check_system_test_la_OBJECTS) $(libgsequencer_check_system_test_la_LIBADD) $(LIBS)
+
+clean-noinstPROGRAMS:
+	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+ags/test/audio/$(am__dirstamp):
+	@$(MKDIR_P) ags/test/audio
+	@: > ags/test/audio/$(am__dirstamp)
+ags/test/audio/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) ags/test/audio/$(DEPDIR)
+	@: > ags/test/audio/$(DEPDIR)/$(am__dirstamp)
+ags/test/audio/ags_check_system_functional_audio_test-ags_functional_audio_test.$(OBJEXT):  \
+	ags/test/audio/$(am__dirstamp) \
+	ags/test/audio/$(DEPDIR)/$(am__dirstamp)
+
+ags_check_system_functional_audio_test$(EXEEXT): $(ags_check_system_functional_audio_test_OBJECTS) $(ags_check_system_functional_audio_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_audio_test_DEPENDENCIES) 
+	@rm -f ags_check_system_functional_audio_test$(EXEEXT)
+	$(AM_V_CCLD)$(ags_check_system_functional_audio_test_LINK) $(ags_check_system_functional_audio_test_OBJECTS) $(ags_check_system_functional_audio_test_LDADD) $(LIBS)
+ags/test/X/machine/$(am__dirstamp):
+	@$(MKDIR_P) ags/test/X/machine
+	@: > ags/test/X/machine/$(am__dirstamp)
+ags/test/X/machine/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) ags/test/X/machine/$(DEPDIR)
+	@: > ags/test/X/machine/$(DEPDIR)/$(am__dirstamp)
+ags/test/X/machine/ags_check_system_functional_drum_test-ags_functional_drum_test.$(OBJEXT):  \
+	ags/test/X/machine/$(am__dirstamp) \
+	ags/test/X/machine/$(DEPDIR)/$(am__dirstamp)
+
+ags_check_system_functional_drum_test$(EXEEXT): $(ags_check_system_functional_drum_test_OBJECTS) $(ags_check_system_functional_drum_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_drum_test_DEPENDENCIES) 
+	@rm -f ags_check_system_functional_drum_test$(EXEEXT)
+	$(AM_V_CCLD)$(ags_check_system_functional_drum_test_LINK) $(ags_check_system_functional_drum_test_OBJECTS) $(ags_check_system_functional_drum_test_LDADD) $(LIBS)
+ags/test/X/ags_check_system_functional_editor_workflow_test-ags_functional_editor_workflow_test.$(OBJEXT):  \
+	ags/test/X/$(am__dirstamp) \
+	ags/test/X/$(DEPDIR)/$(am__dirstamp)
+
+ags_check_system_functional_editor_workflow_test$(EXEEXT): $(ags_check_system_functional_editor_workflow_test_OBJECTS) $(ags_check_system_functional_editor_workflow_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_editor_workflow_test_DEPENDENCIES) 
+	@rm -f ags_check_system_functional_editor_workflow_test$(EXEEXT)
+	$(AM_V_CCLD)$(ags_check_system_functional_editor_workflow_test_LINK) $(ags_check_system_functional_editor_workflow_test_OBJECTS) $(ags_check_system_functional_editor_workflow_test_LDADD) $(LIBS)
+ags/test/X/machine/ags_check_system_functional_ffplayer_test-ags_functional_ffplayer_test.$(OBJEXT):  \
+	ags/test/X/machine/$(am__dirstamp) \
+	ags/test/X/machine/$(DEPDIR)/$(am__dirstamp)
+
+ags_check_system_functional_ffplayer_test$(EXEEXT): $(ags_check_system_functional_ffplayer_test_OBJECTS) $(ags_check_system_functional_ffplayer_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_ffplayer_test_DEPENDENCIES) 
+	@rm -f ags_check_system_functional_ffplayer_test$(EXEEXT)
+	$(AM_V_CCLD)$(ags_check_system_functional_ffplayer_test_LINK) $(ags_check_system_functional_ffplayer_test_OBJECTS) $(ags_check_system_functional_ffplayer_test_LDADD) $(LIBS)
+ags/test/X/ags_check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.$(OBJEXT):  \
+	ags/test/X/$(am__dirstamp) \
+	ags/test/X/$(DEPDIR)/$(am__dirstamp)
+
+ags_check_system_functional_line_member_add_and_destroy_test$(EXEEXT): $(ags_check_system_functional_line_member_add_and_destroy_test_OBJECTS) $(ags_check_system_functional_line_member_add_and_destroy_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_line_member_add_and_destroy_test_DEPENDENCIES) 
+	@rm -f ags_check_system_functional_line_member_add_and_destroy_test$(EXEEXT)
+	$(AM_V_CCLD)$(ags_check_system_functional_line_member_add_and_destroy_test_LINK) $(ags_check_system_functional_line_member_add_and_destroy_test_OBJECTS) $(ags_check_system_functional_line_member_add_and_destroy_test_LDADD) $(LIBS)
+ags/test/X/ags_check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.$(OBJEXT):  \
+	ags/test/X/$(am__dirstamp) \
+	ags/test/X/$(DEPDIR)/$(am__dirstamp)
+
+ags_check_system_functional_machine_add_and_destroy_test$(EXEEXT): $(ags_check_system_functional_machine_add_and_destroy_test_OBJECTS) $(ags_check_system_functional_machine_add_and_destroy_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_machine_add_and_destroy_test_DEPENDENCIES) 
+	@rm -f ags_check_system_functional_machine_add_and_destroy_test$(EXEEXT)
+	$(AM_V_CCLD)$(ags_check_system_functional_machine_add_and_destroy_test_LINK) $(ags_check_system_functional_machine_add_and_destroy_test_OBJECTS) $(ags_check_system_functional_machine_add_and_destroy_test_LDADD) $(LIBS)
+ags/test/X/ags_check_system_functional_machine_link_test-ags_check_system_functional_machine_link_test.$(OBJEXT):  \
+	ags/test/X/$(am__dirstamp) \
+	ags/test/X/$(DEPDIR)/$(am__dirstamp)
+
+ags_check_system_functional_machine_link_test$(EXEEXT): $(ags_check_system_functional_machine_link_test_OBJECTS) $(ags_check_system_functional_machine_link_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_machine_link_test_DEPENDENCIES) 
+	@rm -f ags_check_system_functional_machine_link_test$(EXEEXT)
+	$(AM_V_CCLD)$(ags_check_system_functional_machine_link_test_LINK) $(ags_check_system_functional_machine_link_test_OBJECTS) $(ags_check_system_functional_machine_link_test_LDADD) $(LIBS)
+ags/test/X/machine/ags_check_system_functional_matrix_test-ags_functional_matrix_test.$(OBJEXT):  \
+	ags/test/X/machine/$(am__dirstamp) \
+	ags/test/X/machine/$(DEPDIR)/$(am__dirstamp)
+
+ags_check_system_functional_matrix_test$(EXEEXT): $(ags_check_system_functional_matrix_test_OBJECTS) $(ags_check_system_functional_matrix_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_matrix_test_DEPENDENCIES) 
+	@rm -f ags_check_system_functional_matrix_test$(EXEEXT)
+	$(AM_V_CCLD)$(ags_check_system_functional_matrix_test_LINK) $(ags_check_system_functional_matrix_test_OBJECTS) $(ags_check_system_functional_matrix_test_LDADD) $(LIBS)
+ags/test/X/machine/ags_check_system_functional_mixer_test-ags_functional_mixer_test.$(OBJEXT):  \
+	ags/test/X/machine/$(am__dirstamp) \
+	ags/test/X/machine/$(DEPDIR)/$(am__dirstamp)
+
+ags_check_system_functional_mixer_test$(EXEEXT): $(ags_check_system_functional_mixer_test_OBJECTS) $(ags_check_system_functional_mixer_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_mixer_test_DEPENDENCIES) 
+	@rm -f ags_check_system_functional_mixer_test$(EXEEXT)
+	$(AM_V_CCLD)$(ags_check_system_functional_mixer_test_LINK) $(ags_check_system_functional_mixer_test_OBJECTS) $(ags_check_system_functional_mixer_test_LDADD) $(LIBS)
+ags/test/X/ags_check_system_functional_note_edit_test-ags_functional_note_edit_test.$(OBJEXT):  \
+	ags/test/X/$(am__dirstamp) \
+	ags/test/X/$(DEPDIR)/$(am__dirstamp)
+
+ags_check_system_functional_note_edit_test$(EXEEXT): $(ags_check_system_functional_note_edit_test_OBJECTS) $(ags_check_system_functional_note_edit_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_note_edit_test_DEPENDENCIES) 
+	@rm -f ags_check_system_functional_note_edit_test$(EXEEXT)
+	$(AM_V_CCLD)$(ags_check_system_functional_note_edit_test_LINK) $(ags_check_system_functional_note_edit_test_OBJECTS) $(ags_check_system_functional_note_edit_test_LDADD) $(LIBS)
+ags/test/X/machine/ags_check_system_functional_panel_test-ags_functional_panel_test.$(OBJEXT):  \
+	ags/test/X/machine/$(am__dirstamp) \
+	ags/test/X/machine/$(DEPDIR)/$(am__dirstamp)
+
+ags_check_system_functional_panel_test$(EXEEXT): $(ags_check_system_functional_panel_test_OBJECTS) $(ags_check_system_functional_panel_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_panel_test_DEPENDENCIES) 
+	@rm -f ags_check_system_functional_panel_test$(EXEEXT)
+	$(AM_V_CCLD)$(ags_check_system_functional_panel_test_LINK) $(ags_check_system_functional_panel_test_OBJECTS) $(ags_check_system_functional_panel_test_LDADD) $(LIBS)
+ags/test/X/machine/ags_check_system_functional_synth_test-ags_functional_synth_test.$(OBJEXT):  \
+	ags/test/X/machine/$(am__dirstamp) \
+	ags/test/X/machine/$(DEPDIR)/$(am__dirstamp)
+
+ags_check_system_functional_synth_test$(EXEEXT): $(ags_check_system_functional_synth_test_OBJECTS) $(ags_check_system_functional_synth_test_DEPENDENCIES) $(EXTRA_ags_check_system_functional_synth_test_DEPENDENCIES) 
+	@rm -f ags_check_system_functional_synth_test$(EXEEXT)
+	$(AM_V_CCLD)$(ags_check_system_functional_synth_test_LINK) $(ags_check_system_functional_synth_test_OBJECTS) $(ags_check_system_functional_synth_test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+	-rm -f ags/test/X/*.$(OBJEXT)
+	-rm -f ags/test/X/*.lo
+	-rm -f ags/test/X/machine/*.$(OBJEXT)
+	-rm -f ags/test/audio/*.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ags/test/X/$(DEPDIR)/ags_check_system_functional_editor_workflow_test-ags_functional_editor_workflow_test.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ags/test/X/$(DEPDIR)/ags_check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ags/test/X/$(DEPDIR)/ags_check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ags/test/X/$(DEPDIR)/ags_check_system_functional_machine_link_test-ags_check_system_functional_machine_link_test.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ags/test/X/$(DEPDIR)/ags_check_system_functional_note_edit_test-ags_functional_note_edit_test.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ags/test/X/$(DEPDIR)/libgsequencer_check_system_test_la-ags_functional_test_util.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ags/test/X/$(DEPDIR)/libgsequencer_check_system_test_la-gsequencer_setup_util.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_drum_test-ags_functional_drum_test.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_ffplayer_test-ags_functional_ffplayer_test.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_matrix_test-ags_functional_matrix_test.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_mixer_test-ags_functional_mixer_test.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_panel_test-ags_functional_panel_test.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_synth_test-ags_functional_synth_test.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ags/test/audio/$(DEPDIR)/ags_check_system_functional_audio_test-ags_functional_audio_test.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+ags/test/X/libgsequencer_check_system_test_la-gsequencer_setup_util.lo: ags/test/X/gsequencer_setup_util.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgsequencer_check_system_test_la_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_check_system_test_la_CFLAGS) $(CFLAGS) -MT ags/test/X/libgsequencer_check_system_test_la-gsequencer_setup_util.lo -MD -MP -MF ags/test/X/$(DEPDIR)/libgsequencer_check_system_test_la-gsequencer_setup_util.Tpo -c -o ags/test/X/libgsequencer_check_system_test_la-gsequencer_setup_util.lo `test -f 'ags/test/X/gsequencer_setup_util.c' || echo '$(srcdir)/'`ags/test/X/gsequencer_setup_util.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/libgsequencer_check_system_test_la-gsequencer_setup_util.Tpo ags/test/X/$(DEPDIR)/libgsequencer_check_system_test_la-gsequencer_setup_util.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/gsequencer_setup_util.c' object='ags/test/X/libgsequencer_check_system_test_la-gsequencer_setup_util.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgsequencer_check_system_test_la_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_check_system_test_la_CFLAGS) $(CFLAGS) -c -o ags/test/X/libgsequencer_check_system_test_la-gsequencer_setup_util.lo `test -f 'ags/test/X/gsequencer_setup_util.c' || echo '$(srcdir)/'`ags/test/X/gsequencer_setup_util.c
+
+ags/test/X/libgsequencer_check_system_test_la-ags_functional_test_util.lo: ags/test/X/ags_functional_test_util.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgsequencer_check_system_test_la_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_check_system_test_la_CFLAGS) $(CFLAGS) -MT ags/test/X/libgsequencer_check_system_test_la-ags_functional_test_util.lo -MD -MP -MF ags/test/X/$(DEPDIR)/libgsequencer_check_system_test_la-ags_functional_test_util.Tpo -c -o ags/test/X/libgsequencer_check_system_test_la-ags_functional_test_util.lo `test -f 'ags/test/X/ags_functional_test_util.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_test_util.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/libgsequencer_check_system_test_la-ags_functional_test_util.Tpo ags/test/X/$(DEPDIR)/libgsequencer_check_system_test_la-ags_functional_test_util.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/ags_functional_test_util.c' object='ags/test/X/libgsequencer_check_system_test_la-ags_functional_test_util.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgsequencer_check_system_test_la_CPPFLAGS) $(CPPFLAGS) $(libgsequencer_check_system_test_la_CFLAGS) $(CFLAGS) -c -o ags/test/X/libgsequencer_check_system_test_la-ags_functional_test_util.lo `test -f 'ags/test/X/ags_functional_test_util.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_test_util.c
+
+ags/test/audio/ags_check_system_functional_audio_test-ags_functional_audio_test.o: ags/test/audio/ags_functional_audio_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/ags_check_system_functional_audio_test-ags_functional_audio_test.o -MD -MP -MF ags/test/audio/$(DEPDIR)/ags_check_system_functional_audio_test-ags_functional_audio_test.Tpo -c -o ags/test/audio/ags_check_system_functional_audio_test-ags_functional_audio_test.o `test -f 'ags/test/audio/ags_functional_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_functional_audio_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/ags_check_system_functional_audio_test-ags_functional_audio_test.Tpo ags/test/audio/$(DEPDIR)/ags_check_system_functional_audio_test-ags_functional_audio_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/audio/ags_functional_audio_test.c' object='ags/test/audio/ags_check_system_functional_audio_test-ags_functional_audio_test.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/ags_check_system_functional_audio_test-ags_functional_audio_test.o `test -f 'ags/test/audio/ags_functional_audio_test.c' || echo '$(srcdir)/'`ags/test/audio/ags_functional_audio_test.c
+
+ags/test/audio/ags_check_system_functional_audio_test-ags_functional_audio_test.obj: ags/test/audio/ags_functional_audio_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_audio_test_CFLAGS) $(CFLAGS) -MT ags/test/audio/ags_check_system_functional_audio_test-ags_functional_audio_test.obj -MD -MP -MF ags/test/audio/$(DEPDIR)/ags_check_system_functional_audio_test-ags_functional_audio_test.Tpo -c -o ags/test/audio/ags_check_system_functional_audio_test-ags_functional_audio_test.obj `if test -f 'ags/test/audio/ags_functional_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_functional_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_functional_audio_test.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/audio/$(DEPDIR)/ags_check_system_functional_audio_test-ags_functional_audio_test.Tpo ags/test/audio/$(DEPDIR)/ags_check_system_functional_audio_test-ags_functional_audio_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/audio/ags_functional_audio_test.c' object='ags/test/audio/ags_check_system_functional_audio_test-ags_functional_audio_test.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_audio_test_CFLAGS) $(CFLAGS) -c -o ags/test/audio/ags_check_system_functional_audio_test-ags_functional_audio_test.obj `if test -f 'ags/test/audio/ags_functional_audio_test.c'; then $(CYGPATH_W) 'ags/test/audio/ags_functional_audio_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/audio/ags_functional_audio_test.c'; fi`
+
+ags/test/X/machine/ags_check_system_functional_drum_test-ags_functional_drum_test.o: ags/test/X/machine/ags_functional_drum_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_drum_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_drum_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/ags_check_system_functional_drum_test-ags_functional_drum_test.o -MD -MP -MF ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_drum_test-ags_functional_drum_test.Tpo -c -o ags/test/X/machine/ags_check_system_functional_drum_test-ags_functional_drum_test.o `test -f 'ags/test/X/machine/ags_functional_drum_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_drum_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_drum_test-ags_functional_drum_test.Tpo ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_drum_test-ags_functional_drum_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/machine/ags_functional_drum_test.c' object='ags/test/X/machine/ags_check_system_functional_drum_test-ags_functional_drum_test.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_drum_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_drum_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/ags_check_system_functional_drum_test-ags_functional_drum_test.o `test -f 'ags/test/X/machine/ags_functional_drum_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_drum_test.c
+
+ags/test/X/machine/ags_check_system_functional_drum_test-ags_functional_drum_test.obj: ags/test/X/machine/ags_functional_drum_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_drum_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_drum_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/ags_check_system_functional_drum_test-ags_functional_drum_test.obj -MD -MP -MF ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_drum_test-ags_functional_drum_test.Tpo -c -o ags/test/X/machine/ags_check_system_functional_drum_test-ags_functional_drum_test.obj `if test -f 'ags/test/X/machine/ags_functional_drum_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_drum_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_drum_test.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_drum_test-ags_functional_drum_test.Tpo ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_drum_test-ags_functional_drum_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/machine/ags_functional_drum_test.c' object='ags/test/X/machine/ags_check_system_functional_drum_test-ags_functional_drum_test.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_drum_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_drum_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/ags_check_system_functional_drum_test-ags_functional_drum_test.obj `if test -f 'ags/test/X/machine/ags_functional_drum_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_drum_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_drum_test.c'; fi`
+
+ags/test/X/ags_check_system_functional_editor_workflow_test-ags_functional_editor_workflow_test.o: ags/test/X/ags_functional_editor_workflow_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_editor_workflow_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_editor_workflow_test_CFLAGS) $(CFLAGS) -MT ags/test/X/ags_check_system_functional_editor_workflow_test-ags_functional_editor_workflow_test.o -MD -MP -MF ags/test/X/$(DEPDIR)/ags_check_system_functional_editor_workflow_test-ags_functional_editor_workflow_test.Tpo -c -o ags/test/X/ags_check_system_functional_editor_workflow_test-ags_functional_editor_workflow_test.o `test -f 'ags/test/X/ags_functional_editor_workflow_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_editor_workflow_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/ags_check_system_functional_editor_workflow_test-ags_functional_editor_workflow_test.Tpo ags/test/X/$(DEPDIR)/ags_check_system_functional_editor_workflow_test-ags_functional_editor_workflow_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/ags_functional_editor_workflow_test.c' object='ags/test/X/ags_check_system_functional_editor_workflow_test-ags_functional_editor_workflow_test.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_editor_workflow_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_editor_workflow_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/ags_check_system_functional_editor_workflow_test-ags_functional_editor_workflow_test.o `test -f 'ags/test/X/ags_functional_editor_workflow_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_editor_workflow_test.c
+
+ags/test/X/ags_check_system_functional_editor_workflow_test-ags_functional_editor_workflow_test.obj: ags/test/X/ags_functional_editor_workflow_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_editor_workflow_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_editor_workflow_test_CFLAGS) $(CFLAGS) -MT ags/test/X/ags_check_system_functional_editor_workflow_test-ags_functional_editor_workflow_test.obj -MD -MP -MF ags/test/X/$(DEPDIR)/ags_check_system_functional_editor_workflow_test-ags_functional_editor_workflow_test.Tpo -c -o ags/test/X/ags_check_system_functional_editor_workflow_test-ags_functional_editor_workflow_test.obj `if test -f 'ags/test/X/ags_functional_editor_workflow_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_editor_workflow_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_editor_workflow_test.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/ags_check_system_functional_editor_workflow_test-ags_functional_editor_workflow_test.Tpo ags/test/X/$(DEPDIR)/ags_check_system_functional_editor_workflow_test-ags_functional_editor_workflow_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/ags_functional_editor_workflow_test.c' object='ags/test/X/ags_check_system_functional_editor_workflow_test-ags_functional_editor_workflow_test.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_editor_workflow_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_editor_workflow_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/ags_check_system_functional_editor_workflow_test-ags_functional_editor_workflow_test.obj `if test -f 'ags/test/X/ags_functional_editor_workflow_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_editor_workflow_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_editor_workflow_test.c'; fi`
+
+ags/test/X/machine/ags_check_system_functional_ffplayer_test-ags_functional_ffplayer_test.o: ags/test/X/machine/ags_functional_ffplayer_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_ffplayer_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_ffplayer_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/ags_check_system_functional_ffplayer_test-ags_functional_ffplayer_test.o -MD -MP -MF ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_ffplayer_test-ags_functional_ffplayer_test.Tpo -c -o ags/test/X/machine/ags_check_system_functional_ffplayer_test-ags_functional_ffplayer_test.o `test -f 'ags/test/X/machine/ags_functional_ffplayer_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_ffplayer_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_ffplayer_test-ags_functional_ffplayer_test.Tpo ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_ffplayer_test-ags_functional_ffplayer_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/machine/ags_functional_ffplayer_test.c' object='ags/test/X/machine/ags_check_system_functional_ffplayer_test-ags_functional_ffplayer_test.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_ffplayer_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_ffplayer_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/ags_check_system_functional_ffplayer_test-ags_functional_ffplayer_test.o `test -f 'ags/test/X/machine/ags_functional_ffplayer_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_ffplayer_test.c
+
+ags/test/X/machine/ags_check_system_functional_ffplayer_test-ags_functional_ffplayer_test.obj: ags/test/X/machine/ags_functional_ffplayer_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_ffplayer_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_ffplayer_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/ags_check_system_functional_ffplayer_test-ags_functional_ffplayer_test.obj -MD -MP -MF ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_ffplayer_test-ags_functional_ffplayer_test.Tpo -c -o ags/test/X/machine/ags_check_system_functional_ffplayer_test-ags_functional_ffplayer_test.obj `if test -f 'ags/test/X/machine/ags_functional_ffplayer_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_ffplayer_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_ffplayer_test.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_ffplayer_test-ags_functional_ffplayer_test.Tpo ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_ffplayer_test-ags_functional_ffplayer_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/machine/ags_functional_ffplayer_test.c' object='ags/test/X/machine/ags_check_system_functional_ffplayer_test-ags_functional_ffplayer_test.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_ffplayer_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_ffplayer_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/ags_check_system_functional_ffplayer_test-ags_functional_ffplayer_test.obj `if test -f 'ags/test/X/machine/ags_functional_ffplayer_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_ffplayer_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_ffplayer_test.c'; fi`
+
+ags/test/X/ags_check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.o: ags/test/X/ags_functional_line_member_add_and_destroy_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_line_member_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_line_member_add_and_destroy_test_CFLAGS) $(CFLAGS) -MT ags/test/X/ags_check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.o -MD -MP -MF ags/test/X/$(DEPDIR)/ags_check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Tpo -c -o ags/test/X/ags_check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.o `test -f 'ags/test/X/ags_functional_line_member_add_and_destroy_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_line_member_add_and_destroy_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/ags_check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Tpo ags/test/X/$(DEPDIR)/ags_check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/ags_functional_line_member_add_and_destroy_test.c' object='ags/test/X/ags_check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_line_member_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_line_member_add_and_destroy_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/ags_check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.o `test -f 'ags/test/X/ags_functional_line_member_add_and_destroy_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_line_member_add_and_destroy_test.c
+
+ags/test/X/ags_check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.obj: ags/test/X/ags_functional_line_member_add_and_destroy_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_line_member_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_line_member_add_and_destroy_test_CFLAGS) $(CFLAGS) -MT ags/test/X/ags_check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.obj -MD -MP -MF ags/test/X/$(DEPDIR)/ags_check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Tpo -c -o ags/test/X/ags_check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.obj `if test -f 'ags/test/X/ags_functional_line_member_add_and_destroy_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_line_member_add_and_destroy_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_line_member_add_and_destroy_test.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/ags_check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Tpo ags/test/X/$(DEPDIR)/ags_check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/ags_functional_line_member_add_and_destroy_test.c' object='ags/test/X/ags_check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_line_member_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_line_member_add_and_destroy_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/ags_check_system_functional_line_member_add_and_destroy_test-ags_functional_line_member_add_and_destroy_test.obj `if test -f 'ags/test/X/ags_functional_line_member_add_and_destroy_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_line_member_add_and_destroy_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_line_member_add_and_destroy_test.c'; fi`
+
+ags/test/X/ags_check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.o: ags/test/X/ags_functional_machine_add_and_destroy_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_machine_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_machine_add_and_destroy_test_CFLAGS) $(CFLAGS) -MT ags/test/X/ags_check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.o -MD -MP -MF ags/test/X/$(DEPDIR)/ags_check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.Tpo -c -o ags/test/X/ags_check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.o `test -f 'ags/test/X/ags_functional_machine_add_and_destroy_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_machine_add_and_destroy_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/ags_check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.Tpo ags/test/X/$(DEPDIR)/ags_check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/ags_functional_machine_add_and_destroy_test.c' object='ags/test/X/ags_check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_machine_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_machine_add_and_destroy_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/ags_check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.o `test -f 'ags/test/X/ags_functional_machine_add_and_destroy_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_machine_add_and_destroy_test.c
+
+ags/test/X/ags_check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.obj: ags/test/X/ags_functional_machine_add_and_destroy_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_machine_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_machine_add_and_destroy_test_CFLAGS) $(CFLAGS) -MT ags/test/X/ags_check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.obj -MD -MP -MF ags/test/X/$(DEPDIR)/ags_check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.Tpo -c -o ags/test/X/ags_check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.obj `if test -f 'ags/test/X/ags_functional_machine_add_and_destroy_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_machine_add_and_destroy_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_machine_add_and_destroy_test.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/ags_check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.Tpo ags/test/X/$(DEPDIR)/ags_check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/ags_functional_machine_add_and_destroy_test.c' object='ags/test/X/ags_check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_machine_add_and_destroy_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_machine_add_and_destroy_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/ags_check_system_functional_machine_add_and_destroy_test-ags_functional_machine_add_and_destroy_test.obj `if test -f 'ags/test/X/ags_functional_machine_add_and_destroy_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_machine_add_and_destroy_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_machine_add_and_destroy_test.c'; fi`
+
+ags/test/X/ags_check_system_functional_machine_link_test-ags_check_system_functional_machine_link_test.o: ags/test/X/ags_check_system_functional_machine_link_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_machine_link_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_machine_link_test_CFLAGS) $(CFLAGS) -MT ags/test/X/ags_check_system_functional_machine_link_test-ags_check_system_functional_machine_link_test.o -MD -MP -MF ags/test/X/$(DEPDIR)/ags_check_system_functional_machine_link_test-ags_check_system_functional_machine_link_test.Tpo -c -o ags/test/X/ags_check_system_functional_machine_link_test-ags_check_system_functional_machine_link_test.o `test -f 'ags/test/X/ags_check_system_functional_machine_link_test.c' || echo '$(srcdir)/'`ags/test/X/ags_check_system_functional_machine_link_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/ags_check_system_functional_machine_link_test-ags_check_system_functional_machine_link_test.Tpo ags/test/X/$(DEPDIR)/ags_check_system_functional_machine_link_test-ags_check_system_functional_machine_link_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/ags_check_system_functional_machine_link_test.c' object='ags/test/X/ags_check_system_functional_machine_link_test-ags_check_system_functional_machine_link_test.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_machine_link_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_machine_link_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/ags_check_system_functional_machine_link_test-ags_check_system_functional_machine_link_test.o `test -f 'ags/test/X/ags_check_system_functional_machine_link_test.c' || echo '$(srcdir)/'`ags/test/X/ags_check_system_functional_machine_link_test.c
+
+ags/test/X/ags_check_system_functional_machine_link_test-ags_check_system_functional_machine_link_test.obj: ags/test/X/ags_check_system_functional_machine_link_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_machine_link_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_machine_link_test_CFLAGS) $(CFLAGS) -MT ags/test/X/ags_check_system_functional_machine_link_test-ags_check_system_functional_machine_link_test.obj -MD -MP -MF ags/test/X/$(DEPDIR)/ags_check_system_functional_machine_link_test-ags_check_system_functional_machine_link_test.Tpo -c -o ags/test/X/ags_check_system_functional_machine_link_test-ags_check_system_functional_machine_link_test.obj `if test -f 'ags/test/X/ags_check_system_functional_machine_link_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_check_system_functional_machine_link_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_check_system_functional_machine_link_test.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/ags_check_system_functional_machine_link_test-ags_check_system_functional_machine_link_test.Tpo ags/test/X/$(DEPDIR)/ags_check_system_functional_machine_link_test-ags_check_system_functional_machine_link_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/ags_check_system_functional_machine_link_test.c' object='ags/test/X/ags_check_system_functional_machine_link_test-ags_check_system_functional_machine_link_test.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_machine_link_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_machine_link_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/ags_check_system_functional_machine_link_test-ags_check_system_functional_machine_link_test.obj `if test -f 'ags/test/X/ags_check_system_functional_machine_link_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_check_system_functional_machine_link_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_check_system_functional_machine_link_test.c'; fi`
+
+ags/test/X/machine/ags_check_system_functional_matrix_test-ags_functional_matrix_test.o: ags/test/X/machine/ags_functional_matrix_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_matrix_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_matrix_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/ags_check_system_functional_matrix_test-ags_functional_matrix_test.o -MD -MP -MF ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_matrix_test-ags_functional_matrix_test.Tpo -c -o ags/test/X/machine/ags_check_system_functional_matrix_test-ags_functional_matrix_test.o `test -f 'ags/test/X/machine/ags_functional_matrix_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_matrix_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_matrix_test-ags_functional_matrix_test.Tpo ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_matrix_test-ags_functional_matrix_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/machine/ags_functional_matrix_test.c' object='ags/test/X/machine/ags_check_system_functional_matrix_test-ags_functional_matrix_test.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_matrix_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_matrix_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/ags_check_system_functional_matrix_test-ags_functional_matrix_test.o `test -f 'ags/test/X/machine/ags_functional_matrix_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_matrix_test.c
+
+ags/test/X/machine/ags_check_system_functional_matrix_test-ags_functional_matrix_test.obj: ags/test/X/machine/ags_functional_matrix_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_matrix_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_matrix_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/ags_check_system_functional_matrix_test-ags_functional_matrix_test.obj -MD -MP -MF ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_matrix_test-ags_functional_matrix_test.Tpo -c -o ags/test/X/machine/ags_check_system_functional_matrix_test-ags_functional_matrix_test.obj `if test -f 'ags/test/X/machine/ags_functional_matrix_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_matrix_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_matrix_test.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_matrix_test-ags_functional_matrix_test.Tpo ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_matrix_test-ags_functional_matrix_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/machine/ags_functional_matrix_test.c' object='ags/test/X/machine/ags_check_system_functional_matrix_test-ags_functional_matrix_test.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_matrix_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_matrix_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/ags_check_system_functional_matrix_test-ags_functional_matrix_test.obj `if test -f 'ags/test/X/machine/ags_functional_matrix_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_matrix_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_matrix_test.c'; fi`
+
+ags/test/X/machine/ags_check_system_functional_mixer_test-ags_functional_mixer_test.o: ags/test/X/machine/ags_functional_mixer_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_mixer_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_mixer_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/ags_check_system_functional_mixer_test-ags_functional_mixer_test.o -MD -MP -MF ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_mixer_test-ags_functional_mixer_test.Tpo -c -o ags/test/X/machine/ags_check_system_functional_mixer_test-ags_functional_mixer_test.o `test -f 'ags/test/X/machine/ags_functional_mixer_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_mixer_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_mixer_test-ags_functional_mixer_test.Tpo ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_mixer_test-ags_functional_mixer_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/machine/ags_functional_mixer_test.c' object='ags/test/X/machine/ags_check_system_functional_mixer_test-ags_functional_mixer_test.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_mixer_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_mixer_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/ags_check_system_functional_mixer_test-ags_functional_mixer_test.o `test -f 'ags/test/X/machine/ags_functional_mixer_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_mixer_test.c
+
+ags/test/X/machine/ags_check_system_functional_mixer_test-ags_functional_mixer_test.obj: ags/test/X/machine/ags_functional_mixer_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_mixer_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_mixer_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/ags_check_system_functional_mixer_test-ags_functional_mixer_test.obj -MD -MP -MF ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_mixer_test-ags_functional_mixer_test.Tpo -c -o ags/test/X/machine/ags_check_system_functional_mixer_test-ags_functional_mixer_test.obj `if test -f 'ags/test/X/machine/ags_functional_mixer_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_mixer_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_mixer_test.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_mixer_test-ags_functional_mixer_test.Tpo ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_mixer_test-ags_functional_mixer_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/machine/ags_functional_mixer_test.c' object='ags/test/X/machine/ags_check_system_functional_mixer_test-ags_functional_mixer_test.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_mixer_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_mixer_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/ags_check_system_functional_mixer_test-ags_functional_mixer_test.obj `if test -f 'ags/test/X/machine/ags_functional_mixer_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_mixer_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_mixer_test.c'; fi`
+
+ags/test/X/ags_check_system_functional_note_edit_test-ags_functional_note_edit_test.o: ags/test/X/ags_functional_note_edit_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_note_edit_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_note_edit_test_CFLAGS) $(CFLAGS) -MT ags/test/X/ags_check_system_functional_note_edit_test-ags_functional_note_edit_test.o -MD -MP -MF ags/test/X/$(DEPDIR)/ags_check_system_functional_note_edit_test-ags_functional_note_edit_test.Tpo -c -o ags/test/X/ags_check_system_functional_note_edit_test-ags_functional_note_edit_test.o `test -f 'ags/test/X/ags_functional_note_edit_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_note_edit_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/ags_check_system_functional_note_edit_test-ags_functional_note_edit_test.Tpo ags/test/X/$(DEPDIR)/ags_check_system_functional_note_edit_test-ags_functional_note_edit_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/ags_functional_note_edit_test.c' object='ags/test/X/ags_check_system_functional_note_edit_test-ags_functional_note_edit_test.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_note_edit_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_note_edit_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/ags_check_system_functional_note_edit_test-ags_functional_note_edit_test.o `test -f 'ags/test/X/ags_functional_note_edit_test.c' || echo '$(srcdir)/'`ags/test/X/ags_functional_note_edit_test.c
+
+ags/test/X/ags_check_system_functional_note_edit_test-ags_functional_note_edit_test.obj: ags/test/X/ags_functional_note_edit_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_note_edit_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_note_edit_test_CFLAGS) $(CFLAGS) -MT ags/test/X/ags_check_system_functional_note_edit_test-ags_functional_note_edit_test.obj -MD -MP -MF ags/test/X/$(DEPDIR)/ags_check_system_functional_note_edit_test-ags_functional_note_edit_test.Tpo -c -o ags/test/X/ags_check_system_functional_note_edit_test-ags_functional_note_edit_test.obj `if test -f 'ags/test/X/ags_functional_note_edit_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_note_edit_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_note_edit_test.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/$(DEPDIR)/ags_check_system_functional_note_edit_test-ags_functional_note_edit_test.Tpo ags/test/X/$(DEPDIR)/ags_check_system_functional_note_edit_test-ags_functional_note_edit_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/ags_functional_note_edit_test.c' object='ags/test/X/ags_check_system_functional_note_edit_test-ags_functional_note_edit_test.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_note_edit_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_note_edit_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/ags_check_system_functional_note_edit_test-ags_functional_note_edit_test.obj `if test -f 'ags/test/X/ags_functional_note_edit_test.c'; then $(CYGPATH_W) 'ags/test/X/ags_functional_note_edit_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/ags_functional_note_edit_test.c'; fi`
+
+ags/test/X/machine/ags_check_system_functional_panel_test-ags_functional_panel_test.o: ags/test/X/machine/ags_functional_panel_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_panel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_panel_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/ags_check_system_functional_panel_test-ags_functional_panel_test.o -MD -MP -MF ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_panel_test-ags_functional_panel_test.Tpo -c -o ags/test/X/machine/ags_check_system_functional_panel_test-ags_functional_panel_test.o `test -f 'ags/test/X/machine/ags_functional_panel_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_panel_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_panel_test-ags_functional_panel_test.Tpo ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_panel_test-ags_functional_panel_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/machine/ags_functional_panel_test.c' object='ags/test/X/machine/ags_check_system_functional_panel_test-ags_functional_panel_test.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_panel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_panel_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/ags_check_system_functional_panel_test-ags_functional_panel_test.o `test -f 'ags/test/X/machine/ags_functional_panel_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_panel_test.c
+
+ags/test/X/machine/ags_check_system_functional_panel_test-ags_functional_panel_test.obj: ags/test/X/machine/ags_functional_panel_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_panel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_panel_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/ags_check_system_functional_panel_test-ags_functional_panel_test.obj -MD -MP -MF ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_panel_test-ags_functional_panel_test.Tpo -c -o ags/test/X/machine/ags_check_system_functional_panel_test-ags_functional_panel_test.obj `if test -f 'ags/test/X/machine/ags_functional_panel_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_panel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_panel_test.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_panel_test-ags_functional_panel_test.Tpo ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_panel_test-ags_functional_panel_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/machine/ags_functional_panel_test.c' object='ags/test/X/machine/ags_check_system_functional_panel_test-ags_functional_panel_test.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_panel_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_panel_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/ags_check_system_functional_panel_test-ags_functional_panel_test.obj `if test -f 'ags/test/X/machine/ags_functional_panel_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_panel_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_panel_test.c'; fi`
+
+ags/test/X/machine/ags_check_system_functional_synth_test-ags_functional_synth_test.o: ags/test/X/machine/ags_functional_synth_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_synth_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_synth_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/ags_check_system_functional_synth_test-ags_functional_synth_test.o -MD -MP -MF ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_synth_test-ags_functional_synth_test.Tpo -c -o ags/test/X/machine/ags_check_system_functional_synth_test-ags_functional_synth_test.o `test -f 'ags/test/X/machine/ags_functional_synth_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_synth_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_synth_test-ags_functional_synth_test.Tpo ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_synth_test-ags_functional_synth_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/machine/ags_functional_synth_test.c' object='ags/test/X/machine/ags_check_system_functional_synth_test-ags_functional_synth_test.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_synth_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_synth_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/ags_check_system_functional_synth_test-ags_functional_synth_test.o `test -f 'ags/test/X/machine/ags_functional_synth_test.c' || echo '$(srcdir)/'`ags/test/X/machine/ags_functional_synth_test.c
+
+ags/test/X/machine/ags_check_system_functional_synth_test-ags_functional_synth_test.obj: ags/test/X/machine/ags_functional_synth_test.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_synth_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_synth_test_CFLAGS) $(CFLAGS) -MT ags/test/X/machine/ags_check_system_functional_synth_test-ags_functional_synth_test.obj -MD -MP -MF ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_synth_test-ags_functional_synth_test.Tpo -c -o ags/test/X/machine/ags_check_system_functional_synth_test-ags_functional_synth_test.obj `if test -f 'ags/test/X/machine/ags_functional_synth_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_synth_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_synth_test.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_synth_test-ags_functional_synth_test.Tpo ags/test/X/machine/$(DEPDIR)/ags_check_system_functional_synth_test-ags_functional_synth_test.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='ags/test/X/machine/ags_functional_synth_test.c' object='ags/test/X/machine/ags_check_system_functional_synth_test-ags_functional_synth_test.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ags_check_system_functional_synth_test_CPPFLAGS) $(CPPFLAGS) $(ags_check_system_functional_synth_test_CFLAGS) $(CFLAGS) -c -o ags/test/X/machine/ags_check_system_functional_synth_test-ags_functional_synth_test.obj `if test -f 'ags/test/X/machine/ags_functional_synth_test.c'; then $(CYGPATH_W) 'ags/test/X/machine/ags_functional_synth_test.c'; else $(CYGPATH_W) '$(srcdir)/ags/test/X/machine/ags_functional_synth_test.c'; fi`
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+	-rm -rf ags/test/X/.libs ags/test/X/_libs
+
+distclean-libtool:
+	-rm -f libtool config.lt
+ags-docs-local: 
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+	test ! -s cscope.files \
+	  || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+	-rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+	-rm -f cscope.out cscope.in.out cscope.po.out cscope.files
+
+distdir: $(DISTFILES)
+	$(am__remove_distdir)
+	test -d "$(distdir)" || mkdir "$(distdir)"
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	-test -n "$(am__skip_mode_fix)" \
+	|| find "$(distdir)" -type d ! -perm -755 \
+		-exec chmod u+rwx,go+rx {} \; -o \
+	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+	|| chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+	$(am__post_remove_distdir)
+
+dist-bzip2: distdir
+	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+	$(am__post_remove_distdir)
+
+dist-lzip: distdir
+	tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+	$(am__post_remove_distdir)
+
+dist-xz: distdir
+	tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+	$(am__post_remove_distdir)
+
+dist-tarZ: distdir
+	@echo WARNING: "Support for distribution archives compressed with" \
+		       "legacy program 'compress' is deprecated." >&2
+	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	$(am__post_remove_distdir)
+
+dist-shar: distdir
+	@echo WARNING: "Support for shar distribution archives is" \
+	               "deprecated." >&2
+	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+	$(am__post_remove_distdir)
+
+dist-zip: distdir
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(am__post_remove_distdir)
+
+dist dist-all:
+	$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+	$(am__post_remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+	case '$(DIST_ARCHIVES)' in \
+	*.tar.gz*) \
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lz*) \
+	  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+	*.tar.xz*) \
+	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+	*.zip*) \
+	  unzip $(distdir).zip ;;\
+	esac
+	chmod -R a-w $(distdir)
+	chmod u+w $(distdir)
+	mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
+	chmod a-w $(distdir)
+	test -d $(distdir)/_build || exit 0; \
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && am__cwd=`pwd` \
+	  && $(am__cd) $(distdir)/_build/sub \
+	  && ../../configure \
+	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	    --srcdir=../.. --prefix="$$dc_install_base" \
+	  && $(MAKE) $(AM_MAKEFLAGS) \
+	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
+	  && $(MAKE) $(AM_MAKEFLAGS) check \
+	  && $(MAKE) $(AM_MAKEFLAGS) install \
+	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+	        distuninstallcheck \
+	  && chmod -R a-w "$$dc_install_base" \
+	  && ({ \
+	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
+	  && rm -rf "$$dc_destdir" \
+	  && $(MAKE) $(AM_MAKEFLAGS) dist \
+	  && rm -rf $(DIST_ARCHIVES) \
+	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+	  && cd "$$am__cwd" \
+	  || exit 1
+	$(am__post_remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+	@test -n '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: trying to run $@ with an empty' \
+	       '$$(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	$(am__cd) '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+	   || { echo "ERROR: files left after uninstall:" ; \
+	        if test -n "$(DESTDIR)"; then \
+	          echo "  (check DESTDIR support)"; \
+	        fi ; \
+	        $(distuninstallcheck_listfiles) ; \
+	        exit 1; } >&2
+distcleancheck: distclean
+	@if test '$(srcdir)' = . ; then \
+	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+	  exit 1 ; \
+	fi
+	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+	  || { echo "ERROR: files left in build directory after distclean:" ; \
+	       $(distcleancheck_listfiles) ; \
+	       exit 1; } >&2
+check-am: all-am
+check: check-am
+all-am: functional-system-tests.mk $(LTLIBRARIES) $(PROGRAMS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-rm -f ags/test/X/$(DEPDIR)/$(am__dirstamp)
+	-rm -f ags/test/X/$(am__dirstamp)
+	-rm -f ags/test/X/machine/$(DEPDIR)/$(am__dirstamp)
+	-rm -f ags/test/X/machine/$(am__dirstamp)
+	-rm -f ags/test/audio/$(DEPDIR)/$(am__dirstamp)
+	-rm -f ags/test/audio/$(am__dirstamp)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+ags-docs: ags-docs-am
+
+ags-docs-am: ags-docs-local
+
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
+	clean-noinstPROGRAMS mostlyclean-am
+
+distclean: distclean-am
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf ags/test/X/$(DEPDIR) ags/test/X/machine/$(DEPDIR) ags/test/audio/$(DEPDIR)
+	-rm -f functional-system-tests.mk
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-hdr distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -rf ags/test/X/$(DEPDIR) ags/test/X/machine/$(DEPDIR) ags/test/audio/$(DEPDIR)
+	-rm -f functional-system-tests.mk
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS ags-docs-am ags-docs-local all all-am \
+	am--refresh check check-am clean clean-cscope clean-generic \
+	clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \
+	cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
+	dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \
+	distcheck distclean distclean-compile distclean-generic \
+	distclean-hdr distclean-libtool distclean-tags distcleancheck \
+	distdir distuninstallcheck dvi dvi-am html html-am info \
+	info-am install install-am install-data install-data-am \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-html install-html-am install-info install-info-am \
+	install-man install-pdf install-pdf-am install-ps \
+	install-ps-am install-strip installcheck installcheck-am \
+	installdirs maintainer-clean maintainer-clean-generic \
+	mostlyclean mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+	uninstall-am
+
+.PRECIOUS: functional-system-tests.mk
+
+
+ags-check-system: $(installcheck_programs)
+	./ags_check_system_functional_audio_test
+	./ags_check_system_functional_machine_add_and_destroy_test
+	./ags_check_system_functional_machine_link_test
+	./ags_check_system_functional_line_member_add_and_destroy_test
+	./ags_check_system_functional_editor_workflow_test
+	./ags_check_system_functional_panel_test
+	./ags_check_system_functional_mixer_test
+	./ags_check_system_functional_drum_test
+	./ags_check_system_functional_matrix_test
+	./ags_check_system_functional_synth_test
+	./ags_check_system_functional_ffplayer_test
+	./ags_check_system_functional_note_edit_test
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/functional-tests.mk b/functional-tests.mk
index d839587..c15f6a1 100644
--- a/functional-tests.mk
+++ b/functional-tests.mk
@@ -1,9 +1,20 @@
-noinst_LTLIBRARIES = libgsequencer_test.la
+libgsequencer_test_LIBADD = @LIBGSEQUENCER_TEST_LIBADD@
+gsequencer_functional_test_LDADD = @GSEQUENCER_FUNCTIONAL_TEST_LDADD@
+
+# libadd and ldadd
+libgsequencer_test_LIBADD += libgsequencer.la libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+
+gsequencer_functional_test_LDADD += libgsequencer.la libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la libgsequencer_test.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+
+check_LTLIBRARIES = libgsequencer_test.la
 
 # functional tests
 check_PROGRAMS += \
 	ags_functional_audio_test \
 	ags_functional_machine_add_and_destroy_test \
+	ags_functional_machine_link_test \
+	ags_functional_line_member_add_and_destroy_test \
+	ags_functional_editor_workflow_test \
 	ags_functional_panel_test \
 	ags_functional_mixer_test \
 	ags_functional_drum_test \
@@ -16,66 +27,87 @@ check_PROGRAMS += \
 libgsequencer_test_la_SOURCES = ags/test/X/gsequencer_setup_util.c ags/test/X/gsequencer_setup_util.h ags/test/X/ags_functional_test_util.c ags/test/X/ags_functional_test_util.h ags/test/X/libgsequencer.h
 libgsequencer_test_la_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
 libgsequencer_test_la_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
-libgsequencer_test_la_LIBADD = libgsequencer.la libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+libgsequencer_test_la_LIBADD = $(libgsequencer_test_LIBADD)
 
 # functional audio test
 ags_functional_audio_test_SOURCES = ags/test/audio/ags_functional_audio_test.c
 ags_functional_audio_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS)
 ags_functional_audio_test_LDFLAGS = -pthread $(LDFLAGS)
-ags_functional_audio_test_LDADD = libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS)
+ags_functional_audio_test_LDADD = $(gsequencer_functional_test_LDADD)
 
 # functional machine add and destroy test
 ags_functional_machine_add_and_destroy_test_SOURCES = ags/test/X/ags_functional_machine_add_and_destroy_test.c
 ags_functional_machine_add_and_destroy_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
 ags_functional_machine_add_and_destroy_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
 ags_functional_machine_add_and_destroy_test_LDFLAGS = -pthread $(LDFLAGS)
-ags_functional_machine_add_and_destroy_test_LDADD = libgsequencer.la libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la libgsequencer_test.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+ags_functional_machine_add_and_destroy_test_LDADD = $(gsequencer_functional_test_LDADD)
+
+# functional machine link test
+ags_functional_machine_link_test_SOURCES = ags/test/X/ags_functional_machine_link_test.c
+ags_functional_machine_link_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_functional_machine_link_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_functional_machine_link_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_functional_machine_link_test_LDADD = $(gsequencer_functional_test_LDADD)
+
+# functional line member add and destroy test
+ags_functional_line_member_add_and_destroy_test_SOURCES = ags/test/X/ags_functional_line_member_add_and_destroy_test.c
+ags_functional_line_member_add_and_destroy_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_functional_line_member_add_and_destroy_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_functional_line_member_add_and_destroy_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_functional_line_member_add_and_destroy_test_LDADD = $(gsequencer_functional_test_LDADD)
+
+# functional editor workflow test
+ags_functional_editor_workflow_test_SOURCES = ags/test/X/ags_functional_editor_workflow_test.c
+ags_functional_editor_workflow_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
+ags_functional_editor_workflow_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
+ags_functional_editor_workflow_test_LDFLAGS = -pthread $(LDFLAGS)
+ags_functional_editor_workflow_test_LDADD = $(gsequencer_functional_test_LDADD)
 
 # functional panel test
 ags_functional_panel_test_SOURCES = ags/test/X/machine/ags_functional_panel_test.c
 ags_functional_panel_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
 ags_functional_panel_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
 ags_functional_panel_test_LDFLAGS = -pthread $(LDFLAGS)
-ags_functional_panel_test_LDADD = libgsequencer.la libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la libgsequencer_test.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+ags_functional_panel_test_LDADD = $(gsequencer_functional_test_LDADD)
 
 # functional mixer test
 ags_functional_mixer_test_SOURCES = ags/test/X/machine/ags_functional_mixer_test.c
 ags_functional_mixer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
 ags_functional_mixer_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
 ags_functional_mixer_test_LDFLAGS = -pthread $(LDFLAGS)
-ags_functional_mixer_test_LDADD = libgsequencer.la libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la libgsequencer_test.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+ags_functional_mixer_test_LDADD = $(gsequencer_functional_test_LDADD)
 
 # functional drum test
 ags_functional_drum_test_SOURCES = ags/test/X/machine/ags_functional_drum_test.c
 ags_functional_drum_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
 ags_functional_drum_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
 ags_functional_drum_test_LDFLAGS = -pthread $(LDFLAGS)
-ags_functional_drum_test_LDADD = libgsequencer.la libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la libgsequencer_test.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+ags_functional_drum_test_LDADD = $(gsequencer_functional_test_LDADD)
 
 # functional matrix test
 ags_functional_matrix_test_SOURCES = ags/test/X/machine/ags_functional_matrix_test.c
 ags_functional_matrix_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
 ags_functional_matrix_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
 ags_functional_matrix_test_LDFLAGS = -pthread $(LDFLAGS)
-ags_functional_matrix_test_LDADD = libgsequencer.la libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la libgsequencer_test.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+ags_functional_matrix_test_LDADD = $(gsequencer_functional_test_LDADD)
 
 # functional synth test
 ags_functional_synth_test_SOURCES = ags/test/X/machine/ags_functional_synth_test.c
 ags_functional_synth_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
 ags_functional_synth_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
 ags_functional_synth_test_LDFLAGS = -pthread $(LDFLAGS)
-ags_functional_synth_test_LDADD = libgsequencer.la libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la libgsequencer_test.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+ags_functional_synth_test_LDADD = $(gsequencer_functional_test_LDADD)
 
 # functional ffplayer test
 ags_functional_ffplayer_test_SOURCES = ags/test/X/machine/ags_functional_ffplayer_test.c
 ags_functional_ffplayer_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
 ags_functional_ffplayer_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
 ags_functional_ffplayer_test_LDFLAGS = -pthread $(LDFLAGS)
-ags_functional_ffplayer_test_LDADD = libgsequencer.la libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la libgsequencer_test.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+ags_functional_ffplayer_test_LDADD = $(gsequencer_functional_test_LDADD)
 
 # functional note edit test
 ags_functional_note_edit_test_SOURCES = ags/test/X/ags_functional_note_edit_test.c
 ags_functional_note_edit_test_CFLAGS = $(CFLAGS) $(LIBAO_CFLAGS) $(LIBASOUND2_CFLAGS) $(LIBXML2_CFLAGS) $(SNDFILE_CFLAGS) $(LIBINSTPATCH_CFLAGS) $(GOBJECT_CFLAGS) $(JACK_CFLAGS) $(FONTCONFIG_CFLAGS) $(GDKPIXBUF_CFLAGS) $(CAIRO_CFLAGS) $(GTK_CFLAGS)
 ags_functional_note_edit_test_CPPFLAGS = -DSRCDIR=\"$(top_srcdir)\"
 ags_functional_note_edit_test_LDFLAGS = -pthread $(LDFLAGS)
-ags_functional_note_edit_test_LDADD = libgsequencer.la libags_audio.la libags_server.la libags_gui.la libags_thread.la libags.la libgsequencer_test.la -lcunit -lrt -lm $(LIBAO_LIBS) $(LIBASOUND2_LIBS) $(LIBXML2_LIBS) $(SNDFILE_LIBS) $(LIBINSTPATCH_LIBS) $(GOBJECT_LIBS) $(JACK_LIBS) $(FONTCONFIG_LIBS) $(GDKPIXBUF_LIBS) $(CAIRO_LIBS) $(GTK_LIBS)
+ags_functional_note_edit_test_LDADD = $(gsequencer_functional_test_LDADD)
diff --git a/libags_audio.sym b/libags_audio.sym
index 6498f12..1670634 100644
--- a/libags_audio.sym
+++ b/libags_audio.sym
@@ -776,6 +776,8 @@ ags_recall_recycling_get_child_source
 ags_recall_recycling_new
 ags_append_audio_get_type
 ags_append_audio_new
+ags_clear_audio_signal_get_type
+ags_clear_audio_signal_new
 ags_apply_synth_get_type
 ags_apply_synth_new
 ags_tic_device_get_type

-- 
gsequencer packaging



More information about the pkg-multimedia-commits mailing list