diff --git a/assets/langs/en.yaml b/assets/langs/en.yaml
index e97e60c0..0db03b12 100644
--- a/assets/langs/en.yaml
+++ b/assets/langs/en.yaml
@@ -64,6 +64,7 @@ settings:
       title: Title
       fromH1: Text Header 1
       fromYaml: From YAML 'title'
+      filename: FileName
     exampleTitle: Pigeons
     exampleBody: I think they might be evil. Even more evil than penguins.
     exampleTag1: Birds
diff --git a/lib/core/note_serializer.dart b/lib/core/note_serializer.dart
index ef6ed3de..739b6b3c 100644
--- a/lib/core/note_serializer.dart
+++ b/lib/core/note_serializer.dart
@@ -4,6 +4,7 @@ import 'package:flutter_emoji/flutter_emoji.dart';
 import 'package:yaml/yaml.dart';
 
 import 'package:gitjournal/core/notes_folder.dart';
+import 'package:gitjournal/settings.dart';
 import 'package:gitjournal/utils/datetime.dart';
 import 'package:gitjournal/utils/logger.dart';
 import 'md_yaml_doc.dart';
@@ -26,7 +27,7 @@ class NoteSerializationSettings {
   bool tagsInString = false;
   bool tagsHaveHash = false;
 
-  bool saveTitleAsH1 = true;
+  SettingsTitle titleSettings = SettingsTitle.Default;
 }
 
 class NoteSerializer implements NoteSerializerInterface {
@@ -36,7 +37,7 @@ class NoteSerializer implements NoteSerializerInterface {
     settings.modifiedKey = config.yamlModifiedKey;
     settings.createdKey = config.yamlCreatedKey;
     settings.tagsKey = config.yamlTagsKey;
-    settings.saveTitleAsH1 = config.saveTitleInH1;
+    settings.titleSettings = config.titleSettings;
   }
 
   NoteSerializer.raw();
@@ -59,7 +60,7 @@ class NoteSerializer implements NoteSerializerInterface {
 
     if (note.title != null) {
       var title = emojiParser.unemojify(note.title.trim());
-      if (settings.saveTitleAsH1) {
+      if (settings.titleSettings == SettingsTitle.InH1) {
         if (title.isNotEmpty) {
           data.body = '# $title\n\n${data.body}';
           data.props.remove(settings.titleKey);
@@ -148,7 +149,7 @@ class NoteSerializer implements NoteSerializerInterface {
       note.title = emojiParser.emojify(title);
 
       propsUsed.add(settings.titleKey);
-      settings.saveTitleAsH1 = false;
+      settings.titleSettings = SettingsTitle.InYaml;
     } else {
       var startsWithH1 = false;
       for (var line in LineSplitter.split(note.body)) {
diff --git a/lib/core/notes_folder_config.dart b/lib/core/notes_folder_config.dart
index b6c3183e..9ab9be09 100644
--- a/lib/core/notes_folder_config.dart
+++ b/lib/core/notes_folder_config.dart
@@ -33,7 +33,7 @@ class NotesFolderConfig extends Equatable {
   final String yamlModifiedKey;
   final String yamlCreatedKey;
   final String yamlTagsKey;
-  final bool saveTitleInH1;
+  final SettingsTitle titleSettings;
 
   final Set<String> inlineTagPrefixes;
   final String imageLocationSpec;
@@ -51,7 +51,7 @@ class NotesFolderConfig extends Equatable {
     @required this.yamlModifiedKey,
     @required this.yamlCreatedKey,
     @required this.yamlTagsKey,
-    @required this.saveTitleInH1,
+    @required this.titleSettings,
     @required this.inlineTagPrefixes,
     @required this.imageLocationSpec,
   });
@@ -69,7 +69,7 @@ class NotesFolderConfig extends Equatable {
         yamlModifiedKey,
         yamlCreatedKey,
         yamlTagsKey,
-        saveTitleInH1,
+        titleSettings,
         inlineTagPrefixes,
         imageLocationSpec,
       ];
@@ -102,7 +102,7 @@ class NotesFolderConfig extends Equatable {
       yamlCreatedKey: settings.yamlCreatedKey,
       yamlModifiedKey: settings.yamlModifiedKey,
       yamlTagsKey: settings.yamlTagsKey,
-      saveTitleInH1: settings.saveTitleInH1,
+      titleSettings: settings.titleSettings,
       inlineTagPrefixes: settings.inlineTagPrefixes,
       imageLocationSpec: settings.imageLocationSpec,
     );
@@ -135,7 +135,7 @@ class NotesFolderConfig extends Equatable {
     settings.yamlCreatedKey = yamlCreatedKey;
     settings.yamlModifiedKey = yamlModifiedKey;
     settings.yamlTagsKey = yamlTagsKey;
-    settings.saveTitleInH1 = saveTitleInH1;
+    settings.titleSettings = titleSettings;
     settings.inlineTagPrefixes = inlineTagPrefixes;
     settings.imageLocationSpec = imageLocationSpec;
     settings.save();
@@ -154,7 +154,7 @@ class NotesFolderConfig extends Equatable {
     String yamlCreatedKey,
     String yamlModifiedKey,
     String yamlTagsKey,
-    bool saveTitleInH1,
+    SettingsTitle titleSettings,
     Set<String> inlineTagPrefixes,
     String imageLocationSpec,
   }) {
@@ -172,7 +172,7 @@ class NotesFolderConfig extends Equatable {
       yamlCreatedKey: yamlCreatedKey ?? this.yamlCreatedKey,
       yamlModifiedKey: yamlModifiedKey ?? this.yamlModifiedKey,
       yamlTagsKey: yamlTagsKey ?? this.yamlTagsKey,
-      saveTitleInH1: saveTitleInH1 ?? this.saveTitleInH1,
+      titleSettings: titleSettings ?? this.titleSettings,
       inlineTagPrefixes: inlineTagPrefixes ?? this.inlineTagPrefixes,
       imageLocationSpec: imageLocationSpec ?? this.imageLocationSpec,
     );
@@ -229,7 +229,7 @@ class NotesFolderConfig extends Equatable {
     var yamlCreatedKey = map['yamlCreatedKey']?.toString();
     var yamlModifiedKey = map['yamlModifiedKey']?.toString();
     var yamlTagsKey = map['yamlTagsKey']?.toString();
-    var saveTitleInH1 = map['saveTitleInH1']?.toString() != "false";
+    var titleSettings = map['titleSettings']?.toString();
 
     // FIXME: What about inlineTagPrefixes?
 
@@ -247,7 +247,7 @@ class NotesFolderConfig extends Equatable {
       yamlCreatedKey: yamlCreatedKey,
       yamlModifiedKey: yamlModifiedKey,
       yamlTagsKey: yamlTagsKey,
-      saveTitleInH1: saveTitleInH1,
+      titleSettings: SettingsTitle.fromInternalString(titleSettings),
       inlineTagPrefixes: {},
       imageLocationSpec: "",
     );
@@ -282,7 +282,7 @@ class NotesFolderConfig extends Equatable {
       'yamlModifiedKey': yamlModifiedKey,
       'yamlCreatedKey': yamlCreatedKey,
       'yamlTagsKey': yamlTagsKey,
-      'saveTitleInH1': saveTitleInH1,
+      'titleSettings': titleSettings.toInternalString(),
     };
 
     var yaml = toYAML(map);
diff --git a/lib/repository.dart b/lib/repository.dart
index a69b44a4..5e0febd2 100644
--- a/lib/repository.dart
+++ b/lib/repository.dart
@@ -66,7 +66,7 @@ class Repository with ChangeNotifier {
     @required SharedPreferences pref,
     @required String id,
   }) async {
-    await migrateSettings(pref, gitBaseDir);
+    await migrateSettings(id, pref, gitBaseDir);
 
     var settings = Settings(id);
     settings.load(pref);
diff --git a/lib/screens/settings_note_metadata.dart b/lib/screens/settings_note_metadata.dart
index 71599215..abd346d9 100644
--- a/lib/screens/settings_note_metadata.dart
+++ b/lib/screens/settings_note_metadata.dart
@@ -82,8 +82,9 @@ class _NoteMetadataSettingsScreenState
           onChanged: (bool newVal) {
             setState(() {
               settings.yamlHeaderEnabled = newVal;
-              if (newVal == false) {
-                settings.saveTitleInH1 = true;
+              var titleInYaml = settings.titleSettings == SettingsTitle.InYaml;
+              if (newVal == false && titleInYaml) {
+                settings.titleSettings = SettingsTitle.Default;
               }
               settings.save();
             });
@@ -138,20 +139,14 @@ class _NoteMetadataSettingsScreenState
         ),
         ListPreference(
           title: tr("settings.noteMetaData.titleMetaData.title"),
-          options: [
-            tr("settings.noteMetaData.titleMetaData.fromH1"),
-            if (settings.yamlHeaderEnabled)
-              tr("settings.noteMetaData.titleMetaData.fromYaml"),
-          ],
-          currentOption: settings.saveTitleInH1
-              ? tr("settings.noteMetaData.titleMetaData.fromH1")
-              : tr("settings.noteMetaData.titleMetaData.fromYaml"),
-          onChange: (String newVal) {
-            setState(() {
-              settings.saveTitleInH1 =
-                  newVal == tr("settings.noteMetaData.titleMetaData.fromH1");
-              settings.save();
-            });
+          options:
+              SettingsTitle.options.map((f) => f.toPublicString()).toList(),
+          currentOption: settings.titleSettings.toPublicString(),
+          onChange: (String publicStr) {
+            var format = SettingsTitle.fromPublicString(publicStr);
+            settings.titleSettings = format;
+            settings.save();
+            setState(() {});
           },
         ),
         ProOverlay(
diff --git a/lib/settings.dart b/lib/settings.dart
index 92abc9cf..8e98fc0e 100644
--- a/lib/settings.dart
+++ b/lib/settings.dart
@@ -32,6 +32,7 @@ class Settings extends ChangeNotifier {
   String yamlCreatedKey = "created";
   String yamlTagsKey = "tags";
   String customMetaData = "";
+  SettingsTitle titleSettings = SettingsTitle.Default;
 
   bool yamlHeaderEnabled = true;
   String defaultNewNoteFolderSpec = "";
@@ -45,7 +46,7 @@ class Settings extends ChangeNotifier {
   SettingsFolderViewType defaultView = SettingsFolderViewType.Default;
   bool showNoteSummary = true;
   String folderViewHeaderType = "TitleGenerated";
-  int version = 2;
+  int version = 3;
 
   SettingsHomeScreen homeScreen = SettingsHomeScreen.Default;
   SettingsTheme theme = SettingsTheme.Default;
@@ -58,7 +59,6 @@ class Settings extends ChangeNotifier {
   String imageLocationSpec = "."; // . means the same folder
 
   bool zenMode = false;
-  bool saveTitleInH1 = true;
 
   bool swipeToDelete = true;
   bool emojiParser = true;
@@ -134,7 +134,8 @@ class Settings extends ChangeNotifier {
         _getString(pref, "imageLocationSpec") ?? imageLocationSpec;
 
     zenMode = _getBool(pref, "zenMode") ?? zenMode;
-    saveTitleInH1 = _getBool(pref, "saveTitleInH1") ?? saveTitleInH1;
+    titleSettings =
+        SettingsTitle.fromInternalString(_getString(pref, "titleSettings"));
     swipeToDelete = _getBool(pref, "swipeToDelete") ?? swipeToDelete;
 
     inlineTagPrefixes =
@@ -239,8 +240,8 @@ class Settings extends ChangeNotifier {
     await _setString(pref, "imageLocationSpec", imageLocationSpec,
         defaultSet.imageLocationSpec);
     await _setBool(pref, "zenMode", zenMode, defaultSet.zenMode);
-    await _setBool(
-        pref, "saveTitleInH1", saveTitleInH1, defaultSet.saveTitleInH1);
+    await _setString(pref, "titleSettings", titleSettings.toInternalString(),
+        defaultSet.titleSettings.toInternalString());
     await _setBool(
         pref, "swipeToDelete", swipeToDelete, defaultSet.swipeToDelete);
     await _setStringSet(pref, "inlineTagPrefixes", inlineTagPrefixes,
@@ -356,7 +357,7 @@ class Settings extends ChangeNotifier {
       'theme': theme.toInternalString(),
       'imageLocationSpec': imageLocationSpec,
       'zenMode': zenMode.toString(),
-      'saveTitleInH1': saveTitleInH1.toString(),
+      'titleSettings': titleSettings.toInternalString(),
       'swipeToDelete': swipeToDelete.toString(),
       'inlineTagPrefixes': inlineTagPrefixes.join(' '),
       'emojiParser': emojiParser.toString(),
@@ -849,3 +850,56 @@ class SettingsTheme {
     return ThemeMode.dark;
   }
 }
+
+class SettingsTitle {
+  static const InYaml =
+      SettingsTitle("settings.noteMetaData.titleMetaData.fromYaml", "yaml");
+  static const InH1 =
+      SettingsTitle("settings.noteMetaData.titleMetaData.fromH1", "h1");
+  static const InFileName =
+      SettingsTitle("settings.noteMetaData.titleMetaData.filename", "filename");
+
+  static const Default = InH1;
+
+  final String _str;
+  final String _publicString;
+  const SettingsTitle(this._publicString, this._str);
+
+  String toInternalString() {
+    return _str;
+  }
+
+  String toPublicString() {
+    return tr(_publicString);
+  }
+
+  static const options = <SettingsTitle>[
+    InH1,
+    InYaml,
+    InFileName,
+  ];
+
+  static SettingsTitle fromInternalString(String str) {
+    for (var opt in options) {
+      if (opt.toInternalString() == str) {
+        return opt;
+      }
+    }
+    return Default;
+  }
+
+  static SettingsTitle fromPublicString(String str) {
+    for (var opt in options) {
+      if (opt.toPublicString() == str) {
+        return opt;
+      }
+    }
+    return Default;
+  }
+
+  @override
+  String toString() {
+    assert(false, "SettingsTitle toString should never be called");
+    return "";
+  }
+}
diff --git a/lib/settings_migrations.dart b/lib/settings_migrations.dart
index cfff53a2..dbbf67bc 100644
--- a/lib/settings_migrations.dart
+++ b/lib/settings_migrations.dart
@@ -7,6 +7,7 @@ import 'package:gitjournal/settings.dart';
 import 'package:gitjournal/utils/logger.dart';
 
 Future<void> migrateSettings(
+  String id,
   SharedPreferences pref,
   String gitBaseDir,
 ) async {
@@ -139,6 +140,16 @@ Future<void> migrateSettings(
     await pref.remove("settingsVersion");
     await pref.setInt(prefix + "settingsVersion", version);
   }
+
+  if (version == 2) {
+    var saveTitleInH1 = pref.getBool(id + '_' + "saveTitleInH1");
+    if (saveTitleInH1 == false) {
+      var key = id + "_" + "titleSettings";
+      await pref.setString(key, "yaml");
+    }
+
+    version = 3;
+  }
 }
 
 Future<void> migrateSshKeys(
diff --git a/test/note_serializer_test.dart b/test/note_serializer_test.dart
index 675cdfb0..d907bc99 100644
--- a/test/note_serializer_test.dart
+++ b/test/note_serializer_test.dart
@@ -18,7 +18,7 @@ void main() {
       var doc = MdYamlDoc(body: "I :heart: you", props: props);
 
       var serializer = NoteSerializer.raw();
-      serializer.settings.saveTitleAsH1 = false;
+      serializer.settings.titleSettings = SettingsTitle.InYaml;
 
       var note = Note(parent, "file-path-not-important");
       serializer.decode(doc, note);
@@ -40,7 +40,7 @@ void main() {
           MdYamlDoc(body: "# Why not :coffee:?\n\nI :heart: you", props: props);
 
       var serializer = NoteSerializer.raw();
-      serializer.settings.saveTitleAsH1 = true;
+      serializer.settings.titleSettings = SettingsTitle.InH1;
 
       var note = Note(parent, "file-path-not-important");
       serializer.decode(doc, note);
@@ -89,7 +89,7 @@ void main() {
       var doc = MdYamlDoc(body: "I :heart: you", props: props);
 
       var serializer = NoteSerializer.raw();
-      serializer.settings.saveTitleAsH1 = true;
+      serializer.settings.titleSettings = SettingsTitle.InH1;
 
       var note = Note(parent, "file-path-not-important");
       serializer.decode(doc, note);
@@ -111,7 +111,7 @@ void main() {
       var doc = MdYamlDoc(body: "body", props: props);
 
       var serializer = NoteSerializer.raw();
-      serializer.settings.saveTitleAsH1 = false;
+      serializer.settings.titleSettings = SettingsTitle.InYaml;
 
       var note = Note(parent, "file-path-not-important");
       serializer.decode(doc, note);
@@ -136,7 +136,7 @@ void main() {
       var doc = MdYamlDoc(body: "body", props: props);
 
       var serializer = NoteSerializer.raw();
-      serializer.settings.saveTitleAsH1 = false;
+      serializer.settings.titleSettings = SettingsTitle.InYaml;
 
       var note = Note(parent, "file-path-not-important");
       serializer.decode(doc, note);
diff --git a/test/notes_folder_config_test.dart b/test/notes_folder_config_test.dart
index c8028613..a3bd4704 100644
--- a/test/notes_folder_config_test.dart
+++ b/test/notes_folder_config_test.dart
@@ -39,7 +39,7 @@ void main() {
         yamlCreatedKey: 'created',
         yamlModifiedKey: 'modified',
         yamlTagsKey: 'tags',
-        saveTitleInH1: true,
+        titleSettings: SettingsTitle.InFileName,
         inlineTagPrefixes: {},
         imageLocationSpec: "",
       );