diff --git a/src/box/alter.cc b/src/box/alter.cc
index 9cd4f59aa737ae3e36b1f4641c8eb3f7c7f80a3b..8a2586646438498109ce0221afcee66842669605 100644
--- a/src/box/alter.cc
+++ b/src/box/alter.cc
@@ -507,6 +507,14 @@ ModifySpace::prepare(struct alter_space *alter)
 			  (unsigned) def.id,
 			  "can not change field count on a non-empty space");
 	}
+
+	EngineFactory * factory =
+		alter->old_space->engine->factory;
+	if (def.temporary && !engine_can_be_temporary(factory->id)) {
+		tnt_raise(ClientError, ER_ALTER_SPACE,
+			  (unsigned) def.id,
+			  "space does not support temporary flag");
+	}
 	if (def.temporary != alter->old_space->def.temporary &&
 	    recovery->state != READY_NO_KEYS &&
 	    space_size(alter->old_space) > 0) {
diff --git a/src/box/engine.h b/src/box/engine.h
index 26140d59e32d8143d70fc01e2d18561871a41b33..24d2ef378619ff33095ab11fcd9d0f180c2be2cd 100644
--- a/src/box/engine.h
+++ b/src/box/engine.h
@@ -37,6 +37,7 @@ struct tuple;
 enum engine_flags {
 	ENGINE_TRANSACTIONAL = 1,
 	ENGINE_NO_YIELD = 2,
+	ENGINE_CAN_BE_TEMPORARY = 4
 };
 
 extern uint32_t engine_flags[BOX_ENGINE_MAX];
@@ -189,6 +190,13 @@ engine_no_yield(uint32_t id)
 	return engine_flags[id] & ENGINE_NO_YIELD;
 }
 
+static inline bool
+engine_can_be_temporary(uint32_t id)
+{
+	assert(id);
+	return engine_flags[id] & ENGINE_CAN_BE_TEMPORARY;
+}
+
 static inline uint32_t
 engine_id(Engine *engine)
 {
diff --git a/src/box/engine_memtx.cc b/src/box/engine_memtx.cc
index 23a74253c02656e8c6f164ca8933f1dd11c74a99..ade14477d2fffcd524741bc0e59da8828150497f 100644
--- a/src/box/engine_memtx.cc
+++ b/src/box/engine_memtx.cc
@@ -74,7 +74,8 @@ memtx_recovery_prepare(struct engine_recovery *r)
 MemtxFactory::MemtxFactory()
 	:EngineFactory("memtx")
 {
-	flags = ENGINE_TRANSACTIONAL | ENGINE_NO_YIELD;
+	flags = ENGINE_TRANSACTIONAL | ENGINE_NO_YIELD |
+	        ENGINE_CAN_BE_TEMPORARY;
 	memtx_recovery_prepare(&recovery);
 }
 
diff --git a/src/box/key_def.cc b/src/box/key_def.cc
index 66f4fd4f3c9c7904625b7671edae0a91adfe27f8..42283d80aeb7268d526eb517a7e283ea9d881780 100644
--- a/src/box/key_def.cc
+++ b/src/box/key_def.cc
@@ -224,6 +224,14 @@ space_def_check(struct space_def *def, uint32_t namelen, uint32_t engine_namelen
 			  "space engine name is too long");
 	}
 	identifier_check(def->engine_name);
+
+	if (def->temporary) {
+		EngineFactory *factory = engine_find(def->engine_name);
+		if (! engine_can_be_temporary(factory->id))
+			tnt_raise(ClientError, ER_ALTER_SPACE,
+			         (unsigned) def->id,
+			         "space does not support temporary flag");
+	}
 }
 
 bool
diff --git a/test/box/sophia.result b/test/box/sophia.result
index 7bb5dc44aa6bcb0cc1ebe0ad804d678584dcad91..f0e70014b01224e41166fc92db64ee4fbeffe853 100644
--- a/test/box/sophia.result
+++ b/test/box/sophia.result
@@ -213,6 +213,39 @@ s:select{10000}
 s:drop()
 ---
 ...
+---
+--- gh-456: Sophia: index size() is unsupported
+---
+box.cfg{}
+---
+...
+s = box.schema.create_space('tester',{engine='sophia'})
+---
+...
+s:create_index('sophia_index', {})
+---
+...
+s.index[0]:len() -- exception
+---
+- 4294967295
+...
+box.error()
+---
+- error: SophiaIndex does not support size operation
+...
+s:drop()
+---
+...
+---
+--- gh-436: No error when creating temporary sophia space
+---
+box.cfg{}
+---
+...
+s = box.schema.create_space('tester',{engine='sophia', temporary=true})
+---
+- error: 'Can''t modify space 512: space does not support temporary flag'
+...
 os.execute("rm -rf sophia")
 ---
 - 0
diff --git a/test/box/sophia.test.lua b/test/box/sophia.test.lua
index c57ef7f913e17dd237fc3da8ecfeefbe8c08dbfa..517e8a7cb2c4c310d74c14127e16e3478af7abc1 100644
--- a/test/box/sophia.test.lua
+++ b/test/box/sophia.test.lua
@@ -83,4 +83,11 @@ s.index[0]:len() -- exception
 box.error()
 s:drop()
 
+---
+--- gh-436: No error when creating temporary sophia space
+---
+
+box.cfg{}
+s = box.schema.create_space('tester',{engine='sophia', temporary=true})
+
 os.execute("rm -rf sophia")