diff --git a/src/util/optional.hpp b/src/util/optional.hpp
index 0955ea99e720a24e1a02ea4926a838caec8ee2d7..ddf978d67b34a7698c07131b923bff62521633e3 100644
--- a/src/util/optional.hpp
+++ b/src/util/optional.hpp
@@ -332,22 +332,19 @@ struct optional<X&>: detail::optional_base<X&> {
     template <typename T>
     optional(optional<T&>& ot): base(ot.set,ot.ref()) {}
 
-    /*
-    template <
-        typename Y,
-        typename = typename std::enable_if<!detail::is_optional<Y>::value>::type>
-    */
     template <typename Y>
     optional& operator=(Y& y) {
         set = true;
-        ref() = y;
+        data.construct(y);
         return *this;
     }
 
     template <typename Y>
     optional& operator=(optional<Y&>& o) {
         set = o.set;
-        data.construct(o);
+        if (o.set) {
+           data.construct(o.get());
+        }
         return *this;
     }
 };
diff --git a/tests/test_optional.cpp b/tests/test_optional.cpp
index aa13e870d205c19bf2e9a26b9f03b03eaeef866f..6240f53f3c4edf209aba54235ca29d9195fe50bd 100644
--- a/tests/test_optional.cpp
+++ b/tests/test_optional.cpp
@@ -88,6 +88,23 @@ TEST(optionalm,assign_returns) {
     EXPECT_EQ(&a,bp);
 }
 
+TEST(optionalm,assign_reference) {
+    double a=3.0;
+    optional<double &> ar;
+    optional<double &> br;
+
+    ar = a;
+    EXPECT_TRUE(ar);
+    *ar = 5.0;
+    EXPECT_EQ(5.0, a);
+
+    br = ar;
+    EXPECT_TRUE(br);
+
+    *br = 7.0;
+    EXPECT_EQ(7.0, a);
+}
+
 struct nomove {
     int value;
 
@@ -148,7 +165,7 @@ TEST(optionalm,ctor_nocopy) {
     EXPECT_EQ(nocopy(6),b.get());
 }
 
-optional<double> odd_half(int n) {
+static optional<double> odd_half(int n) {
     optional<double> h;
     if (n%2==1) h=n/2.0;
     return h;