diff --git src/wp-includes/l10n.php src/wp-includes/l10n.php
index a69a718..289e49a 100644
--- src/wp-includes/l10n.php
+++ src/wp-includes/l10n.php
@@ -780,6 +780,50 @@ function load_child_theme_textdomain( $domain, $path = false ) {
 }
 
 /**
+ * Just in time loading of plugin and theme textdomains.
+ *
+ * When a textdomain is encountered for the first time, we try to load the translation file
+ * from wp-content/languages, removing the need to call @see load_plugin_texdomain() or
+ * @see load_theme_texdomain(). Holds a cached list of available .mo files to improve performance.
+ *
+ * @since 4.5.0
+ *
+ * @see get_translations_for_domain()
+ *
+ * @param string $domain Text domain. Unique identifier for retrieving translated strings.
+ * @return bool True when the textdomain is successfully loaded, false otherwise.
+ */
+function load_textdomain_just_in_time( $domain ) {
+	static $cached_mofiles = array();
+
+	if ( empty( $cached_mofiles ) ) {
+		$locations = array(
+			WP_LANG_DIR . '/plugins',
+			WP_LANG_DIR . '/themes',
+		);
+
+		foreach ( $locations as $location ) {
+			foreach ( get_available_languages( $location ) as $file ) {
+				$cached_mofiles[] = "{$location}/{$file}.mo";
+			}
+		}
+	}
+
+	$locale = get_locale();
+	$mofile = "{$domain}-{$locale}.mo";
+
+	if ( in_array( WP_LANG_DIR . '/plugins/' . $mofile, $cached_mofiles ) ) {
+		return load_textdomain( $domain, WP_LANG_DIR . '/plugins/' . $mofile );
+	}
+
+	if ( in_array( WP_LANG_DIR . '/themes/' . $mofile, $cached_mofiles ) ) {
+		return load_textdomain( $domain, WP_LANG_DIR . '/themes/' . $mofile );
+	}
+
+	return false;
+}
+
+/**
  * Return the Translations instance for a text domain.
  *
  * If there isn't one, returns empty Translations instance.
@@ -793,10 +837,10 @@ function load_child_theme_textdomain( $domain, $path = false ) {
  */
 function get_translations_for_domain( $domain ) {
 	global $l10n;
-	if ( !isset( $l10n[$domain] ) ) {
-		$l10n[$domain] = new NOOP_Translations;
+	if ( ! isset( $l10n[ $domain ] ) && ! load_textdomain_just_in_time( $domain ) ) {
+		$l10n[ $domain ] = new NOOP_Translations;
 	}
-	return $l10n[$domain];
+	return $l10n[ $domain ];
 }
 
 /**
diff --git tests/phpunit/data/plugins/internationalized-plugin.php tests/phpunit/data/plugins/internationalized-plugin.php
new file mode 100644
index 0000000..4b56846
--- /dev/null
+++ tests/phpunit/data/plugins/internationalized-plugin.php
@@ -0,0 +1,12 @@
+<?php
+/*
+Plugin Name: Dummy Plugin
+Plugin URI: https://wordpress.org/
+Description: For testing purposes only.
+Version: 1.0.0
+Text Domain: internationalized-plugin
+*/
+
+function i18n_plugin_test() {
+	return __( 'This is a dummy plugin', 'internationalized-plugin' );
+}
diff --git tests/phpunit/data/pomo/internationalized-plugin-de_DE.mo tests/phpunit/data/pomo/internationalized-plugin-de_DE.mo
new file mode 100644
index 0000000..59c285a
Binary files /dev/null and tests/phpunit/data/pomo/internationalized-plugin-de_DE.mo differ
diff --git tests/phpunit/data/pomo/internationalized-plugin-de_DE.po tests/phpunit/data/pomo/internationalized-plugin-de_DE.po
new file mode 100644
index 0000000..f3d7689
--- /dev/null
+++ tests/phpunit/data/pomo/internationalized-plugin-de_DE.po
@@ -0,0 +1,23 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2015-12-31 16:31+0100\n"
+"PO-Revision-Date: 2016-01-03 12:53+0100\n"
+"Last-Translator: Pascal Birchler <pascal@required.ch>\n"
+"Language-Team: \n"
+"Language: de_DE\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.4\n"
+"X-Poedit-Basepath: .\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-KeywordsList: __;_e;_x:1,2c;_ex:1,2c;_n:1,2;_nx:1,2,4c;_n_noop:1,2;"
+"_nx_noop:1,2,3c;esc_attr__;esc_html__;esc_attr_e;esc_html_e;esc_attr_x:1,2c;"
+"esc_html_x:1,2c\n"
+"X-Textdomain-Support: yes\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: internationalized-plugin.php:11
+msgid "This is a dummy plugin"
+msgstr "Das ist ein Dummy Plugin"
diff --git tests/phpunit/data/pomo/internationalized-theme-de_DE.mo tests/phpunit/data/pomo/internationalized-theme-de_DE.mo
new file mode 100644
index 0000000..f0f740e
Binary files /dev/null and tests/phpunit/data/pomo/internationalized-theme-de_DE.mo differ
diff --git tests/phpunit/data/pomo/internationalized-theme-de_DE.po tests/phpunit/data/pomo/internationalized-theme-de_DE.po
new file mode 100644
index 0000000..44a28a6
--- /dev/null
+++ tests/phpunit/data/pomo/internationalized-theme-de_DE.po
@@ -0,0 +1,23 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2015-12-31 16:38+0100\n"
+"PO-Revision-Date: 2016-01-03 12:53+0100\n"
+"Last-Translator: Pascal Birchler <pascal@required.ch>\n"
+"Language-Team: \n"
+"Language: de_DE\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.4\n"
+"X-Poedit-Basepath: .\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-KeywordsList: __;_e;_x:1,2c;_ex:1,2c;_n:1,2;_nx:1,2,4c;_n_noop:1,2;"
+"_nx_noop:1,2,3c;esc_attr__;esc_html__;esc_attr_e;esc_html_e;esc_attr_x:1,2c;"
+"esc_html_x:1,2c\n"
+"X-Textdomain-Support: yes\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: functions.php:7
+msgid "This is a dummy theme"
+msgstr "Das ist ein Dummy Theme"
diff --git tests/phpunit/data/themedir1/internationalized-theme/functions.php tests/phpunit/data/themedir1/internationalized-theme/functions.php
new file mode 100644
index 0000000..d836c4b
--- /dev/null
+++ tests/phpunit/data/themedir1/internationalized-theme/functions.php
@@ -0,0 +1,8 @@
+<?php
+/**
+ * Dummy theme.
+ */
+
+function i18n_theme_test() {
+	return __( 'This is a dummy theme', 'internationalized-theme' );
+}
diff --git tests/phpunit/data/themedir1/internationalized-theme/index.php tests/phpunit/data/themedir1/internationalized-theme/index.php
new file mode 100644
index 0000000..c674182
--- /dev/null
+++ tests/phpunit/data/themedir1/internationalized-theme/index.php
@@ -0,0 +1,4 @@
+<?php
+/**
+ * Dummy theme.
+ */
diff --git tests/phpunit/data/themedir1/internationalized-theme/style.css tests/phpunit/data/themedir1/internationalized-theme/style.css
new file mode 100644
index 0000000..ea472af
--- /dev/null
+++ tests/phpunit/data/themedir1/internationalized-theme/style.css
@@ -0,0 +1,7 @@
+/*
+Theme Name: Internationalized Theme
+Theme URI: https://wordpress.org/
+Description: For testing purposes only.
+Version: 1.0.0
+Text Domain: internationalized-theme
+*/
diff --git tests/phpunit/tests/l10n.php tests/phpunit/tests/l10n.php
index 62357f0..b2611c7 100644
--- tests/phpunit/tests/l10n.php
+++ tests/phpunit/tests/l10n.php
@@ -5,7 +5,6 @@
  * @group i18n
  */
 class Tests_L10n extends WP_UnitTestCase {
-
 	function test_load_unload_textdomain() {
 		$this->assertFalse( is_textdomain_loaded( 'wp-tests-domain' ) );
 		$this->assertFalse( unload_textdomain( 'wp-tests-domain' ) );
@@ -17,6 +16,57 @@ class Tests_L10n extends WP_UnitTestCase {
 		$this->assertFalse( is_textdomain_loaded( 'wp-tests-domain' ) );
 	}
 
+	public function _set_locale_to_german() {
+		return 'de_DE';
+	}
+
+	/**
+	 * @ticket 34114
+	 */
+	public function test_load_plugin_textdomain_just_in_time() {
+		add_filter( 'locale', array( $this, '_set_locale_to_german' ) );
+
+		$this->_copy_file( DIR_TESTDATA . '/pomo/internationalized-plugin-de_DE.mo', WP_CONTENT_DIR . '/languages/plugins' );
+		$this->_copy_file( DIR_TESTDATA . '/pomo/internationalized-plugin-de_DE.po', WP_CONTENT_DIR . '/languages/plugins' );
+		$this->_copy_file( DIR_TESTDATA . '/plugins/internationalized-plugin.php', WP_CONTENT_DIR . '/plugins' );
+
+		activate_plugin( 'internationalized-plugin.php' );
+		$this->assertTrue( is_plugin_active( 'internationalized-plugin.php' ) );
+		$this->assertFalse( is_textdomain_loaded( 'internationalized-plugin' ) );
+
+		$this->assertTrue( function_exists( 'i18n_plugin_test' ) );
+
+		$this->assertSame( 'Das ist ein Dummy Plugin', i18n_plugin_test() );
+		$this->assertTrue( is_textdomain_loaded( 'internationalized-plugin' ) );
+
+		remove_filter( 'locale', array( $this, '_set_locale_to_german' ) );
+	}
+
+	/**
+	 * @ticket 34114
+	 */
+	public function test_load_theme_textdomain_just_in_time() {
+		add_filter( 'locale', array( $this, '_set_locale_to_german' ) );
+
+		$this->_copy_file( DIR_TESTDATA . '/pomo/internationalized-theme-de_DE.mo', WP_CONTENT_DIR . '/languages/themes' );
+		$this->_copy_file( DIR_TESTDATA . '/pomo/internationalized-theme-de_DE.po', WP_CONTENT_DIR . '/languages/themes' );
+		$this->_copy_file( DIR_TESTDATA . '/themedir1/internationalized-theme', WP_CONTENT_DIR . '/themes/internationalized-theme' );
+
+		switch_theme( 'internationalized-theme' );
+		$this->assertSame( 'Internationalized Theme', wp_get_theme()->get( 'Name' ) );
+		$this->assertFalse( is_textdomain_loaded( 'internationalized-theme' ) );
+		$this->assertTrue( validate_current_theme() );
+
+		include_once( get_stylesheet_directory() . '/functions.php' );
+
+		$this->assertTrue( function_exists( 'i18n_theme_test' ) );
+
+		$this->assertSame( 'Das ist ein Dummy Theme', i18n_theme_test() );
+		$this->assertTrue( is_textdomain_loaded( 'internationalized-theme' ) );
+
+		remove_filter( 'locale', array( $this, '_set_locale_to_german' ) );
+	}
+
 	/**
 	 * @ticket 35073
 	 */
@@ -26,4 +76,41 @@ class Tests_L10n extends WP_UnitTestCase {
 		$this->assertEquals( 'first-before-bar|second-before-bar', before_last_bar( 'first-before-bar|second-before-bar|after-last-bar' ) );
 	}
 
+	/**
+	 * Copy file or directory from one place to another.
+	 *
+	 * @access private
+	 *
+	 * @param string $source
+	 * @param string $destination
+	 */
+	private function _copy_file( $source, $destination ) {
+		if ( ! is_dir( $destination ) ) {
+			mkdir( $destination, 0777, true );
+		}
+
+		if ( is_dir( $source ) ) {
+			$files_to_move = array();
+			if ( $source_dir = opendir( $source ) ) {
+				while ( false !== $file = readdir( $source_dir ) ) {
+					if ( 0 !== strpos( $file, '.' ) ) {
+						$files_to_move[] = $file;
+					}
+				}
+			}
+
+			@closedir( $source_dir );
+
+			foreach ( $files_to_move as $file_to_move ) {
+				@unlink( $destination . '/' . $file_to_move );
+				copy( $source . '/' . $file_to_move, $destination . '/' . $file_to_move );
+				chmod( $destination . '/' . $file_to_move, 0777 );
+			}
+		} else {
+			@unlink( $destination . '/' . basename( $source ) );
+			copy( $source, $destination . '/' . basename( $source ) );
+			chmod( $destination . '/' . basename( $source ), 0777 );
+		}
+	}
+
 }
diff --git tests/phpunit/tests/theme/themeDir.php tests/phpunit/tests/theme/themeDir.php
index d5060f8..a6df7ba 100644
--- tests/phpunit/tests/theme/themeDir.php
+++ tests/phpunit/tests/theme/themeDir.php
@@ -159,6 +159,7 @@ class Tests_Theme_ThemeDir extends WP_UnitTestCase {
 			'My Subdir Theme',// theme in a subdirectory should work
 			'Page Template Theme', // theme with page templates for other test code
 			'Theme with Spaces in the Directory',
+			'Internationalized Theme',
 		);
 
 		sort($theme_names);
