diff --git a/exprtk.hpp b/exprtk.hpp
index 94daddd..fc4b057 100644
--- a/exprtk.hpp
+++ b/exprtk.hpp
@@ -6470,7 +6470,7 @@
 
          inline T value() const
          {
-           return *(vector_base_ + static_cast<std::size_t>(details::numeric::to_int64(index_->value())));
+            return *(vector_base_ + static_cast<std::size_t>(details::numeric::to_int64(index_->value())));
          }
 
          inline T& ref()
@@ -10505,17 +10505,6 @@
                   ts.data = &var->ref();
                   ts.type = type_store_t::e_scalar;
                }
-               else if (is_vector_elem_node(arg_list_[i]))
-               {
-                  vector_elem_node_ptr_t var = vector_elem_node_ptr_t(0);
-
-                  if (0 == (var = dynamic_cast<vector_elem_node_ptr_t>(arg_list_[i])))
-                     return false;
-
-                  ts.size = 1;
-                  ts.data = reinterpret_cast<void*>(&var->ref());
-                  ts.type = type_store_t::e_scalar;
-               }
                else
                {
                   ts.size = 1;
@@ -22276,6 +22265,7 @@
          scoped_vec_delete<expression_node_t> svd(*this,vec_initilizer_list);
 
          bool single_value_initialiser = false;
+         bool vec_to_vec_initialiser   = false;
 
          if (!token_is(token_t::e_rsqrbracket))
          {
@@ -22327,12 +22317,44 @@
             }
             else if (!token_is(token_t::e_lcrlbracket))
             {
-               set_error(
-                  make_error(parser_error::e_syntax,
-                             current_token(),
-                             "ERR140 - Expected '{' as part of vector initialiser list"));
+               expression_node_ptr initialiser = error_node();
 
-               return error_node();
+               // Is this a vector to vector assignment and initialisation?
+               if (token_t::e_symbol == current_token().type)
+               {
+                  // Is it a locally defined vector?
+                  scope_element& se = sem_.get_active_element(current_token().value);
+
+                  if (scope_element::e_vector == se.type)
+                  {
+                     if ((initialiser = parse_expression()))
+                        vec_initilizer_list.push_back(initialiser);
+                     else
+                        return error_node();
+                  }
+                  // Are we dealing with a user defined vector?
+                  else if (symtab_store_.is_vector(current_token().value))
+                  {
+                     lodge_symbol(current_token().value,e_st_vector);
+
+                     if ((initialiser = parse_expression()))
+                        vec_initilizer_list.push_back(initialiser);
+                     else
+                        return error_node();
+                  }
+               }
+
+               if (0 == initialiser)
+               {
+                  set_error(
+                     make_error(parser_error::e_syntax,
+                                current_token(),
+                                "ERR140 - Expected '{' as part of vector initialiser list"));
+
+                  return error_node();
+               }
+               else
+                  vec_to_vec_initialiser = true;
             }
             else if (!token_is(token_t::e_rcrlbracket))
             {
@@ -22464,13 +22486,20 @@
 
          lodge_symbol(vec_name,e_st_local_vector);
 
-         expression_node_ptr result =
-                node_allocator_
-                   .allocate<details::vector_assignment_node<T> >(
-                      (*vec_holder)[0],
-                      vec_size,
-                      vec_initilizer_list,
-                      single_value_initialiser);
+         expression_node_ptr result = error_node();
+
+         if (vec_to_vec_initialiser)
+            result = expression_generator_(
+                        details::e_assign,
+                        node_allocator_.allocate<vector_node_t>(vec_holder),
+                        vec_initilizer_list[0]);
+         else
+            result = node_allocator_
+                        .allocate<details::vector_assignment_node<T> >(
+                           (*vec_holder)[0],
+                           vec_size,
+                           vec_initilizer_list,
+                           single_value_initialiser);
 
          svd.delete_ptr = (0 == result);
 
@@ -23386,7 +23415,7 @@
             }
          }
 
-         // Are we dealing with a vector element?
+         // Are we dealing with a vector?
          if (symtab_store_.is_vector(symbol))
          {
             lodge_symbol(symbol,e_st_vector);
diff --git a/readme.txt b/readme.txt
index 4e3ba87..d5a9627 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1166,10 +1166,18 @@
    (e) Initialise the first three (all) values
        var x[3] := { 1, 2, 3 };
 
-   (f) Error as there are too many initialisers
+   (f) Initialise vector from a vector
+       var x[4] := { 1, 2, 3, 4 };
+       var y[3] := x;
+
+   (g) Initialise vector from a smaller vector
+       var x[3] := { 1, 2, 3 };
+       var y[5] := x;   // 1, 2, 3, ??, ??
+
+   (h) Error as there are too many initialisers
        var x[3] := { 1, 2, 3, 4 };
 
-   (g) Error as a vector of size zero is not allowed.
+   (i) Error as a vector of size zero is not allowed.
        var x[0];
 
 
