diff --git a/configure.ac b/configure.ac
index 22608673b1..5c7811792b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1747,6 +1747,7 @@ tests/a11y/Makefile
tests/css/Makefile
tests/css/parser/Makefile
tests/reftests/Makefile
+tests/visuals/Makefile
docs/Makefile
docs/reference/Makefile
docs/reference/gdk/Makefile
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 7173805e1c..9652b41ff2 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,7 +1,7 @@
## Makefile.am for gtk+/tests
include $(top_srcdir)/Makefile.decl
-SUBDIRS = css reftests a11y
+SUBDIRS = css reftests a11y visuals
AM_CPPFLAGS = \
-I$(top_srcdir) \
diff --git a/tests/visuals/Makefile.am b/tests/visuals/Makefile.am
new file mode 100644
index 0000000000..aec9e3bf12
--- /dev/null
+++ b/tests/visuals/Makefile.am
@@ -0,0 +1,28 @@
+AM_CPPFLAGS = \
+ -I$(top_srcdir) \
+ -I$(top_builddir)/gdk \
+ -I$(top_srcdir)/gdk \
+ $(GTK_DEBUG_FLAGS) \
+ $(GTK_DEP_CFLAGS) \
+ $(GDK_DEP_CFLAGS)
+
+AM_CXXFLAGS = $(AM_CPPFLAGS)
+
+DEPS = \
+ $(top_builddir)/gtk/libgtk-3.la
+
+LDADDS = \
+ $(top_builddir)/gtk/libgtk-3.la \
+ $(top_builddir)/gdk/libgdk-3.la \
+ $(GTK_DEP_LIBS) \
+ -lm
+
+noinst_PROGRAMS = visuals
+
+visuals_DEPENDENCIES = $(TEST_DEPS)
+visuals_LDADD = $(LDADDS)
+visuals_SOURCES = visuals.c
+
+EXTRA_DIST = \
+ inline-toolbar.ui \
+ primary-toolbar.ui
\ No newline at end of file
diff --git a/tests/visuals/inline-toolbar.ui b/tests/visuals/inline-toolbar.ui
new file mode 100644
index 0000000000..5421cbd505
--- /dev/null
+++ b/tests/visuals/inline-toolbar.ui
@@ -0,0 +1,120 @@
+
+
+
+
+
diff --git a/tests/visuals/primary-toolbar.ui b/tests/visuals/primary-toolbar.ui
new file mode 100644
index 0000000000..1517fd7cf6
--- /dev/null
+++ b/tests/visuals/primary-toolbar.ui
@@ -0,0 +1,213 @@
+
+
+
+
+ False
+ 800
+
+
+ 6
+ vertical
+
+
+ True
+ False
+ True
+
+
+
+ False
+ True
+ False
+ False
+ Normal
+ True
+ True
+ edit-find
+
+
+ False
+ True
+
+
+
+
+ False
+ True
+ False
+ False
+ Active
+ True
+ True
+ edit-find
+ True
+
+
+ False
+ True
+
+
+
+
+ False
+ True
+ False
+ False
+ Insensitive
+ True
+ True
+ edit-find
+
+
+ False
+ True
+
+
+
+
+ False
+ True
+ False
+ False
+ Insensitive Active
+ True
+ edit-find
+ True
+ True
+
+
+ False
+ True
+
+
+
+
+ False
+ True
+ False
+ True
+
+
+ True
+ True
+ •
+ Search...
+ edit-find-symbolic
+
+
+
+
+ False
+
+
+
+
+ False
+ True
+ False
+ True
+
+
+ True
+ True
+
+
+
+
+ False
+
+
+
+
+
+
+ True
+ False
+ True
+
+
+
+ False
+ True
+ False
+ Normal
+ True
+ True
+ edit-find-symbolic
+
+
+
+ False
+ True
+
+
+
+
+ False
+ True
+ False
+ Active
+ True
+ True
+ edit-find-symbolic
+ True
+
+
+
+ False
+ True
+
+
+
+
+ False
+ True
+ False
+ False
+ Insensitive
+ True
+ True
+ edit-find-symbolic
+
+
+
+ False
+ True
+
+
+
+
+ False
+ True
+ False
+ False
+ Insensitive Active
+ True
+ edit-find-symbolic
+ True
+ True
+
+
+
+ False
+ True
+
+
+
+
+
+
+
+
diff --git a/tests/visuals/visuals.c b/tests/visuals/visuals.c
new file mode 100644
index 0000000000..df65b5960f
--- /dev/null
+++ b/tests/visuals/visuals.c
@@ -0,0 +1,85 @@
+/* visuals: UI runner for visual GtkBuilder files
+ *
+ * Copyright (C) 2012 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * Author: Cosimo Cecchi
+ *
+ */
+
+#include
+
+static void
+dark_button_toggled_cb (GtkToggleButton *button,
+ gpointer user_data)
+{
+ gboolean active = gtk_toggle_button_get_active (button);
+ GtkSettings *settings = gtk_settings_get_default ();
+
+ g_object_set (settings,
+ "gtk-application-prefer-dark-theme", active,
+ NULL);
+}
+
+static void
+create_dark_popup (GtkWidget *parent)
+{
+ GtkWidget *popup = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ GtkWidget *button = gtk_toggle_button_new_with_label ("Dark");
+
+ gtk_window_set_decorated (GTK_WINDOW (popup), FALSE);
+ gtk_widget_set_size_request (popup, 100, 100);
+ gtk_window_set_resizable (GTK_WINDOW (popup), FALSE);
+
+ g_signal_connect (popup, "delete-event",
+ G_CALLBACK (gtk_true), NULL);
+
+ gtk_container_add (GTK_CONTAINER (popup), button);
+ g_signal_connect (button, "toggled",
+ G_CALLBACK (dark_button_toggled_cb), NULL);
+
+ gtk_window_set_transient_for (GTK_WINDOW (popup), GTK_WINDOW (parent));
+
+ gtk_widget_show_all (popup);
+}
+
+int
+main (int argc, char *argv[])
+{
+ GtkBuilder *builder;
+ GtkWidget *window;
+ const gchar *filename;
+
+ gtk_init (&argc, &argv);
+
+ if (argc > 1)
+ filename = argv[1];
+
+ builder = gtk_builder_new ();
+ gtk_builder_add_from_file (builder, filename, NULL);
+
+ window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
+ g_object_unref (G_OBJECT (builder));
+ g_signal_connect (window, "destroy",
+ G_CALLBACK (gtk_main_quit), NULL);
+ gtk_widget_show_all (window);
+
+ create_dark_popup (window);
+ gtk_main ();
+
+ return 0;
+}