diff --git a/libevm/VM.h b/libevm/VM.h
index 774667902..e2f4ff5dd 100644
--- a/libevm/VM.h
+++ b/libevm/VM.h
@@ -448,16 +448,18 @@ template <class Ext> dev::bytesConstRef dev::eth::VM::go(Ext& _ext, OnOpFunc con
 			m_stack.pop_back();
 			break;
 		case Instruction::SIGNEXTEND:
-		{
-			unsigned k = m_stack.back();
+			if (m_stack.back() < 31)
+			{
+				unsigned const testBit(m_stack.back() * 8 + 7);
+				u256& number = m_stack[m_stack.size() - 2];
+				u256 mask = ((u256(1) << testBit) - 1);
+				if (boost::multiprecision::bit_test(number, testBit))
+					number |= ~mask;
+				else
+					number &= mask;
+			}
 			m_stack.pop_back();
-			auto& b = m_stack.back();
-			if (k <= 31)
-				if ((b >> (k * 8)) & 0x80)
-					for (int i = 31; i > k; --i)
-						b |= (u256(0xff) << i);
 			break;
-		}
 		case Instruction::SHA3:
 		{
 			unsigned inOff = (unsigned)m_stack.back();
diff --git a/liblll/Assembly.cpp b/liblll/Assembly.cpp
index 5b10138d1..7ad84682f 100644
--- a/liblll/Assembly.cpp
+++ b/liblll/Assembly.cpp
@@ -54,6 +54,7 @@ unsigned Assembly::bytesRequired() const
 			switch (i.m_type)
 			{
 			case Operation:
+			case Tag: // 1 byte for the JUMPDEST
 				ret++;
 				break;
 			case PushString:
@@ -69,7 +70,6 @@ unsigned Assembly::bytesRequired() const
 			case PushData:
 			case PushSub:
 				ret += 1 + br;
-			case Tag:;
 			default:;
 			}
 		if (dev::bytesRequired(ret) <= br)
diff --git a/libsolidity/Parser.cpp b/libsolidity/Parser.cpp
index 1ea413ee9..44f0a54ad 100644
--- a/libsolidity/Parser.cpp
+++ b/libsolidity/Parser.cpp
@@ -266,9 +266,11 @@ ASTPointer<Statement> Parser::parseStatement()
 		// starting from here, all statements must be terminated by a semicolon
 	case Token::CONTINUE:
 		statement = ASTNodeFactory(*this).createNode<Continue>();
+		m_scanner->next();
 		break;
 	case Token::BREAK:
 		statement = ASTNodeFactory(*this).createNode<Break>();
+		m_scanner->next();
 		break;
 	case Token::RETURN:
 	{
diff --git a/test/solidityParser.cpp b/test/solidityParser.cpp
index 025cd74d1..701a6e76c 100644
--- a/test/solidityParser.cpp
+++ b/test/solidityParser.cpp
@@ -185,7 +185,7 @@ BOOST_AUTO_TEST_CASE(while_loop)
 {
 	char const* text = "contract test {\n"
 					   "  function fun(uint256 a) {\n"
-					   "    uint256 x = (1 + 4).member(++67) || true;\n"
+					   "    while (true) { uint256 x = 1; break; continue; } x = 9;\n"
 					   "  }\n"
 					   "}\n";
 	BOOST_CHECK_NO_THROW(parseText(text));