diff --git a/lib/pbxProject.js b/lib/pbxProject.js
index b86fff4..6468a83 100644
--- a/lib/pbxProject.js
+++ b/lib/pbxProject.js
@@ -1872,6 +1872,39 @@
     return localizationVariantGroup;
 };
 
+pbxProject.prototype.addKnownRegion = function (name) {
+  if (!this.pbxProjectSection()[this.getFirstProject()['uuid']]['knownRegions']) {
+    this.pbxProjectSection()[this.getFirstProject()['uuid']]['knownRegions'] = [];
+  }
+  if (!this.hasKnownRegion(name)) {
+    this.pbxProjectSection()[this.getFirstProject()['uuid']]['knownRegions'].push(name);
+  }
+}
+
+pbxProject.prototype.removeKnownRegion = function (name) {
+  var regions = this.pbxProjectSection()[this.getFirstProject()['uuid']]['knownRegions'];
+  if (regions) {
+    for (var i = 0; i < regions.length; i++) {
+      if (regions[i] === name) {
+        regions.splice(i, 1);
+        break;
+      }
+    }
+    this.pbxProjectSection()[this.getFirstProject()['uuid']]['knownRegions'] = regions;
+  }
+}
+
+pbxProject.prototype.hasKnownRegion = function (name) {
+  var regions = this.pbxProjectSection()[this.getFirstProject()['uuid']]['knownRegions'];
+  if (regions) {
+    for (var i in regions) {
+      if (regions[i] === name) {
+        return true;
+      }
+    }
+  }
+  return false;
+}
 
 pbxProject.prototype.getPBXObject = function(name) {
     return this.hash.project.objects[name];
diff --git a/test/knownRegions.js b/test/knownRegions.js
new file mode 100644
index 0000000..8418d58
--- /dev/null
+++ b/test/knownRegions.js
@@ -0,0 +1,76 @@
+var fullProject = require('./fixtures/full-project')
+    fullProjectStr = JSON.stringify(fullProject),
+    pbx = require('../lib/pbxProject'),
+    project = new pbx('.');
+
+function cleanHash() {
+    return JSON.parse(fullProjectStr);
+}
+
+exports.setUp = function (callback) {
+    project.hash = cleanHash();
+    callback();
+}
+
+exports.addKnownRegion = {
+  'should add new region to existing knownRegions': function (test) {
+    var knownRegions = project.pbxProjectSection()[project.getFirstProject()['uuid']]['knownRegions'];
+    test.equal(knownRegions.indexOf('Spanish'), -1);
+
+    project.addKnownRegion('Spanish')
+    knownRegions = project.pbxProjectSection()[project.getFirstProject()['uuid']]['knownRegions'];
+    test.notEqual(knownRegions.indexOf('Spanish'), -1);
+    test.done();
+  },
+
+  'should not add region if it already exists in knownRegions': function (test) {
+    var numberOfRegions = project.pbxProjectSection()[project.getFirstProject()['uuid']]['knownRegions'].length;
+
+    project.addKnownRegion('German');
+    var newNumberOfRegions = project.pbxProjectSection()[project.getFirstProject()['uuid']]['knownRegions'].length;
+    test.equal(numberOfRegions, newNumberOfRegions);
+    test.done();
+  },
+
+  'should create knownRegions array if it does not exist': function (test) {
+    delete project.pbxProjectSection()[project.getFirstProject()['uuid']]['knownRegions'];
+    test.ok(!project.pbxProjectSection()[project.getFirstProject()['uuid']]['knownRegions']);
+
+    project.addKnownRegion('German')
+    test.ok(project.pbxProjectSection()[project.getFirstProject()['uuid']]['knownRegions']);
+    test.done();
+  },
+}
+
+exports.removeKnownRegion = {
+  'should remove named region from knownRegions': function (test) {
+    var knownRegions = project.pbxProjectSection()[project.getFirstProject()['uuid']]['knownRegions'];
+    test.notEqual(knownRegions.indexOf('German'), -1);
+
+    project.removeKnownRegion('German');
+    knownRegions = project.pbxProjectSection()[project.getFirstProject()['uuid']]['knownRegions'];
+    test.equal(knownRegions.indexOf('German'), -1);
+    test.done();
+  },
+
+  'should do nothing if named region does not exist in knownRegions': function (test) {
+    let numberOfRegions = project.pbxProjectSection()[project.getFirstProject()['uuid']]['knownRegions'].length;
+
+    project.removeKnownRegion('Korean');
+    let newNumberOfRegions = project.pbxProjectSection()[project.getFirstProject()['uuid']]['knownRegions'].length;
+    test.equal(numberOfRegions, newNumberOfRegions);
+    test.done();
+  },
+}
+
+exports.hasKnownRegion = {
+  'should return true if named region exists in knownRegions': function (test) {
+    test.ok(project.hasKnownRegion('German'));
+    test.done();
+  },
+
+  'should return false if named region does not exist in knownRegions': function (test) {
+    test.ok(!project.hasKnownRegion('Ducth'));
+    test.done();
+  },
+}
