diff --git a/src/options/elements/options-editor/add-language-dialog.js b/src/options/elements/options-editor/add-language-dialog.js
new file mode 100644
index 0000000..7b85618
--- /dev/null
+++ b/src/options/elements/options-editor/add-language-dialog.js
@@ -0,0 +1,112 @@
+import {css, html, LitElement} from 'lit';
+
+import {isoLangs} from '../../../common/consts.js';
+import {msg} from '../../../common/i18n.js';
+import {DIALOG_STYLES} from '../../shared/dialog-styles.js';
+import {SHARED_STYLES} from '../../shared/shared-styles.js';
+
+const ALL_LANGUAGES =
+    Object.entries(isoLangs)
+        .map(entry => {
+          let lang = entry[1];
+          lang.code = entry[0];
+          return lang;
+        })
+        .sort((a, b) => a.name < b.name ? -1 : (a.name > b.name ? 1 : 0));
+
+export class AddLanguageDialog extends LitElement {
+  static properties = {
+    languages: {type: Object},
+  };
+
+  static get styles() {
+    return [
+      SHARED_STYLES,
+      DIALOG_STYLES,
+      css`
+        dialog {
+          max-height: 430px;
+          width: 430px;
+        }
+
+        #language_label {
+          font-size: 12px;
+        }
+
+        select {
+          width: 100%;
+        }
+
+        .action_buttons {
+          border-top: none;
+          padding-top: 0;
+        }
+      `,
+    ];
+  }
+
+  constructor() {
+    super();
+    this.addEventListener('show-add-language-dialog', this.showDialog);
+  }
+
+  render() {
+    let languageCodes = Object.values(this.languages ?? {});
+    let languages = ALL_LANGUAGES
+                        .filter(lang => {
+                          return !languageCodes.includes(lang.code);
+                        })
+                        .map(lang => {
+                          return html`
+          <option value=${lang.code}>
+            ${lang?.name} (${lang?.nativeName})
+          </option>
+        `;
+                        });
+
+    return html`
+      <dialog>
+        <div class="scrollable">
+          <h3>${msg('options_addlanguage')}</h3>
+          <div class="content_area">
+            <label id="language_label" for="select_language">
+              ${msg('options_language_label')}
+            </label>
+            <select id="select_language">${languages}</select>
+          </div>
+        </div>
+        <div class="action_buttons">
+          <button @click=${this.closeDialog}>
+            ${msg('options_cancel')}
+          </button>
+          <button @click=${this.addLanguage}>
+            ${msg('options_addlanguage_addbutton')}
+          </button>
+        </div>
+      </dialog>
+    `;
+  }
+
+  showDialog() {
+    let dialog = this.renderRoot.querySelector('dialog');
+    dialog.showModal();
+  }
+
+  closeDialog() {
+    this.renderRoot.querySelector('dialog').close();
+  }
+
+  addLanguage() {
+    let languageCodes = Object.values(this.languages ?? {});
+    let select = this.renderRoot.querySelector('#select_language');
+
+    let newLang = select.value;
+    languageCodes.push(newLang);
+    let translateinto = Object.assign({}, languageCodes);
+    chrome.storage.sync.set({translateinto}, () => {
+      select.selectedIndex = 0;
+      this.closeDialog();
+    });
+  }
+}
+customElements.define('add-language-dialog', AddLanguageDialog);
diff --git a/src/options/elements/options-editor/languages-editor.js b/src/options/elements/options-editor/languages-editor.js
new file mode 100644
index 0000000..7845a65
--- /dev/null
+++ b/src/options/elements/options-editor/languages-editor.js
@@ -0,0 +1,188 @@
+import {css, html, LitElement} from 'lit';
+import {map} from 'lit/directives/map.js';
+
+import {isoLangs} from '../../../common/consts.js';
+import {msg} from '../../../common/i18n.js';
+import {SHARED_STYLES} from '../../shared/shared-styles.js';
+
+import AddLanguageDialog from './add-language-dialog.js';
+
+export class LanguagesEditor extends LitElement {
+  static properties = {
+    languages: {type: Object},
+  };
+
+  static get styles() {
+    return [
+      SHARED_STYLES,
+      css`
+        #languages_container {
+          width: 300px;
+          height: 250px;
+          border: 1px solid #ccc;
+          background-color: #E3F2FD;
+          overflow: auto;
+        }
+
+        #languages {
+          list-style: none;
+          margin: 0;
+          padding: 0;
+        }
+
+        #languages li {
+          display: flex;
+          flex-direction: row;
+          align-items: center;
+          padding: 15px;
+          border-bottom: 1px dashed #ddd;
+          background-color: #EEF7FD;
+          -webkit-user-select: none;
+        }
+
+        #languages li .label {
+          flex-grow: 1;
+        }
+
+        #languages li .delete {
+          font-size: 18px;
+          color: red;
+          padding-left: 2px;
+          margin-left: 2px;
+        }
+
+        #languages li .movebtn {
+          font-size: 16px;
+          color: blue;
+          padding: 0 2px;
+          margin: 0 2px;
+        }
+
+        #languages li :is(.delete, .movebtn) {
+          cursor: pointer;
+          text-align: center;
+        }
+
+        #languages li .movebtn--disabled {
+          color: gray;
+          cursor: not-allowed;
+        }
+
+        #languages_footer {
+          width: 300px;
+          height: 35px;
+          background-color: #fff;
+          border: 1px solid #ccc;
+          border-top: 0;
+        }
+
+        #languages_add {
+          margin-inline-start: 4px;
+          margin-top: 4px;
+        }
+      `,
+    ];
+  }
+
+  constructor() {
+    super();
+    this.addEventListener('show-credits-dialog', this.showDialog);
+    this.sortable = undefined;
+  }
+
+  render() {
+    let languageCodes = Object.values(this.languages ?? {});
+    let languageList = map(languageCodes, (lang, i) => {
+      let moveBtns = [];
+      if (i != 0) {
+        moveBtns.push(html`
+          <button
+              class="notbtn movebtn"
+              @click=${() => this.swapLanguages(i, i - 1)}>
+            ↑
+          </button>
+        `);
+      } else {
+        moveBtns.push(html`
+          <button class="notbtn movebtn movebtn--disabled">
+            ↑
+          </button>
+        `);
+      }
+      if (i != languageCodes.length - 1) {
+        moveBtns.push(html`
+          <button
+              class="notbtn movebtn"
+              @click=${() => this.swapLanguages(i, i + 1)}>
+            ↓
+          </button>
+        `);
+      } else {
+        moveBtns.push(html`
+          <button class="notbtn movebtn movebtn--disabled">
+            ↓
+          </button>
+        `);
+      }
+
+      return html`
+        <li data-id=${lang}>
+          <span class="label">
+            ${isoLangs?.[lang]?.['name']} (${isoLangs?.[lang]?.nativeName})
+          </span>
+          ${moveBtns}
+          <button
+              class="notbtn delete"
+              @click=${() => this.deleteLanguage(lang)}>
+            ×
+          </button>
+        </li>
+      `;
+    });
+
+    return html`
+      <div id="languages_container">
+        <ul id="languages">${languageList}</ul>
+      </div>
+      <div id="languages_footer">
+        <button @click=${this.showAddLanguageDialog} id="languages_add">
+          ${msg('options_addlanguage_addbutton')}
+        </button>
+      </div>
+
+      <add-language-dialog .languages=${this.languages}></add-language-dialog>
+    `;
+  }
+
+  showAddLanguageDialog() {
+    const e = new CustomEvent(
+        'show-add-language-dialog', {bubbles: true, composed: true});
+    this.renderRoot.querySelector('add-language-dialog').dispatchEvent(e);
+  }
+
+  save(languageCodes) {
+    let translateinto = Object.assign({}, languageCodes);
+    chrome.storage.sync.set({translateinto});
+  }
+
+  deleteLanguage(deleteLang) {
+    let languageCodes =
+        Object.values(this.languages ?? {}).filter(lang => lang != deleteLang);
+    this.save(languageCodes);
+  }
+
+  swapLanguages(i, j) {
+    let languageCodes = Object.values(this.languages ?? {});
+    if (i >= languageCodes.length || j >= languageCodes.length || i < 0 ||
+        j < 0) {
+      console.error(
+          'Can\'t swap languages because the indexes are out of the range.');
+      return;
+    }
+    let tmp = languageCodes[j];
+    languageCodes[j] = languageCodes[i];
+    languageCodes[i] = tmp;
+    this.save(languageCodes);
+  }
+}
+customElements.define('languages-editor', LanguagesEditor);
diff --git a/src/options/elements/options-editor/options-editor.js b/src/options/elements/options-editor/options-editor.js
new file mode 100644
index 0000000..9e32dfa
--- /dev/null
+++ b/src/options/elements/options-editor/options-editor.js
@@ -0,0 +1,88 @@
+import {css, html, LitElement} from 'lit';
+import {map} from 'lit/directives/map.js';
+
+import {msg} from '../../../common/i18n.js';
+import {SHARED_STYLES} from '../../shared/shared-styles.js';
+
+import LanguagesEditor from './languages-editor.js';
+
+const TAB_OPTIONS = [
+  // Open in new tab for each translation
+  {
+    value: '',
+    labelMsg: 'options_tabsoption_1',
+    deprecatedValues: [],
+  },
+  // Open in a unique tab
+  {
+    value: 'yep',
+    labelMsg: 'options_tabsoption_2',
+    deprecatedValues: [],
+  },
+  // Open in a popup
+  {
+    value: 'popup',
+    labelMsg: 'options_tabsoption_3',
+    deprecatedValues: ['panel'],
+  },
+];
+
+export class OptionsEditor extends LitElement {
+  static properties = {
+    storageData: {type: Object},
+  };
+
+  static get styles() {
+    return [
+      SHARED_STYLES,
+      css`
+        #otheroptions p {
+          margin-top: 0;
+          margin-bottom: 8px;
+        }
+      `,
+    ];
+  }
+
+  constructor() {
+    super();
+    this.addEventListener('show-credits-dialog', this.showDialog);
+  }
+
+  render() {
+    let currentTabOption = this.storageData?.uniquetab;
+
+    let otherOptions = map(TAB_OPTIONS, (option, i) => {
+      let checked = option.value == currentTabOption ||
+          option.deprecatedValues.includes(currentTabOption);
+      return html`
+            <p>
+              <input type="radio" name="uniquetab" id="uniquetab_${i}"
+                  value="${option?.value}" ?checked="${checked}"
+                  @change="${() => this.changeTabOption(option.value)}">
+              <label for="uniquetab_${i}">${msg(option.labelMsg)}</label></p>
+          `;
+    });
+
+    return html`
+      <languages-editor .languages="${this.storageData?.translateinto}">
+      </languages-editor>
+
+      <h2 id="otheroptionsheader">${msg('options_otheroptionsheader')}</h2>
+
+      <div id="otheroptions">
+        ${otherOptions}
+      </div>
+    `;
+  }
+
+  changeTabOption(value) {
+    chrome.storage.sync.set({uniquetab: value}, function() {
+      var background = chrome.extension.getBackgroundPage();
+
+      background.translator_tab = false;
+      background.translator_window = false;
+    });
+  }
+}
+customElements.define('options-editor', OptionsEditor);
