Index: t3lib/class.t3lib_tceforms_inline.php
===================================================================
--- t3lib/class.t3lib_tceforms_inline.php	(revision 9389)
+++ t3lib/class.t3lib_tceforms_inline.php	(working copy)
@@ -184,9 +184,6 @@ class t3lib_TCEforms_inline {
 		$foreign_table = $config['foreign_table'];
 		t3lib_div::loadTCA($foreign_table);
 
-		if (t3lib_BEfunc::isTableLocalizable($table)) {
-			$language = intval($row[$GLOBALS['TCA'][$table]['ctrl']['languageField']]);
-		}
 		$minitems = t3lib_div::intInRange($config['minitems'],0);
 		$maxitems = t3lib_div::intInRange($config['maxitems'],0);
 		if (!$maxitems)	$maxitems=100000;
@@ -286,23 +283,9 @@ class t3lib_TCEforms_inline {
 			$config['inline']['inlineNewButtonStyle'] = 'display: none;';
 		}
 
-			// Render the level links (create new record, localize all, synchronize):
-		if ($config['appearance']['levelLinksPosition']!='none') {
-			$levelLinks = $this->getLevelInteractionLink('newRecord', $nameObject . self::Structure_Separator . $foreign_table, $config);
-			if ($language>0) {
-					// Add the "Localize all records" link before all child records:
-				if (isset($config['appearance']['showAllLocalizationLink']) && $config['appearance']['showAllLocalizationLink']) {
-					$levelLinks.= $this->getLevelInteractionLink('localize', $nameObject . self::Structure_Separator . $foreign_table, $config);
-				}
-					// Add the "Synchronize with default language" link before all child records:
-				if (isset($config['appearance']['showSynchronizationLink']) && $config['appearance']['showSynchronizationLink']) {
-					$levelLinks.= $this->getLevelInteractionLink('synchronize', $nameObject . self::Structure_Separator . $foreign_table, $config);
-				}
-			}
-		}
-			// Add the level links before all child records:
+			// Render the level links (create new record, localize all, synchronize) before all child records
 		if (in_array($config['appearance']['levelLinksPosition'], array('both', 'top'))) {
-			$item.= $levelLinks;
+			$item .= $this->getLevelLinks($table, $row, $config, 'top');
 		}
 
 		$item .= '<div id="'.$nameObject.'_records">';
@@ -319,7 +302,7 @@ class t3lib_TCEforms_inline {
 
 			// Add the level links after all child records:
 		if (in_array($config['appearance']['levelLinksPosition'], array('both', 'bottom'))) {
-			$item.= $levelLinks;
+			$item .= $this->getLevelLinks($table, $row, $config, 'bottom');
 		}
 
 			// add Drag&Drop functions for sorting to TCEforms::$additionalJS_post
@@ -341,6 +324,37 @@ class t3lib_TCEforms_inline {
 		return $item;
 	}
 
+	/**
+	 * Creates the links above and/or below the inline records
+	 *
+	 * @param	string		$table: The parent table
+	 * @param	array		$row: The current row
+	 * @param	array		$config: The current config
+	 * @param	string		$position: Position of the current set of links, can be top or bottom
+	 * @return	string		The rendered links
+	 */
+	protected function getLevelLinks ($table, &$row, &$config, $position = 'bottom') {
+		$language = 0;
+		$nameObject = $nameObject = $this->inlineNames['object'];
+		if (t3lib_BEfunc::isTableLocalizable($table)) {
+			$language = intval($row[$GLOBALS['TCA'][$table]['ctrl']['languageField']]);
+		}
+
+		$levelLinks = $this->getLevelInteractionLink('newRecord', $nameObject . self::Structure_Separator . $config['foreign_table'], $config, $position);
+		if ($language>0) {
+				// Add the "Localize all records" link before all child records:
+			if (isset($config['appearance']['showAllLocalizationLink']) && $config['appearance']['showAllLocalizationLink']) {
+				$levelLinks.= $this->getLevelInteractionLink('localize', $nameObject . self::Structure_Separator . $config['foreign_table'], $config);
+			}
+				// Add the "Synchronize with default language" link before all child records:
+			if (isset($config['appearance']['showSynchronizationLink']) && $config['appearance']['showSynchronizationLink']) {
+				$levelLinks.= $this->getLevelInteractionLink('synchronize', $nameObject . self::Structure_Separator . $config['foreign_table'], $config);
+			}
+		}
+	    return $levelLinks;
+
+	}
+
 
 	/*******************************************************
 	 *
@@ -912,9 +926,10 @@ class t3lib_TCEforms_inline {
 	 * @param	string		$type: The link type, values are 'newRecord', 'localize' and 'synchronize'.
 	 * @param	string		$objectPrefix: The "path" to the child record to create (e.g. 'data-parentPageId-partenTable-parentUid-parentField-childTable]')
 	 * @param	array		$conf: TCA configuration of the parent(!) field
+	 * @param	string		$position: The position for newly inserted records
 	 * @return	string		The HTML code of the new link, wrapped in a div
 	 */
-	protected function getLevelInteractionLink($type, $objectPrefix, $conf=array()) {
+	protected function getLevelInteractionLink($type, $objectPrefix, $conf=array(), $position = 'bottom') {
 		$nameObject = $this->inlineNames['object'];
 		$attributes = array();
 		switch($type) {
@@ -923,7 +938,7 @@ class t3lib_TCEforms_inline {
 				$icon = 'actions-document-new';
 				$className = 'typo3-newRecordLink';
 				$attributes['class'] = 'inlineNewButton '.$this->inlineData['config'][$nameObject]['md5'];
-				$attributes['onclick'] = "return inline.createNewRecord('$objectPrefix')";
+				$attributes['onclick'] = "return inline.createNewRecord('$objectPrefix', '$position')";
 				if (isset($conf['inline']['inlineNewButtonStyle']) && $conf['inline']['inlineNewButtonStyle']) {
 					$attributes['style'] = $conf['inline']['inlineNewButtonStyle'];
 				}
@@ -1203,12 +1218,29 @@ class t3lib_TCEforms_inline {
 			return $this->getErrorMessageForAJAX('Access denied');
 		}
 
-		if (!$current['uid']) {
+		if (!isset($current['uid']) || in_array($current['uid'], array('top', 'bottom'))) {
+				// default position if nothing else is configured
+			$position = 'bottom';
+				// check if uid was actually a keyword
+			if (isset($config['appearance']['newRecordPosition'])) {
+				switch ($config['appearance']['newRecordPosition']) {
+					case 'top':
+						$position = 'top';
+						break;
+					case 'auto':
+						$position = ($current['uid'] === 'top' ? 'top' : 'bottom');
+						break;
+					case 'bottom':
+					default:
+						break;
+				}
+			}
+
 			$jsonArray = array(
 				'data'	=> $item,
 				'scriptCall' => array(
-					"inline.domAddNewRecord('bottom','".$this->inlineNames['object']."_records','$objectPrefix',json.data);",
-					"inline.memorizeAddRecord('$objectPrefix','".$record['uid']."',null,'$foreignUid');"
+					"inline.domAddNewRecord('$position','" . $this->inlineNames['object'] . "_records', '$objectPrefix', json.data);",
+					"inline.memorizeAddRecord('$objectPrefix', '" . $record['uid'] . "', '$position', '$foreignUid');"
 				)
 			);
 
Index: t3lib/jsfunc.inline.js
===================================================================
--- t3lib/jsfunc.inline.js	(revision 9389)
+++ t3lib/jsfunc.inline.js	(working copy)
@@ -367,6 +367,9 @@ var inline = {
 		if (this.isBelowMax(objectPrefix)) {
 			if (method == 'bottom')
 				new Insertion.Bottom(insertObject, htmlData);
+			else if (method == 'top') {
+				new Insertion.Top(insertObject, htmlData);
+			}
 			else if (method == 'after')
 				new Insertion.After(insertObject, htmlData);
 		}
@@ -550,7 +553,11 @@ var inline = {
 		}
 	},
 
-	memorizeAddRecord: function(objectPrefix, newUid, afterUid, selectedValue) {
+	memorizeAddRecord: function(objectPrefix, newUid, position, selectedValue) {
+			// default value for position
+		if (position === null) {
+			position = 'bottom';
+		}
 		if (this.isBelowMax(objectPrefix)) {
 			var objectName = this.prependFormFieldNames+this.parseObjectId('parts', objectPrefix, 3, 1, true);
 			var formObj = document.getElementsByName(objectName);
@@ -559,15 +566,21 @@ var inline = {
 				var records = new Array();
 				if (formObj[0].value.length) records = formObj[0].value.split(',');
 
-				if (afterUid) {
+				switch (position) {
+					case 'top':
+						records.unshift(newUid);
+						break;
+					case 'bottom':
+						records.push(newUid);
+						break;
+					default:
 					var newRecords = new Array();
 					for (var i=0; i<records.length; i++) {
 						if (records[i].length) newRecords.push(records[i]);
-						if (afterUid == records[i]) newRecords.push(newUid);
+						if (position == records[i]) newRecords.push(newUid);
 					}
 					records = newRecords;
-				} else {
-					records.push(newUid);
+						break;
 				}
 				formObj[0].value = records.join(',');
 			}
